我在这里遇到了一个快速启动php脚本的问题:https://developers.google.com/drive/v2/web/quickstart/php
当我第一次运行脚本时,它会完美执行,访问令牌存储在一个名为:drive-php-quickstart.json的文件中
当我第二次运行脚本时,它会给我错误:
错误开始:
注意:第485行的\ google-api-php-client \ src \ Google \ Client.php中的未定义索引:expires_in
致命错误:未捕获的异常' LogicException'带有消息'刷新令牌必须传入或设置为setAccessToken的一部分'在
错误结束:
我的假设是文件中保存的访问令牌格式不正确。
当前格式:
ya29.CODE-oN_Bearer36001 / _ANOTHER-CODE-ANOTHER_ANOTHER_CODE
如您所见,它不包含变量" expires_in"
我出错的任何建议?我按原样运行脚本,没有任何修改。
答案 0 :(得分:12)
我已经调试了它......编写它的人在将auth结果写入token.json文件之前没有调用json_encode
时犯了一个错误。
您可以通过在第45行添加json_encode
来解决此问题。
因此...
file_put_contents($credentialsPath, $accessToken);
......应该是:
file_put_contents($credentialsPath, json_encode($accessToken));
我已经提交了反馈意见,希望它能得到解决。
编辑:同一方法中的令牌刷新调用会出现同样的问题
edit2:这是我在Github讨论中的相关评论以及Google的答案:https://github.com/google/google-api-php-client/issues/263#issuecomment-186557360
我提出了以下几点的建议:
if ($client->isAccessTokenExpired()) {
$refreshToken = $client->getRefreshToken();
$client->refreshToken($refreshToken);
$newAccessToken = $client->getAccessToken();
$newAccessToken['refresh_token'] = $refreshToken;
file_put_contents($credentialsPath, json_encode($newAccessToken));
}
而不是:
// Refresh the token if it's expired.
if ($client->isAccessTokenExpired()) {
$client->refreshToken($client->getRefreshToken());
file_put_contents($credentialsPath, $client->getAccessToken());
}