2

简直是个神坑,被坑哭了,所以记录一下!

把微信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),因为页面一旦分享,微信客户端会在你的链接末尾加入其它参数,如果不是动态获取当前链接,将导致分享后的页面签名失败。

SkyWay
554 声望10 粉丝

Coding changes the world!