51dev.com IT技术开发者社区

51dev.com 技术开发者社区

微信开发“TOKEN验证失败”根源和解决方法

IT猿阅读(63)2019-12-30 收藏0次评论

引子
微信公众号开启开发者模式时,需要配置“服务器配置”,但在配置这个东西时有很多坑需要注意。

网上解决的问题这里就不再赘述,下面说的是我碰到的问题,同时也叙述了“TOKEN验证失败”的根源问题。

背景
之前,我的公众号一直正常工作,但由于需要更换服务器,就把网站做了迁移,数据也迁移的,但是在修改服务器配置时,始终提示“TOKEN验证失败”。

于是艰难的排查之路开始了。

我的后台是PHP的,于是我在入口文件中加入了客户机访问URL输出的方法,将访问地址写入了日志,并将TOKEN验证也加入了输出。比较诡异的是,每一步的输出都很正常,但始终提示“TOKEN验证失败”。

本着“腾讯这种大公司不会出这个错”的思想,还是将定位问题的重心放到自己的代码中。


开始一步一步排查验证接口。

微信服务器访问开发者服务器的接口形态如下:
http://ip/verifyToken.php?signature=728e5688ce9ed6e00ea498fe8b11e35d5c16bbd7&echostr=8085854468487076604&timestamp=1530682104&nonce=1130401568

微信服务器的唯一要求就是:“原样返回echostr”,这个并不难,甚至在服务器端不做TOKEN验证,直接原样返回echostr就可以通过验证。


于是,就新建了一个php文件,并直接 exit($_GET['echostr']),修改了下服务器配置并提交,验证成功。由此说明,问题还是出现在自己的业务代码中。

继续排查自己的接口。在chrome中,仔细分析verifyToken.php接口的请求和返回。
突然发现Response虽然是字符串,但是字符串输出并不是在第一行。如下图

然后就明白了,必然是代码里哪里输出空行导致最终结果字符串多了些不需要的字符。

于是,有目标的跟踪排查,发现在一个php工具类里,写了php起始标签和结束标签 <?php ?>,而且在结束标签后面还有有空行。删除php结束标签,修改服务器配置到之前的配置,提交,验证通过。

至此,"TOKEN验证失败"的根源也找到了,同时,微信服务器的解析方式也了解了。
微信服务器拿到返回结果后没有做任何操作,直接跟原字符串做对比,并返回对比结果。

总结
所以,不论你后台使用的是什么语言,在出现"TOKEN验证失败"的问题时,首先看看公众平台和服务器代码中的TOKEN配置是否一致,然后不需要考虑其他,直接拿到微信服务器访问开发者服务器的接口,直接分析这个接口就好。这个接口的返回必须与接口访问中的echostr字符串一致,不能有任何其他不必要的字符。
最常见的问题是多了回车符、换行符、服务器文件编码不同多出来的起始符或结束符等。
 

以上就是微信开发“TOKEN验证失败”根源和解决方法的全部内容。

相关内容