问题分析
造成这种报错的原因基于官方的解释是微信端发送了两次相同的请求用户信息时使用同一个code值导致的报错,所以且不论这种设定是否合理,我们解决问题还是得从自身的服务器或者代码找到原因来解决。我的微信公众号的业务流程是通过微信端的菜单请求https://open.weixin.qq.com/connect/oauth2/authorize
获取code值再根据配置的redirect_uri将code值传到后台
在后台用这个code值请求
https://api.weixin.qq.com/sns/oauth2/access_token
来获取当前用户的openid
我分析得出的原因是服务器在后台请求获取openId的速度过慢导致微信端迟迟收不到回应故而重新发送一条,结果用一个相同的code请求两次导致报错
解决思路
网上说的大部分是通过加connect_redirect=1来解决这个问题,但是在我这里不适用(我猜可能是微信端前些年可能有这个参数但是后来给删了因为官方文档上也没有这个参数说明),我的解决思路是在第一次请求时用code设置一个短时间的本地缓存,在第二次请求报40163时根据code去缓存中拿到数据即可。
关键代码
String code = request.getParameter("code");
String openid = "";
Object opendIdCacheObj = CacheManager.getInstance().getObj(code);
//CacheManager是我自己的缓存控制类,其实这一层判断没必要,第二次进入这个方法时缓存里大概率是没有值的,因为只有请求时间大于微信服务器的过期时间才会触发两次请求,这个时候第一次请求还尚未完成,值肯定不在缓存中
if (opendIdCacheObj == null) {
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="