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

1 天前
 lyxxxh2

场景

多项目使用微信公众号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

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

811 次点击
所在节点    PHP
6 条回复
jackleo120
1 天前
之前注意过这个问题,不过是因为测试环境和正式环境他们的 appid 都是同一个。。
后来仔细查阅文档,发现微信文档是提供解决办法的,不需要中控服务器,就是直接 5 分钟内刷一下就可以了。
https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-access-token/getStableAccessToken.html
根据以上特性,为减少其他开发者构建中控服务的开发成本,在普通调用模式下,平台建议开发者将每次获取的 access_token 在本地建立中心化存储使用,无须考虑并行调用接口时导致意外情况发生,仅须保证至少每 5 分钟发起一次调用并覆盖本地存储。同时,该方案也支持各业务独立部署使用,即无须中心化存储也可以保证服务正常运行;
bankroft
1 天前
可以使用 stable access token
jstony
14 小时 9 分钟前
本地自建了一个 token 代理,各个系统都从代理获取当前可用 token ,代理会检查 token 有效期,接近过期会自动更新,已经用了很多年。
lyxxxh2
11 小时 45 分钟前
@jackleo120
你这个更简单,我才知道有这个。
lyxxxh2
7 小时 55 分钟前
w7corp/easywechat@6.4.0 还不支持'use_stable_access_token' => true`,注意升级。
https://github.com/w7corp/easywechat/blob/6.4.0/src/OfficialAccount/AccessToken.php
jackleo120
3 小时 5 分钟前
@lyxxxh2 直接手动造一个请求就可以了。他 5 分钟内的 token 都可以用的,可以平滑度过的。还不用管测试还是正式环境。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1169261

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX