V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lyxxxh2
V2EX  ›  PHP

记一次微信 access_token invalid credential, access_token is invalid or not latest

  •  2
     
  •   lyxxxh2 · 1 天前 · 785 次点击

    场景

    多项目使用微信公众号access_token,每个项目的access_token不共享,就会:

    {"errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest, could get access_token by getStableAccessToken, more details at https://mmbizurl.cn/s/JtxxFh33r rid: "}
    

    原因

    "重复获取将导致上次获取的 access_token 失效。建议开发者使用中控服务器统一获取和刷新 access_token"

    文档:https://developers.weixin.qq.com/doc/oplatform/developers/dev/AccessToken.html

    工作这么多年,还没仔细看过微信文档。

    解决

    搞中控服务器麻烦,也懒着换成 reids 。

    扩展包用的: w7corp/easywechat

    默认用文件的缓存,保证用同个文件就行。

    $app->getAccessToken()->getKey()
    $app->getAccessToken()->getToken()
    
    // 不同版本,方法不一样
    $app->base->getAccessToken()->getTokenKey()
    $app->base->getAccessToken()->getToken()
    

    一开始我以为扩展包的坑,一个个排查,还去对比缓存文件的 token

    最后一看微信文档,我擦 结案了。

    6 条回复    2025-10-30 22:12:26 +08:00
    jackleo120
        1
    jackleo120  
       23 小时 21 分钟前   ❤️ 1
    之前注意过这个问题,不过是因为测试环境和正式环境他们的 appid 都是同一个。。
    后来仔细查阅文档,发现微信文档是提供解决办法的,不需要中控服务器,就是直接 5 分钟内刷一下就可以了。
    https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-access-token/getStableAccessToken.html
    根据以上特性,为减少其他开发者构建中控服务的开发成本,在普通调用模式下,平台建议开发者将每次获取的 access_token 在本地建立中心化存储使用,无须考虑并行调用接口时导致意外情况发生,仅须保证至少每 5 分钟发起一次调用并覆盖本地存储。同时,该方案也支持各业务独立部署使用,即无须中心化存储也可以保证服务正常运行;
    bankroft
        2
    bankroft  
       22 小时 5 分钟前   ❤️ 1
    可以使用 stable access token
    jstony
        3
    jstony  
       11 小时 17 分钟前
    本地自建了一个 token 代理,各个系统都从代理获取当前可用 token ,代理会检查 token 有效期,接近过期会自动更新,已经用了很多年。
    lyxxxh2
        4
    lyxxxh2  
    OP
       8 小时 53 分钟前
    @jackleo120
    你这个更简单,我才知道有这个。
    lyxxxh2
        5
    lyxxxh2  
    OP
       5 小时 3 分钟前
    w7corp/[email protected] 还不支持'use_stable_access_token' => true`,注意升级。
    https://github.com/w7corp/easywechat/blob/6.4.0/src/OfficialAccount/AccessToken.php
    jackleo120
        6
    jackleo120  
       12 分钟前
    @lyxxxh2 直接手动造一个请求就可以了。他 5 分钟内的 token 都可以用的,可以平滑度过的。还不用管测试还是正式环境。。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2809 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 14:25 · PVG 22:25 · LAX 07:25 · JFK 10:25
    ♥ Do have faith in what you're doing.