折騰了幾天發現是(java老哥單詞少了一個字母)
官方建議: invalid signature簽名錯誤。建議按如下順序檢查:
-
1.確認簽名算法正確,可用http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign
頁面工具進行校驗。 -
2.確認config中nonceStr(js中駝峯標準大寫S), timestamp與用以簽名中的對應noncestr, timestamp一致。
-
3.確認url是頁面完整的url(請在當前頁面alert(location.href.split(’#’)[0])確認),包括’http(s)😕/‘部分,以及’?‘後面的GET參數部分,但不包括’#'hash後面的部分。
-
4.確認 config 中的 appid 與用來獲取 jsapi_ticket 的 appid 一致。
-
5.確保一定緩存access_token和jsapi_ticket。
-
6.確保你獲取用來簽名的url是動態獲取的,動態頁面可參見實例代碼中php的實現方式。如果是html的靜態頁面在前端通過ajax將url傳到後臺簽名,前端需要用js獲取當前頁面除去’#‘hash部分的鏈接(可用location.href.split(’#’)[0]獲取,而且需要encodeURIComponent),因爲頁面一旦分享,微信客戶端會在你的鏈接末尾加入其它參數,如果不是動態獲取當前鏈接,將導致分享後的頁面簽名失敗。
個人建議:
- 1.檢查appId和js接口安全域名配置是否正確
- 2.檢查IP白名單設置
- 3.覈查前端和後端appid是否一致
測試經歷
因爲以前做好多次這個,所以一開始以爲很快能解決,無非是appid,js域名問題。結果。。,一星期之久。
開始一直認爲是我前端代碼問題,我自己也認爲url#hash#部分可能有問題。(因爲後臺接口參數通過頁面工具進行校驗,發現正確,最匪夷所思的地方)
所以一直是我在瘋狂嘗試,什麼const url = window.location.href.split(’#’)[0]、const url = window.location.href、Base64.encode(url)、encodeURIComponent(url),未果,冷靜分析,我就懷疑這絕不對不是前端問題,一定是後端或者公衆平臺配置問題。
開始驗證,我直接調用其他項目getConfig接口,以確定bug出在前端還是後端(一個公衆號多個項目公用appid),配置wx.config()測試發現可以使用。確定bug出在後端和公衆平臺
公衆平臺配置:產品覈對一遍,java覈對一遍,我覈對一遍。
於是乎配合後臺,我寫了demo,還是不行,遂建議java老哥完完全全複製另一個項目代碼寫接口,老哥說那個接口就是他寫的,這也是不可能有問題(往往都是以爲不會錯的地方出錯,才最爲致命,我們根本不會去排查他),我也跟着他過了一遍java代碼,確實一樣(此時仍然是舊代碼,一定不能偷懶)。
而後,建議直接擺脫項目從A項目複製代碼,重寫接口給我測試。我說單詞會不會寫錯,或者喫飯誤碰到了多了東西。然後。。。發現java代碼中少寫一個字母。