调用YouTube API的fetchAccessTokenWithRefreshToken时提示令牌格式无效
解决Google Client PHP库中fetchAccessTokenWithRefreshToken报“Invalid token format”问题
先看你的代码,问题出在fetchAccessTokenWithRefreshToken的参数传递逻辑,以及可能的refresh token转义处理错误。以下是具体排查和修复步骤:
1. 先确认refresh token的实际格式
在调用刷新方法前,先输出refresh token的实际内容,检查是否存在转义错误:
var_dump($accessToken['refresh_token']);
如果输出的字符串里包含\/\/(双反斜杠加斜杠),说明你的access token文件里的JSON转义未被正确解析——正常情况下json_decode会把\/\/转换成单个/,若未转换,大概率是文件内容为手动粘贴的错误格式,或是保存时重复转义导致的。
2. 修复参数传递方式
不要直接传$accessToken['refresh_token']字符串,改用更可靠的方式获取refresh token:
方案一(推荐):使用Client内置的refresh token
if ($client->isAccessTokenExpired()) { try { // 从Client实例中获取已存储的refresh token,避免手动处理字符串格式 $accessToken = $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken()); $client->setAccessToken($accessToken); // 关键:将新的access token写回文件,否则下次运行仍会使用旧的过期token file_put_contents($accessTokenFilePath, json_encode($accessToken)); } catch (Exception $e) { echo " Caught Exception: " . $e->getMessage() . "\r\n"; } }
方案二:修正refresh token字符串格式
如果必须手动传递refresh token字符串,确保它是正确的未转义格式(即单个/,而非\/\/)。你的原始refresh token正确格式应为:
1/09HLLzFdZusdfsdfAAGAkSNwF-L9IrWLZCMaBh9G-uedsdfdsfkl6SG8S9OEpvm_2r3USiaOsdfdfuZWruUXSb9YA3YA
若文件中存储的是1\/\/09...,说明保存时JSON格式错误,重新用json_encode保存初始access token:
// 初始获取access token后,用此方式保存到文件 file_put_contents($accessTokenFilePath, json_encode($initialAccessToken));
3. 额外注意事项
- 初始授权时你已设置
$client->setAccessType('offline');,确保了离线权限,这部分没问题。 - 每次刷新token后必须将新token写回文件,否则下次启动脚本仍会调用过期token,重复触发错误。
内容的提问来源于stack exchange,提问作者Ayman Roshdy
相关产品推荐
相关产品推荐

