微信JSSDK提示invalid signature

SkyWay發表於2017-04-09

簡直是個神坑,被坑哭了,所以記錄一下!

把微信token和ticket改用redis存,為了避免併發導致token次數被用完,加了鎖,為了避免以後redis擴充套件,改用了分散式鎖,改完用100併發測試了下,一切正常,perfect。

於是興匆匆的上線,訪問invalid signature ?

確認微信後臺各種配置,再上線,invalid signature ?

按官方簽名演算法確認一遍,還是 invalid signature

我已經開始不相信自己的程式碼了,換成官方提供的程式碼,尼瑪 invalid signature

後端列印引數,到官網生成signature,發現是一致的,excuse me?

開啟微信除錯工具,提示升級,升級後開啟白板,重啟白板,MD,全世界都在與我作對???

然後就已經不想了,看到微信就想吐了…

然後搜了下,說是url要一致,我訪問的url就是後端的url,沒問題啊,但是還是微信訪問後複製了下url,握草,握草,握草

你tm不之不覺的修改了老子的url,老子能不invalid signature嗎?

域名還沒下來,所以用的IP測試,結果發現IP訪問微信會自動跳轉並新增一些引數,簡直是日了狗了,域名就不存在這個問題

快速解決辦法
1、列印引數到官網地址確認簽名正確(不一致就按官網步驟找原因)
2、測試時列印url確保完全一致

官方說明:

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),因為頁面一旦分享,微信客戶端會在你的連結末尾加入其它引數,如果不是動態獲取當前連結,將導致分享後的頁面簽名失敗。

相關文章