说一说微信第三方平台的初步集成

微信火了这么久,这两周第一次从一个开发者的角度来研究微信的生态系统而不是应用本身。现在做国内的项目或者产品难免都需要集成微信,其实现在微信背后的支撑平台已经是非常繁杂的了:

  • 公众平台(订阅号、服务号、企业号、小程序)
  • 开放平台(网页应用、移动应用、公众号第三方平台开发)
  • 商户平台 (支付)
  • 服务商平台(代支付)

是不是感觉有点懵,这么多平台如何选择,还是需要根据自己系统的业务来看。我今天说的是开放平台的初步集成。

采用倒序的方式我们一步步来说:

  1. 开放平台需要代公众号实现功能,就必须拿到公众号的accessToken,然后再去使用公众平台接口。那么获取accessToken的过程实际就是公众平台授权给你这个第三方开放平台的过程。相当于他给你了一把打开他家门的钥匙。详见官方文档第5步.

  2. 获得钥匙的过程可是需要一些功夫的,因为老换锁啊,每7200s换一次,所以有位管理员大爷出现了,就是refresh_token,锁换了找大爷拿把新的就行。那么这个管理员大爷怎么找到的呢?是在第一次授权成功后会通过参数返回给你的一个authorization_code这个相当于是地图,能让你第一次在毫无经验的情况下找到第一把钥匙和管理员大爷,也就是官方文档的第4步。

  3. 想要找到地图,给公众平台的管理员发个链接吧https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=xxxx&pre_auth_code=xxxxx&redirect_uri=xxxx,redirect_uri就是把authorization_code给你的入口。例如你写的是redirect_uri=mydomain.com/authrize/callback,那么一旦授权成功,浏览器就会跳转到mydomain.com/authrize/callback?auth_code=xxxx上来,你就可以获取authorization_code这个地图了。

  4. 上一步的链接中有一个pre_auth_code那么这个值怎么来的?是通过api_create_preauthcode这个接口获得的。而调用这个接口又需要component_access_token,这个东东就是一个令牌,你作为第三方平台调用微信任何API都必须有这个令牌,获得这个令牌的办法就是用调用api_component_token通过component_verify_ticket去换。(仔细想一想,其实component_verify_ticket=refresh_token, component_access_token=accessToken

这里面涉及到的变量很多,特别需要注意一些的:

  • component_verify_ticket 这张门票是微信推送,大概每隔十分钟推一次。
  • api_component_token刚才说了是用上面的那张门票换的,但是有保质期,2小时,那么能不能每次要调接口都用门票换一下?人家微信是有每天的接口调用次数限定的,所以建议用个cache缓存起来,到了1小时50分的时候让缓存失效,失效再去call API换。可以用redis的TTL实现。
  • 类比的上文第1步提到的公众号的accessToken也是有保质期的,所以一定要保存好对应的refresh_token,到了1小时50分的时候再去换accessToken

一旦拿到公众号的accessToken,那么就可以像普通公众号的后台服务那样,比如获取粉丝列表啊,推送文章图片啊等等。

PS: 最好采用加解密算法来进行消息的接受和推送。这里面有一个坑:

异常java.security.InvalidKeyException:illegal Key Size的解决方案:在官方网站下载JCE无限制权限策略文件

另外根据官网提示首次验证服务器地址的有效性,必须返回同样的echostr