简直是个神坑,被坑哭了,因此记录一下!php
把微信token和ticket改用redis存,为了不并发致使token次数被用完,加了锁,为了不之后redis扩展,改用了分布式锁,改完用100并发测试了下,一切正常,perfect。html
因而兴匆匆的上线,访问invalid signature ?前端
确认微信后台各类配置,再上线,invalid signature ?ajax
按官方签名算法确认一遍,仍是 invalid signatureredis
我已经开始不相信本身的代码了,换成官方提供的代码,尼玛 invalid signature算法
后端打印参数,到官网生成signature,发现是一致的,excuse me?后端
打开微信调试工具,提示升级,升级后打开白板,重启白板,MD,全世界都在与我做对???api
而后就已经不想了,看到微信就想吐了...缓存
而后搜了下,说是url要一致,我访问的url就是后端的url,没问题啊,可是仍是微信访问后复制了下url,握草,握草,握草微信
你tm不之不觉的修改了老子的url,老子能不invalid signature吗?
域名还没下来,因此用的IP测试,结果发现IP访问微信会自动跳转并添加一些参数,简直是日了狗了,域名就不存在这个问题
快速解决办法
一、打印参数到官网地址确认签名正确(不一致就按官网步骤找缘由)
二、测试时打印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),由于页面一旦分享,微信客户端会在你的连接末尾加入其它参数,若是不是动态获取当前连接,将致使分享后的页面签名失败。