1. 程式人生 > >微信公眾號開發出現的一個不常見的bug

微信公眾號開發出現的一個不常見的bug

      昨天又遇到微信開發過程中出現了一個隱性問題,雖說已解決了,還是有必要記錄一下,昨天找了網上竟然沒有較為準確的解決方案。

      背景:由於我的伺服器是有一個Apache做後臺動態指令碼解析,前段時間改造了一下,用NGINX做外部埠對映,主要是不同域名要在一臺機子上共用一個https埠,NGINX天生可以做這種分發和反向代理的優勢。所以昨天測試微信的分享和上傳圖片都出現問題,出現“invalid signature” 。

      首先前端打印出簽名的資訊,無異常,然後我就上公眾號後臺也查看了js的域名也沒填錯,一直經受微信的莫名bug含糊提示的痛苦。查了一些網上資料,大多都是一些沒設定的或者大小寫問題之類的,很快我ssh 上去我的伺服器,找到微信的類庫,從底層列印,依然可以簽名出來,並無異常。最後沒辦法就用微信的簽名檢驗介面:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 。後面發現介面簽名後的資訊與我伺服器簽名的資訊不一樣,問題來了,查了sha1是採用自身語言的,而且之前還好好的,那就想了最近的改動,很快鎖定域名及目錄的可用性。由於微信給的sdk是自動獲取請求頭,自動拼接,外部我是請求:https://www.xxx.com/xx/yyy/ss 但是微信sdk獲取的是http://www.xxx.com/xx/yyy/ss ,我試了把協議頭改為https,問題馬上解決了,原來nginx轉發請求的時候是http請求,所以微信自動獲取的自然也是http,而不是前端請求的https了。

以下是網上別人常見的幾個問題:

1、前端wx.config配置中的nonceStr欄位名稱的's'是大寫。但是後臺生成簽名的noncestr欄位的‘s’是小寫,千萬要注意!

2、時間戳(timestamp)值要記住精確到秒,不是毫秒。如果是php 就採用time();

3、生成簽名的url(使用jssdk的頁面地址,這個頁面地址可以在瀏覽器訪問),包含“?”號後面的所有引數,不包含“#”號後面的值。

4、invalid url domain:

js介面安全域名錯誤。可以到微信後臺檢視安全域是否設定正確

5、invalid signature:

要麼是jsapi_ticket錯誤,要麼是簽名演算法問題,要麼是演算法的引數有問題,注意noncestr中的's'是小寫的。如果都是對的。那就是前端傳的url有問題了。我是估計這個問題,只是表面看不出

6、permission denied:

這個問題一般是沒有介面許可權的問題,有的介面是要認證之後才可以使用,當然,測試號不會有這個問題