核對官方步驟,確認簽名演算法。
- 確認簽名演算法正確,可用 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等)。
原因:微信分享時候會給你當前頁面新增多個引數,你sha1時候必須保證url地址是微信給你加了引數之後的地址,這樣才不會報config:invalid signature.
解決方案:sha1之前url必須是解碼之後的正常的肉眼直接能識別的url,如果你用的是靜態頁面,在你配置wx.config之前,先通過encodeURIComponent(location.href.split('#')[0])把當前url編碼傳遞到後臺,後臺通過decodeURIComponent解碼,核心程式碼如下:
前臺html頁面,編碼傳遞url:
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 });
後臺程式碼:
let url = decodeURIComponent( this.post().url); //重點,解碼前臺傳遞url //當前時間戳 let timestamp = parseInt( new Date().getTime()/1000); //隨機字串 let nonceStr = Math.random().toString(36).substr(2,16);