微信分享JSSDK-invalid signature簽名錯誤的解決方案

覈對官方步驟,確認簽名算法。javascript

  • 確認簽名算法正確,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 頁面工具進行校驗。
  • 確認config中nonceStr(js中駝峯標準大寫S), timestamp與用以簽名中的對應noncestr, timestamp一致。
  • 確認url是頁面完整的url(請在當前頁面alert(location.href.split('#')[0])確認),包括'http(s)://'部分,以及'?'後面的GET參數部分,但不包括'#'hash後面的部分。
  • 確認 config 中的 appid 與用來獲取 jsapi_ticket 的 appid 一致。
  • 確保必定緩存access_token和jsapi_ticket。
  • 確保你獲取用來簽名的url是動態獲取的,動態頁面可參見實例代碼中php的實現方式。若是是html的靜態頁面在前端經過ajax將url傳到後臺簽名,前端須要用js獲取當前頁面除去'#'hash部分的連接(可用location.href.split('#')[0]獲取,並且須要encodeURIComponent,後臺decodeURIComponent解碼),由於頁面一旦分享,微信客戶端會在你的連接末尾加入其它參數,若是不是動態獲取當前連接,將致使分享後的頁面簽名失敗。

 


 

簽名是正確,上面的步驟還沒能解決你的問題(invalid signature)那就用是url的問題,注意:微信公衆號必須配置了你調試的安全域名(能夠配置二級域名:xxx.com,而不用配置多個a.xxx.com/b.xxx.com等)。php

緣由:微信分享時候會給你當前頁面添加多個參數,你sha1時候必須保證url地址是微信給你加了參數以後的地址,這樣纔不會報config:invalid signature.html

解決方案:sha1以前url必須是解碼以後的正常的肉眼直接能識別的url,若是你用的是靜態頁面,在你配置wx.config以前,先經過encodeURIComponent(location.href.split('#')[0])把當前url編碼傳遞到後臺,後臺經過decodeURIComponent解碼,核心代碼以下:前端

前臺html頁面,編碼傳遞url:java

 

jQuery.post("/xxx", {"url": encodeURIComponent(window.location.href.split('#')[0]),"t": new Date().getTime()}, function (result) {
    if (result.errno != 0) {
        alert("您當前的網絡不穩定請稍後再試!");
        return;
    }
    var shareUrl = result.data.url;
    wx.config({
        debug: true, // 開啓調試模式,調用的全部api的返回值會在客戶端alert出來,若要查看傳入的參數,能夠在pc端打開,參數信息會經過log打出,僅在pc端時纔會打印。
        appId: 'xxx', // 必填,公衆號的惟一標識
        timestamp: result.data.timestamp, // 必填,生成簽名的時間戳
        nonceStr: result.data.nonceStr, // 必填,生成簽名的隨機串
        signature: result.data.signature,// 必填,簽名,見附錄1
        jsApiList: ['onMenuShareAppMessage','onMenuShareTimeline','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,須要使用的JS接口列表,全部JS接口列表見附錄2
    });

 

後臺代碼:ajax

let url = decodeURIComponent( this.post().url);  //重點,解碼前臺傳遞url
//當前時間戳
let timestamp = parseInt( new Date().getTime()/1000);
//隨機字符串
let nonceStr = Math.random().toString(36).substr(2,16);
相關文章
相關標籤/搜索