前言:背景是由于需要实时生成小程序二维码,使用接口B。我们需要获取小程序的access_token,但是获取access_token的请求次数是有限制的(一天2000次),为了避免超出这个限制,后台一般做法是使用redis限时(一般小于7200秒)保存。但是发现时不时出现小程序access_token未超时报失效:40001的错误
接口B文档:wxacode.getUnlimited | 微信开放文档
获取access_token接口文档:auth.getAccessToken | 微信开放文档
一、问题原因
后续找到原因,由于笔者是在2个环境下使用小程序接口,并没有做所谓的中控服务器区分。在测试请求小程序access_token时,正式环境的access_token就会在5分钟内失效,导致5分钟后通过access_token请求小程序接口会报失效:40001,反之亦然。
备注:access_token 的存储与更新
access_token
的存储至少要保留 512 个字符空间;access_token
的有效期目前为 2 个小时,需定时刷新,重复获取将导致上次获取的access_token
失效;- 建议开发者使用中控服务器统一获取和刷新
access_token
,其他业务逻辑服务器所使用的access_token
均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致access_token
覆盖而影响业务; access_token
的有效期通过返回的expires_in
来传达,目前是7200秒之内的值,中控服务器需要根据这个有效时间提前去刷新。在刷新过程中,中控服务器可对外继续输出的老access_token
,此时公众平台后台会保证在5分钟内,新老access_token
都可用,这保证了第三方业务的平滑过渡;access_token
的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token
的接口,这样便于业务服务器在API调用获知access_token
已超时的情况下,可以触发access_token
的刷新流程
二、问题解决
(1)使用中控服务器,说白了就是共用一台服务器的redis来保存缓存。这是最简便可行的方法。
(2)如果无法满足申请中控服务器,则可再申请一个小程序来作为测试使用