如何解决小程序授权第三方平台authorizer_refresh_token失效

问题描述

最近出现用户反馈微信小程序无法生成海报,提示:

1
获取AccessToken失败.错误原因:{"errcode":61023,"errmsg":"refresh_token is invalid hint:[U9Ce89Ro903r]"

项目介绍

系统是依托微信的第三方平台,给入住客户提供代微信公众号、小程序开发服务。采用PHP编程语言开发,使用laravel-wechat微信开发扩展(EasyWechat微信开发SDK在Laravel框架的使用)与微信服务器交互。

问题排查

根据错误信息,通过全局查找,找到抛出异常的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public function getTokenFromServer()
{
$params = [
'component_appid' => $this->componectConfig['app_id'],
'authorizer_appid' => $this->appId,
'authorizer_refresh_token' => $this->componectConfig['refresh_token'],
];

$http = $this->getHttp();

$token = $http->parseJSON($http->json(self::API_TOKEN_GET . '?component_access_token=' . $this->compconentAccessToken->getToken(), $params));
if (empty($token['authorizer_access_token'])) {
throw new HttpException('获取AccessToken失败.错误原因: ' . json_encode($token, JSON_UNESCAPED_UNICODE));
}

return $token;
}

根据代码判断是小程序授权给第三方平台保存下来的authorizer_refresh_token失效了。

问题解决

根据原因,那么就联系客户重新授权就可以了。客户重新授权之后,问题确实好了。可是第二天客户又反馈问题没有解决。那只好上微信开放社区查了。
确实上面找到一些类似的问题,看了微信官方回答只能给他们点赞,没有一个得到解决···只想说呵呵。

继续查找问题解决

带着问题翻阅代码,发现授权流程里面,如果用户授权给第三方平台会给我们系统回调。但是查了最近时间没有回调记录。这就奇怪了,系统记录的authorizer_refresh_token在授权之后确实更新了,为什么第二天就会失效呢?重新看了一遍记录,发现有个unauthorized类型的记录。可是我们系统没有取消授权功能。只有小程序管理后台有停止授权第三方功能。
然后我就去点击了停止授权,这时候发现系统记录里面出现了一条unauthorized类型的记录。再通过系统的授权功能重新授权这时候就产生了一条authorized类型的记录。观察了几天没有再出现。开心!

总结

这不能算一个很正确的解决,没有得到官方认证。认为的原因是:小程序授权给了其它第三方平台,导致我们的系统记录的authorizer_refresh_token失效。这时候停止了其它第三方平台授权,我们的平台重新授权产生的authorizer_refresh_token还是不能使用。只有同时停止了自己第三方平台授权,重新授权才可以。