# access_token 使用说明

access_token 是微信各应用的接口调用票据。不同的应用类型的 access_token 是互相隔离的,票据仅支持调用应用类型的接口。

你可以通过阅读各服务端 API 文档,从目录「基础接口」中,找到 access_token 的相关接口,目前有两个接口可以获取:

两者都可以正常获取,推荐使用稳定版接口。

# 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,并且按照上述的「注意事项」进行合理使用。