微信自定义分享和支付共享地址接口调用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 + "×tamp=" + 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那么多到底是不是你想要的答案,我不会是意淫的吧,来来来,有图有真相:
嗯,就在这一刻,我深深的感受到服务器运营商提醒我要续费了 ...
赶紧上个厕所,咱们接着下一篇:
2. 微信支付共享地址获取
有了从分享的坑爬出来的经历,是不是觉得今后搞微信的接口都要愉快了很多呢?我告诉你,并没有,快快来一份“微信共享地址接口”打消你的喜悦之情吧!
什么?你不知道微信地址是什么,大哥,你out了好吗?这么方便的东西,你看看人家有赞三方平台,直接抛弃了本地化的用户收货地址,带着平台上的一帮微商完全依赖着微信的共享地址。有没有诱惑到你?来两张具有说服力的图:


看到没有,收货人和手机号可以直接调手机通讯录,收货地址可以先智能定位省市区邮政编码,屌?But这么屌的技能你要如何GET到,官方有文档吗?官方的文档看了是不是言简意赅呢?你看,告诉了你他有多屌,然后好心好意给你看一个让你自己都怀疑自己的SHA1算法的等式,然后有情怀的给你标红了雷区。
But, 我TM还是不会用啊,怎么用啊,怎么调啊,好像官方已经默认我很屌了,在没有DEMO没有步骤指导的情况下无师自通啊?预知后事如何,请听下回分解 ... ...

浙公网安备 33010602011771号