在记录之前先先吐槽一下公众平台的文档和demo吧,腾讯这么大个公司写的文档还是认真点嘛,对新手是真的不友好,里面的坑太多了。
1、首先是配置服务器的坑
文档上说开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,然后将token、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
示例代码就已经跟文档描述不符了,有些php代码的$不见了,然后排序也是只有两个参数进行排序,这样写不是误导别人嘛。
然后下载他的demo,我因为用的java进行开发,所以这里只说java的demo。
如图所示,demo上的sha1加密是传的四个参数进行加密。然后问题来了,文档示例写的是用两个参数,文档写的是用三个参数,demo写的是用四个参数,那么到底是用几个参数呢??(辣么大个公司做个东西就不能严谨点么)
经过试验,把getSHA1这个方法重载一下,把encrypt这个参数去掉重新再写个三个参数的方法进行排序加密就能完成URL验证了。(注意不要把直接把getSHA1这个方法改了,复制一下重新写一个方法,以后有个坑还会用到这个)。
2、然后第二个坑来了
验证完URL,服务器配置完毕过后该对公众号进行对接了吧?下面还有个坑等着你呢。因为选了安全模式就是为了服务器能更安全嘛,所以对接口获取的消息来源也得验证一下吧?但是呢!这里的验证跟配服务器时的验证是不一样的,这里用的是四个参数!(就是上面那个getSHA1那四个),公众平台的文档压根就没写安全模式的签名怎么验证,一般人都会以为跟配置服务器的验证一样,我也在这困了大半天之后发现了微信另外一个文档!
微信开放平台里面的开发资源文档,里面详细记录了安全模式加解密的过程。没想到一个平台的功能还得去另外一个平台看文档,我服气的好吧,不知道有多少人被这坑过。
微信开放平台文档链接
再如上图所示,这里表明了事件推送的验证签名是需要四个参数的。
直接用这个方法就行了,我开始配置服务器时没看懂这个方法,以为微信写错了,没想到是demo调用错了,明明是事件推送的加密方法,验证URL调用这个方法干嘛???
行了,吐槽就到这,微信开放平台上的文档写得很清楚,其他的我就不说了。其实这些问题的根源就在于公众平台的文档描述不清楚,直接写清楚配置安全模式要去看另外一个文档不行吗。就不会费这么多事。