关于前端微信分享jssdk config:invalid signature 签名错误
这几天刚刚把微信写完,说出来你可能不信,我写个微信分享一起用了2个礼拜。中间各种心酸,一开始后台老大哥帮我把后台签证给写好了,不过不起作用,想叫他在改,但是后面公司有个项目急着上线,没有空,产品催的又急,自己没有办法,开始自己处理后台.
好了,话不多说,正文开始
因为我是前端,就只写关于前端的代码了,后台我也涉及了,在文章的最后我会附上我自己改的后台代码
$(function() {
var conf = "";
var urld = window.location.href.split('#')[0];
$.ajax({
type: "post",
dataType: 'json',
url: '接口链接',
data: {
url: urld
},
success: function(conf) {
console.log(conf);
configWxAPI(conf);
var conf = conf.url;
return conf;
},
error: function(event, XMLHttpRequest, ajaxOptions, thrownError) {
}
});
function configWxAPI(conf) {
wx.config({
debug: false,
appId: "唯一的ID",
timestamp: conf.timestamp,
nonceStr: conf.nonceStr,
signature: conf.signature,
jsApiList: [
'onMenuShareTimeline',
'onMenuShareAppMessage',
'onMenuShareQQ',
'onMenuShareWeibo',
'previewImage',
]
});
wx.ready(function() {
var imgUrl = ""
wx.onMenuShareAppMessage({
title: "标题",
desc: "内容简介",
link: "分享链接",
imgUrl: imgUrl,
success: function() {
},
cancel: function() {
}
});
wx.onMenuShareTimeline({
title: "标题",
desc: "内容简介",
link: "分享链接",
imgUrl: imgUrl,
success: function() {
},
cancel: function() {
}
});
});
wx.error(function(conf) {
console.log(conf);
});
};
});
后台部分的代码
public function getSignPackage() {
if(IS_POST){
if(!I('post.url')) $this->ajaxReturn(array('status'=>0,'msg'=>'请输入当前的URL'));
$jsapiTicket = $this->getJsApiTicket();
//这句代码微信SDK上面没有介绍,但是用来签证的url里面就&后面会自动带有&,所以这里用了php的字符串替换
$url = str_replace("&","&",I('post.url'));
$timestamp = time();
$nonceStr = $this->createNonceStr();
##### 个人理解为,微信的签证是需要随机字符串+url+时间+getticket接口获取的 JSAPI 调用凭证 编码生成的(不知道对不对)
这里的时间还有随机字符串传给和前台的一样,还有url链接是由前台传给后台,在由后台通过这个url进行下面的编码
记住传给后台的url和当前链接要一模一样,记住传给后台的url和当前链接要一模一样,记住传给后台的url和当前链接要一模一样
// 这里参数的顺序要按照 key 值 ASCII 码升序排序
$string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url";
$signature = sha1($string);
$signPackage = array(
"jsapiTicket" =>$jsapiTicket,
"appId" => $this->appId,
"nonceStr" => $nonceStr,
"timestamp" => $timestamp,
"url" => $url,
"signature" => $signature,
"rawString" => $string
);
$this->ajaxReturn($signPackage);
之后就通过微信的验证OK之后,就可以了分享了 或者调用别的微信接口了
可以关注一下