评论

公众平台/小程序服务端API的access_token的内部设计

提供access_token的设计方案,便于开发者对access_token使用方式上的理解。

一、背景

对于使用过公众平台的API功能的开发者来说,access_token绝对不会陌生,它就像一个打开家门的钥匙,只要拿着它,就能使用公众平台绝大部分的API功能。因此,对于开发者而言,access_token的使用方式就变得尤其的重要。在日常API接口的运营中,经常遇到各种的疑问:为什么我的access_token突然非法了?为什么刚刚拿到的access_token,用了10min就过期了?对于这些疑问,我们提供出access_token的设计方案,便于开发者对access_token使用方式上的理解。

对于access_token的获取,可以参考公众平台的官方文档:auth.getAccessToken获取Access token


二、access_token的内部设计

2.1 access_token的时效性

众所周知,access_token是通过appid和appsecret来生成的。内部设计的步骤如下:

(1)开发者通过https请求方式: GET https://API.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET,传入appid及apppsecret的参数

(2)公众平台后台会校验appid和哈希(appsecret)是否与存储匹配,若匹配,结合当前时间戳,生成新的access_token。

(3)生成新的access_token的同时,会对老的access_token的过期时间戳更新为当前时间戳。

(4)返回新的access_token给开发者。


这里以图示的方式说明一下,新旧token交替过程:


从上图需要注意的几点:

(1)公众平台存储层只会存储新老两个access_token,意味着假设开发者重复调用3次接口,则会导致最早的access_token立刻失效。

(2)虽然请求新的access_token后,老的access_token过期时间会更新为当前时间,但也不会立刻失效,原理请参考 【2.2 access_token 的逐渐失效性】

(3)出于信息安全考虑,公众平台并不会明文存储appsecret,仅存储appid以及appsecret的哈希值。因此开发者要妥善保管appsecret。当appsecret疑似泄露时,需要及时登录mp.weixin.qq.com重置appsecret。


2.2 access_token 的逐渐失效性

从【access_token的时效性】了解到,当开发者请求获取新的access_token时,老的access_token过期时间会被更新为当前时间,但此时不会立刻失效,因为公众平台会提供【5分钟的新老access_token交替缓冲时间】,因此也称为access_token

的逐渐失效性。

实现的原理是:

1. 由于老的access_token过期时间戳已被刷新,所以在API接口请求期间,带上的access_token解开后,过期时间戳会加上5分钟,然后和当前设备时间进行比对,若超过当前设备时间,判断为失效。

2. 公众平台的设备会保持时钟同步,但设备之间仍然可能会存在1-2分钟的时间差异,所以【5分钟】并非绝对的时间值。当开发者获取到新的access_token后应该尽快切换到新的access_token。


从上图需要注意的几点:

(1)由于存在设备时间同步的差异,可能会导致开发者遇到拿着老的access_token请求API接口,部分请求成功,部分请求失败的情况,建议开发者获取到新的access_token后尽快使用。

(2)通过理解两个图示,对开发者来说,access_token是相当关键且不能乱调的接口,建议开发者统一管理access_token,以免造成多次请求导致access_token失效。


最后一次编辑于  2021-05-11  
点赞 29
收藏
评论

10 个评论

  • 鸿
    鸿
    2022-12-21

    请问不到两小时,access_token就过期,是怎么回事?

    {'errcode': 40001, 'errmsg': 'invalid credential, access_token is invalid or not latest rid: 63a2d1d4-2d90a4b5-65202333'}

    2022-12-21
    赞同 5
    回复
  • 入淮清洛
    入淮清洛
    2021-11-17

    我把最新的access_token 放入了redis中,过期时间设置的是公众号返回的秒数;发送消息请求时,从redis获取access_token,然后返回结果是不是最新的access_token,这才刚刷新没几秒,这是怎么回事

    2021-11-17
    赞同 3
    回复 4
    • 夏定生
      夏定生
      2022-06-01
      你好,有解决这个问题吗
      2022-06-01
      回复
    • 阿泽Aze
      阿泽Aze
      2023-07-19
      微信的token时效性不靠谱,我这边是加入重试的机制,过期就获取最近的token,然后更新到redis的token值
      2023-07-19
      回复
    • 阿泽Aze
      阿泽Aze
      2023-07-19
      微信的token时效性不靠谱,我这边是加入重试的机制,过期就获取最近的token,然后更新到redis的token值
      2023-07-19
      回复
    • Hush_LLL
      Hush_LLL
      11-06
      请问最后是怎么解决的?我也遇到的同样的问题
      11-06
      回复
  • 微信小店技术专员-binnie
    微信小店技术专员-binnie
    2021-06-21

    膜拜

    2021-06-21
    赞同 1
    回复
  • 北斗之光
    北斗之光
    发表于小程序端
    2021-05-11

    2021-05-11
    赞同 1
    回复
  • 何小贤
    何小贤
    2021-05-11

    点赞收藏再阅读大佬文章!

    2021-05-11
    赞同 1
    回复
  • 🇲 🇮 🇳 🇬
    🇲 🇮 🇳 🇬
    2022-06-09

    这样是否也就意味着,当开发环境重新生成token时,会把生产上的token刷成老的,只能触发线上被动刷新流程。考虑到生产和开发环境的隔离,这个token是各自环境下维护的,这时应该怎么处理才好

    2022-06-09
    赞同
    回复 3
    • 发呆
      发呆
      2022-07-11
      同问,我也是这种问题
      2022-07-11
      回复
    • 张三疯
      张三疯
      2022-08-10
      开发环境用测试账号可以解决你的问题吧。为啥 要在开发环境操作线上账号呢?
      2022-08-10
      回复
    • We'll dream it possible
      We'll dream it possible
      2023-01-09
      开发找生产上的接口拿
      2023-01-09
      1
      回复
  • zmx
    zmx
    2021-06-29

    啥时候写开发文档能和写这篇文章一样用心。

    不多最近新增的功能文档确实比以前进步多了

    2021-06-29
    赞同
    回复
  • 集客网络
    集客网络
    2021-05-23

    看明白了 。


    2021-05-23
    赞同
    回复
  • Uyouii
    Uyouii
    发表于移动端
    2021-05-11
    大佬给力!
    2021-05-11
    赞同
    回复
  • 青寒
    青寒
    发表于小程序端
    2021-05-11

    点赞收藏再阅读大佬文章!

    2021-05-11
    赞同
    回复
登录 后发表内容