这个Bug是微信开发常见Bug之一了,意思access_token失效了。网上很多解答都只针对某种情况,笔者解决这个问题也是经历了痛苦的过程,根据实战经验总结供同仁参考。
方案思路
根据微信官方文档:access_token的有效期是7200s,且一天获取access_token不得超过10000次(早期公众号可能只有2000次)。正常解决思路:获取access_token后缓存使用,每隔一定时间再获取新的。解决思路没错,但由于环境复杂性,常常导致access_token失效;环境复杂性导致失效的原因是每从微信获取一次access_token,之前的access_token就失效。大家碰到各种疑难问题均可从这个思路出发查找原因。
方案失效原因
本文就列举各种情况下可能导致的失效:
1、本地缓存access_token:在开发环境下,多人同时开发且程序员各自启动自己应用服务,就会彼此导致失效;在生产环境下,采用分布式部署应用服务,也会导致各自失效。
2、集中式缓存(如redis)access_token,理论上该种缓存下应该没问题,但由于环境或使用问题会有以下集中情况导致失效发生:
2.1 开发环境、测试环境、生产环境各自集中式缓存服务器均是独立的,针对同一个APPID取access_token就会相互导致失效。
2.2 多个团队开发多个项目,用到都是同一个APPID,各自的集中式缓存是独立的,会导致access_token失效
2.3 批量发模板消息(类似耗时长的批量处理任务同样),采用先取access_token,再逐一发送,由于执行时间较长,后期发送的可能是access_token真正过期了导致。正确姿势应该是从缓存去一次发一条。
2.4 微信内部原因导致未到期就失效。
让方案更鲁棒
集中式缓存采用redis服务器,以此为例说明。
1、采用缓存有效期机制,失效时间为获取access_token返回的有效时间。想得多的同学会担心临界问题:到期那一片刻由于应用服务器和微信服务器时间差导致应用服务器认为的有效a

最低0.47元/天 解锁文章
5万+

被折叠的 条评论
为什么被折叠?



