来源: meteor weixin 开发中的坑 – ~ – CSDN博客
近期开发微信中总是会遇到“invalid signature ”这样的错误
总结下文档中没有给出的几个坑:
1 由于不同页面的路径不尽相同,每个页面到要动态传入url到wx.config 中,因此每个页面都要进行config配置,传入要调用的url和wx接口列表,需要注意的是,wx.config() 不能多次配置,多次配置会出现“invalid signature”的错误,而且该错误只在ios设备上出现,安卓设备调用该接口可能是正常的。
2 签名算法中的几个参数和顺序
签名的实现中包含的参数构成了如下的示例
noncestr=Wm3WZYTPz0wzccnW
jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg
timestamp=1414587457
url=http://mp.weixin.qq.com?params=value
附录中给出的常见解决办法是:
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),因为页面一旦分享,微信客户端会在你的链接末尾加入其它参数,如果不是动态获取当前链接,将导致分享后的页面签名失败。
对比这6条,通过签名计算工具得到的签名也是ok的,但是调用wx.getLocation 之类的接口时候提示“invalid signature ”,其中的access_token 已经确保是ok的,根据access_token 获取的JSAPI也是没问题的(ps:写微信开发提示的人给出‘invalid signature’这样的错误提示实在令人蛋疼,既然提示无效,干嘛不给个更加具体的错误,或者给个可以验证access_token/JSAPI的地方来进行一个对比)
最后的最后发现:传入参数的时间戳可能存在问题,后来发现是虚拟机时间和当前时间不一致导致的,遇到这样蛋疼的事情,也只好呵呵呵了,怪不得那么开发者都喜欢直接上mac,节约的时间就是money!
另外一个weixin+react中的坑,签名经常提示无效,最后刷新页面后重新调用就可以了。可能的原因:单页面应用,页面加载时候路径没有发生变化,导致超时签名出现错误。