Xero OAuth2 PHP定时任务刷新令牌遇BadMethodCallException错误求助
Xero OAuth2令牌刷新失败问题排查
问题原因及修复点:
- 变量语法错误:代码中
$accessToken和$refreshToken的定义末尾缺少分号,PHP会因语法错误导致变量未正确赋值,$refreshToken为空时就会触发"Required parameter not passed: 'refresh_token'"错误。 - GenericProvider配置冗余:初始化
GenericProvider时,配置数组里的'refresh_token' => $refreshToken是多余的,该类的配置项不包含这个参数,直接删除即可。 - 令牌设置错误:刷新令牌后,你错误地把旧的refresh_token设置为access_token,正确的做法是使用新获取到的
$newAccessToken中的访问令牌值。
修正后的核心代码片段:
// 修复变量末尾的分号 $accessToken = "**********"; $refreshToken = "**********"; $realID = "**********"; $xeroTenantId = (string)$realID; // 移除配置里的refresh_token项 $provider = new \League\OAuth2\Client\Provider\GenericProvider([ 'clientId' => '********************************', 'clientSecret' => '******************************************', 'urlAuthorize' => 'https://login.xero.com/identity/connect/authorize', 'urlAccessToken' => 'https://identity.xero.com/connect/token', 'urlResourceOwnerDetails' => 'https://identity.xero.com/resources' ]); $newAccessToken = $provider->getAccessToken('refresh_token', [ 'refresh_token' => $refreshToken ]); // 使用新的access_token而非旧的refresh_token $config = XeroAPI\XeroPHP\Configuration::getDefaultConfiguration()->setAccessToken( (string)$newAccessToken->getToken() );
额外提醒:刷新令牌成功后,务必把新的refresh_token(通过$newAccessToken->getRefreshToken()获取)存储起来,下次刷新时需要使用这个新的refresh_token,否则后续令牌刷新会再次失效。
内容的提问来源于stack exchange,提问作者Joakim Krassman
相关产品推荐
相关产品推荐

