微信自定义分享和支付共享地址接口调用C#版

    原文:http://qibu.net.cn/article/detail/73.html

  我记得老罗说过一句话,不是你太强了,而是别人都阳痿;最近对接这些三方系统,让我对他们程序猿的水平和态度有了新的认识,我吐槽微信文档连着躺枪的就是圆通速递,有兴趣的可以去扒扒这两家文档的签名等式,那叫一个神似啊!

    对了顺便再吐槽一下圆通的消息推送接口,一个参数可以有两种含义哦,文档说好的参数列表可不一定都会传给你哦,解析反序列化什么的不开调试你还真不知道哪儿的问题,爽吧?

    好了,虽然看起来我没精打采的,好像被这两家轮奸得无力反抗,但其实是我没午休了,废话还是那么多,先看看分享自定义的吧:

    1.微信分享自定义 

     (请问你不会正是那个被蹂躏坏了找到这儿来的吧?)

    看过官方DEMO咯(挺像那么回事的有木有)?

    看过别人的Code咯(把坑都给你标出来了)?

    什么?还是invalid signature报错?你丫去官网校验算法和签名的一直了?不一致的话,试试我的配方吧(C#版)

    1.1 C#办后台生成签名:

/// <summary>
/// 生成分享签名参数
/// </summary>
/// <param name="context"></param>
public void Signature(HttpContext context)
{
    var url = context.Request["_url"];
    string jsTicket = WeiXinHelper.GetExistTicket();
    WeiXinHelper.MapX map = WeiXinHelper.getJsSignMap(jsTicket, url);
    //TODO:返回参数
    var result = new { 
        IsSuccess = true, 
        url = url, 
        timestamp = map.timestamp, 
        nonceStr = map.nonceStr, 
        signature = 
        map.signature.ToLower() 
    };
    context.Response.Write(ConvertUtil.JsonSerialize(result));
}

    1.2 getJsSignMap方法:

public static MapX getJsSignMap(string jsapi_ticket, string url)
{
    long ticks = (DateTime.Now.Ticks - new DateTime(1970, 1, 1).Ticks) / 10000000;
    MapX map = new MapX();
    string nonce_str = Guid.NewGuid().ToString().Replace("-", "");
    string timestamp = ticks.ToString();
    string string1 = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonce_str + "&timestamp=" + timestamp + "&url=" + url;
    string signature = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(string1, "SHA1");

    map.url = url;
    map.jsapi_ticket = jsapi_ticket;
    map.nonceStr = nonce_str;
    map.timestamp = timestamp;
    map.signature = signature;
    return map;
}

    Okay,后台能返回签名以及签名时用的参数了吧?赶紧去官网校验一下一不一致。(还不行的话,我要问你师父是谁了)

     1.3 来来来,我们再来看一下前端页面配置:

wx.config({
    debug: false,
    appId: '<%=appId%>',
    timestamp: data.timestamp,
    nonceStr: data.nonceStr,
    signature: data.signature,
    jsApiList: [
        'onMenuShareTimeline',
        'onMenuShareAppMessage',
        'onMenuShareQQ',
        'onMenuShareQZone'
    ]
});

    1.4 Are U Ok 开调(d i ao = diao):

//监听微信的壳
document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
    WeixinJSBridge.on('menu:share:appmessage', function (argv) {
        //分享给朋友
        WeixinJSBridge.invoke('sendAppMessage', sdata, function (res) {
            //TODO回调函数
        });
    });
    WeixinJSBridge.on('menu:share:timeline', function (argv) {
        //分享给朋友圈
        WeixinJSBridge.invoke('shareTimeline', sdata, function (res) {
            //TODO回调函数
        });
    });
    WeixinJSBridge.on('menu:share:qq', function (argv) {
        //分享到QQ
        WeixinJSBridge.invoke('shareQQ', sdata, function (res) {
            //TODO回调函数
        });
    });
    WeixinJSBridge.on('menu:share:QZone', function (argv) {
        //分享给QZone
        WeixinJSBridge.invoke('shareQZone', sdata, function (res) {
            //TODO回调函数
        });
    });
}, false);

    你看,代码就是那么简单,完全没有技术含量嘛 ... ...

    然而,还是invalid signature?这样的话,我要安慰你一下了,先别爆粗淡定,看出我上面的前后端交互的方式了吗?看不出来吧,我先前也是图样图森破,放在aspx.cs里,死活报错,算法校验也是通过的哦,你问我,我还想问微信呢?后来没办法,正如我分享的代码那样,把你的服务端代码放到ashx里去吧,也方便其他地方调用,这就是代码里那个context.Request["_url"]的由来,URL,对,就是这样的,把你的_url=location.href.split("#")[0]从前端get/post过去,生成好签名再一起回来咯!你是否跟我一样从来没怀疑过url呢?

     1.5 所以你的前端配置应该这样放:

$.ajaxSettings.async = false;
$.getJSON("/handler/commonhandler.ashx?action=Signature", { _url: location.href.split("#")[0] }, function (data) {
    if (data.IsSuccess) {
        sdata.link = data.url;
        wx.config({
            debug: false,
            appId: '<%=appId%>',
            timestamp: data.timestamp,
            nonceStr: data.nonceStr,
            signature: data.signature,
            jsApiList: [
                'onMenuShareTimeline',
                'onMenuShareAppMessage',
                'onMenuShareQQ',
                'onMenuShareQZone'
            ]
        });
    }
});

    请注意那个async = false(别怪我没提醒你)如果你非要问我我代码里的sdata是什么,额,说点什么呢?

var sdata = {
    appid: '<%=appId%>',
    title: "",
    desc: "",
    url: null,
    img_url: '',
    img_width: "137",
    img_height: "200",
};

    你说我BB那么多到底是不是你想要的答案,我不会是意淫的吧,来来来,有图有真相:

    159449193087127586.jpg   QQ截图20150915150352.jpg

    嗯,就在这一刻,我深深的感受到服务器运营商提醒我要续费了 ...

    赶紧上个厕所,咱们接着下一篇:

    2. 微信支付共享地址获取

    有了从分享的坑爬出来的经历,是不是觉得今后搞微信的接口都要愉快了很多呢?我告诉你,并没有,快快来一份“微信共享地址接口”打消你的喜悦之情吧!

    什么?你不知道微信地址是什么,大哥,你out了好吗?这么方便的东西,你看看人家有赞三方平台,直接抛弃了本地化的用户收货地址,带着平台上的一帮微商完全依赖着微信的共享地址。有没有诱惑到你?来两张具有说服力的图:

    blob.pngblob.pngblob.png

    看到没有,收货人和手机号可以直接调手机通讯录,收货地址可以先智能定位省市区邮政编码,屌?But这么屌的技能你要如何GET到,官方有文档吗?官方的文档看了是不是言简意赅呢?你看,告诉了你他有多屌,然后好心好意给你看一个让你自己都怀疑自己的SHA1算法的等式,然后有情怀的给你标红了雷区。

    But, 我TM还是不会用啊,怎么用啊,怎么调啊,好像官方已经默认我很屌了,在没有DEMO没有步骤指导的情况下无师自通啊?预知后事如何,请听下回分解 ... ...

    

posted @ 2015-09-15 15:53  穷其一生  阅读(384)  评论(2)    收藏  举报