# access_token 使用说明
access_token 是微信各应用的接口调用票据。不同的应用类型的 access_token 是互相隔离的,票据仅支持调用应用类型的接口。
你可以通过阅读各服务端 API 文档,从目录「基础接口」中,找到 access_token 的相关接口,目前有两个接口可以获取:
- 获取接口调用凭据:getAccessToken
- 获取稳定版接口调用凭据:getStableAccessToken
两者都可以正常获取,推荐使用稳定版接口。
# 1、注意事项
1)access_token 的有效期目前为 2 个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效。建议开发者使用中控服务器统一获取和刷新 access_token,其他业务逻辑服务器所使用的 access_token 均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致 access_token 覆盖而影响业务。
2)目前 access_token 的有效期通过返回的 expires_in 来传达,目前是 7200 秒之内的值。中控服务器需要根据这个有效时间提前去刷新新 access_token。在刷新过程中,中控服务器可对外继续输出的老 access_token,此时公众平台后台会保证在 5 分钟内,新老 access_token 都可用,这保证了第三方业务的平滑过渡。
3)access_token 的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新 access_token 的接口,这样便于业务服务器在 API 调用获知 access_token 已超时的情况下,可以触发 access_token 的刷新流程。
4)access_token 是全局唯一接口调用凭据,调用服务端接口时都需使用 access_token。开发者需要进行妥善保存。
5)access_token 的存储至少要保留 512 个字符空间。
# 2、方案介绍
这里提供一个较为简单的 access_token 存储和使用方案:
1)中控服务器定时(建议 1 小时)调用微信 API,刷新 access_token,将新的 access_token 存入存储。
2)其他工作服务器每次调用微信 API 时从 MySQL(或其他存储)获取 access_token,并可在内存缓存一段时间(建议 1 分钟)。
# 3、常见问题
# 3.1 access_token expired
- 问题描述:调用接口返回形如
{"errcode":42001,"errmsg":"access_token expired rid: 68aeabxx-21ea79xx-3a4424xx"}的报错 - 原因:使用的
access_token已过了有效期,如文档上方提及access_token的有效期目前为 2 小时;并且,重复获取将导致上次获取的access_token失效。 - 解决方案:使用 getAccessToken 或者 getStableAccessToken 接口获取新的
access_token,并且按照上述的「注意事项」进行合理使用。
# 3.2 invalid credential, access_token is invalid or not latest
- 问题描述:调用接口返回形如
{"errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest rid: 68aeabxx-122336xx-2f100cxx"}的报错 - 原因:使用的
access_token无效或不是最新的,通常原因为其他业务逻辑同时也在获取该账号的access_token,导致当前access_token被刷新了无效了,需重新获取。如文档提及重复获取将导致上次获取的access_token失效。 - 解决方案:使用 getAccessToken 或者 getStableAccessToken 接口获取新的
access_token,并且按照上述的「注意事项」进行合理使用。
# 3.3 invalid access_token
- 问题描述:调用接口返回形如
{"errcode":40014,"errmsg":"invalid access_token rid: 68aeaaxx-7624f9xx-48493cxx"}的报错 - 原因:使用的
access_token无效。 - 解决方案:使用 getAccessToken 或者 getStableAccessToken 接口获取新的
access_token,并且按照上述的「注意事项」进行合理使用。