各种环境下正确应对-微信40001-invalid credential, access_token is invalid or not latest

这个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返回的有效时间。想得多的同学会担心临界问题:到期那一片刻由于应用服务器和微信服务器时间差导致应用服务器认为的有效access_token,微信服务器已经失效了。理论上存在,但后续方法可以处理该种情况。
2、每次从缓存获取access_token,如果未失效,则直接返回;如果已失效则重新获取一次,并缓存后再返回。
3、业务使用时返回access_token失效错误,代码中建立容错机制:强制缓存重取一次access_token并刷新缓存,业务再执行一次。该方式可避免各种原因导致access_token失效。
4、只要用到同一个APPID的access_token,缓存只放到同一个缓存服务器,无论是单项目的开发环境和测试环境同时用,还是多项目同时用。
5、生产环境用到的APPID同开发环境及测试环境的APPID不要用同一个。

这篇文章如果对您有所帮助或者启发的话,帮忙关注或点赞,有问题请评论,必有所复。您的支持是我写作的最大动力!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乐享技术

每一个打赏,都是对我最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值