经过前面两篇对环境设置,已经可以顺利让springboot项目跑起来了。既然做web app调用第三方api是少不了的。就从最常用的微信api开始。
准备工作:
研究一下微信的开发者手册,主要是微信api的验证逻辑。主要分为认证server和执行业务两个大块。看看鹅厂是怎么设计的这个api其实也挺有收获的。
Server的验证流程主要是微信的api发送带有三个参数(signature,timestamp,nonce)的request给server,server端通过字典排序自己设置的token,微信传入的timestamp和nonce组成一个字符串(先字典排序)。然后对字符串进行加密后与API传入的signature做对比,如果二者相同就给API返回一个echostr(同样由API的request发送)。最终建立了API和server的通信认证。
执行业务这一框,主要是特别是设置了刷新access-token的中间件来定时刷新token(分为定时更新和防止重复获取),从而避免用户短时间内反复调用API获得不一样的access-token,同时避免了恶意反复获取access-token的攻击行为。再一个是设置多个proxy API来实现一个分布式的架构,既可以用不同的proxy响应不同的业务,又可以防止其中某个proxy瘫痪带来的业务无响应问题。
具体可以参看微信官方的手册:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Getting_Started_Guide.html
了解了微信API的交互逻辑,下面就是采坑环节了。
踩坑一:
微信业务采用的API发送CODE,server用APPID+APPSECRET+CODE来换取accesstoken和用户openID的模式。这样地话每次请求accesstoken时候都会有一个code是来自API的。因为我自己偷懒,在微信测试工具的地址栏采用刷新的方式去获取accesscode,结果就是我的请求中包含了使用过的code导致获取acesstoken失败。
采坑二:
获取accesstoken之后获取用户信息失败。这里的原因是使用了错误的地址:
我使用的错误地址:https://api.weixin.qq.com/cgi-bin/user/info
正确的地址:https://api.weixin.qq.com/sns/userinfo
其中错的的地址使用来获取网页授权的accesstoken的,而不是用户信息的accesstoken。
这个地方我看了很多遍官方文档,但是文档上在用户管理中获取用户基本信息这里的确写的还是错误的那个地址。这里不知道是不是官方文档的一个失误。但好在习惯了面向搜索引擎编程,所以找到了解决问题的帖子:https://segmentfault.com/q/1010000003749563
记录一下在采坑过程中看的到其他问题:
1. 获取accesstoken失败或获取成功后获取用户信息失败:
网上大部分遇到这个问题的原因都是项目中有多个模块对accesstoken进行了反复的获取,这一点官方文档里面倒是写的很清楚了,如果重复获取,accesstoken会通过中间件刷新,导致之前的accesstoken失效。
2. 获取用户信息成功后读取失败:
这个对于每个项目就不一样了,取决于读取这个json的方法。JAVA一般采用的是map映射的方法,这时候去检查一下自己的user object,对比一下返回的json串是不是和自己的user object内的member吻合。