微信公众号开发签名的动态 URL 获取

这是一个大坑。Invalid Signature 坑。

微信web开发者工具

微信web开发者工具(v0.7.0) 和手机微信 (iOS 9.3.2, wechat v6.3.16) 表现并不一样。开发者工具和我想象的一样,用于验证的 url 是客户当前所在的 url,所以你把 location.href.split('#')[0] 发到服务器计算 signature 就行了。例如客户当前浏览 http://demosite.com/post/qwer34545, 你把这个 url 发到你的服务器再用它计算得到 wxconfig 就可以。但是微信的手机端不是这样的。

手机微信

在手机微信的浏览器里,我的网站客户端去微信服务器验证签名的 url 是用户最初进入网站时的 url。例如用户最初点击的是 http://demosite.com/login, 然后用户通过几次点击来到 http://demosite.com/post/qwer34545, 这时必须是把最初的 http://demosite.com/login 发到自己的服务器来计算签名,得到 config,因为手机微信根据这个 http://demosite.com/login 来计算签名的,而不是用户目前所在的 url http://demosite.com/post/qwer34545

所以 微信开发文档 里的 "如果不是动态获取当前链接,将导致分享后的页面签名失败。",应该是 - 如果不是动态获取用户最初点击进入你的网站的链接,将导致分享后的页面签名失败。

好坑

还有微信用的 timestamp 是基于秒的