關於前端微信分享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, //開啓調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端
//打開,參數信息會通過log打出,僅在pc端時纔會打印
appId: "唯一的ID", //必填,公衆號的唯一標識
timestamp: conf.timestamp, //必填,生成簽名的時間戳
nonceStr: conf.nonceStr, //必填,生成簽名的隨機串
signature: conf.signature, //必填,簽名
jsApiList: [
'onMenuShareTimeline',
'onMenuShareAppMessage',
'onMenuShareQQ',
'onMenuShareWeibo',
'previewImage',
] //必填,需要使用的JS接口列表,也就是配置你想使用的調用接口
});
// 微信分享
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);
// config信息驗證失敗會執行error函數,如簽名過期導致驗證失敗,具體錯誤信息可以打開config的debug模式查看,也可以在返回的res參數中查看,對於SPA可以在這裏更新簽名。
});
};
});
後臺部分的代碼
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之後,就可以了分享了 或者調用別的微信接口了