# Access_token 使用说明

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

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

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

# 注意事项

  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 个字符空间。

# 方案介绍

这里提供一个较为简单的 access_token 存储和使用方案:

  1. 中控服务器定时(建议1小时)调用微信api,刷新access_token,将新的access_token 存入存储;
  2. 其他工作服务器每次调用微信api时从mysql(或其他存储)获取access_token,并可在内存缓存一段时间(建议1分钟);

# 常见问题

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

# 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. invalid access_token

  • 问题描述:调用接口返回形如{"errcode":40014,"errmsg":"invalid access_token rid: 68aeaaxx-7624f9xx-48493cxx"}的报错
  • 原因:使用的 access_token 无效。
  • 解决方案:使用getAccessToken或者getStableAccessToken接口获取新的 access_token, 并且按照上述的「注意事项」进行合理使用。