前面代码中获取稳定版 access_token,将小程序和公众号的接口都替换了,并存储到 redis 缓冲中。

之后就时不时的出现小程序的订阅消息发送不成功的情况,查看日志会发现,发送返回:

{"errcode":48001,"errmsg":"api unauthorized rid: 64a64dcd-7d747476-7ba87c84"}

使用 api unauthorized 搜索都是提示 code 换 openid 时的报错,发送订阅消息 文档里也没有 48001 这一类型的错误码。

从出现的情况分析,小程序的订阅消息出现时有时无(一段时间内可以收到,一段时间内可能就不可以)的情况,而公众号的模板消息却从未发生过类似的情况。

通过 redis 连接工具查看两个 access_token 的存储情况。小程序的 access_token 存储为 laravel:access_token_mini,公众号的 access_token 这里存储为 laravel:access_token_js。检查发现 access_token_js 不存在,但公众号的模板消息却使用正常。

再次检查公众号获取 access_token 的代码,发现公众号的 access_token 也存储到了 access_token_mini。每次查询 access_token_js 都不存在,则调接口获取,所以公众号的调用凭证使用没有问题。但当公众号的模板消息调用后,小程序的调用凭证就会被污染,且因为没有过期,会被当成小程序的调用凭证正常调用。这就出现了 48001, api unauthorized 的情况。

修复代码后提交测试,好了。