微信開發跳坑指南 “TOKEN驗證失敗”的根源和解決方法

微信公眾號開啟開發者模式時,需要配置“服務器配置”,但在配置這個東西時有很多坑需要注意。

網上解決的問題這里就不再贅述,下面說的是我碰到的問題,同時也敘述了“TOKEN驗證失敗”的根源問題。

背景

之前,我的公眾號一直正常工作,但由于需要更換服務器,就把網站做了遷移,數據也遷移的,但是在修改服務器配置時,始終提示“TOKEN驗證失敗”。于是艱難的排查之路開始了。

我的后臺是PHP的,于是我在入口文件中加入了客戶機訪問URL輸出的方法,將訪問地址寫入了日志,并將TOKEN驗證也加入了輸出。比較詭異的是,每一步的輸出都很正常,但始終提示“TOKEN驗證失敗”。

本著“騰訊這種大公司不會出這個錯”的思想,還是將定位問題的重心放到自己的代碼中。

開始一步一步排查驗證接口。

微信服務器訪問開發者服務器的接口形態如下:

http://ip/verifyToken.php?signature=728e5688ce9ed6e00ea498fe8b11e35d5c16bbd7&
echostr=8085854468487076604×tamp=1530682104&nonce=1130401568

微信服務器的唯一要求就是:“原樣返回echostr”,這個并不難,甚至在服務器端不做TOKEN驗證,直接原樣返回echostr就可以通過驗證。

于是,就新建了一個php文件,并直接 exit($_GET['echostr']),修改了下服務器配置并提交,驗證成功。由此說明,問題還是出現在自己的業務代碼中。

繼續排查自己的接口。在Chrome中,仔細分析verifyToken.php接口的請求和返回。

突然發現Response雖然是字符串,但是字符串輸出并不是在第一行。

然后就明白了,必然是代碼里哪里輸出空行導致最終結果字符串多了些不需要的字符。

于是,有目標的跟蹤排查,發現在一個php工具類里,寫了php起始標簽和結束標簽 ,而且在結束標簽后面還有有空行。刪除php結束標簽,修改服務器配置到之前的配置,提交,驗證通過。

至此,"TOKEN驗證失敗"的根源也找到了,同時,微信服務器的解析方式也了解了。

微信服務器拿到返回結果后沒有做任何操作,直接跟原字符串做對比,并返回對比結果。

總結

所以,不論你后臺使用的是什么語言,在出現"TOKEN驗證失敗"的問題時,首先看看公眾平臺和服務器代碼中的TOKEN配置是否一致,然后不需要考慮其他,直接拿到微信服務器訪問開發者服務器的接口,直接分析這個接口就好。這個接口的返回必須與接口訪問中的echostr字符串一致,不能有任何其他不必要的字符。

最常見的問題是多了回車符、換行符、服務器文件編碼不同多出來的起始符或結束符等。