微信分享签名异步加载问题?
29 April 2016
背景
第一次使用时,签名是没问题的,但是分享后,从分享的链接进去,就出现js签名不正确的情况 这个问题一直没办法,相信也困扰了不少同学
分析
-
第一次分享没问题,但从分享的链接进就不能用了
-
对比之下,仅仅是参数上多了一段这个参数而且是微信自带的
?from=singlemessage&isappinstalled=0
-
以为是php与js的urledcodo参与会影响于是,分别打印出当前的网站
前端:
$.get( '/wxsign/getwxconf.html', {url:myUrl}, function(remoteData){ // console.log(remoteData); //向服务器发送请求,获得signature wx.config({ debug: false, // 开启或关闭调试模式,调用的所有api的返回值会在客户端alert出来 appId: remoteData.appId, // 必填,公众号的唯一标识 timestamp: remoteData.timestamp, // 必填,生成签名的时间戳 nonceStr: remoteData.nonceStr, // 必填,生成签名的随机串 signature: remoteData.signature,// 必填,签名,见附录1 jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage','chooseImage','uploadImage','downloadImage'] // 必填,需要使用的JS接口列表 }); // 必须在wx.ready方法下执行 wx.ready(function(){ }); wx.error(function(res){ // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。 // 分享统计 _czc.push(["_trackEvent","分享签名出错",'error', res, myUrl]); }); }, 'json')
后端:
$real_url = 'http://hero.test.com/zhuangbiauto/edit/id/7?from=singlemessage&isappinstalled=0'; //写死当前网址 $js_from_url = urldecode($_GET['url']);// 用js get 方式传过来的 if(strlen($real_url) == strlen($js_from_url) ) echo '我是相等的' else echo '我们不一样哦';
奇迹出现了,原来他们真的是不相等的,但是直接输出是一样的,仅仅是长度不一样!
解决方案
将前端url传输改成POST方式,完美运行了
$.post( '/wxsign/getwxconf.html', {url:myUrl}, function(remoteData){ // console.log(remoteData); //向服务器发送请求,获得signature wx.config({ debug: false, // 开启或关闭调试模式,调用的所有api的返回值会在客户端alert出来 appId: remoteData.appId, // 必填,公众号的唯一标识 timestamp: remoteData.timestamp, // 必填,生成签名的时间戳 nonceStr: remoteData.nonceStr, // 必填,生成签名的随机串 signature: remoteData.signature,// 必填,签名,见附录1 jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage','chooseImage','uploadImage','downloadImage'] // 必填,需要使用的JS接口列表 }); // 必须在wx.ready方法下执行 wx.ready(function(){ setWxData() }); wx.error(function(res){ // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。 // 分享统计 _czc.push(["_trackEvent","分享签名出错",'error', res, myUrl]); }); }, 'json')
总结
- js用get方式传输数据时会进行一定的处理,与服务端的会有一定的差异
- 得到微信分享签名时,不能使用jsonp的方式去得到签名!要传输当前的url过去只能使用post方式