Google drive api Google API PHP客户端出现问题,运行快速启动脚本时出错

Google drive api Google API PHP客户端出现问题,运行快速启动脚本时出错,google-drive-api,google-api-php-client,Google Drive Api,Google Api Php Client,我在这里遇到了quickstart php脚本的问题: 当我第一次运行脚本时,它执行得非常完美,访问令牌存储在一个名为:drive-php-quickstart.json的文件中 当我第二次运行脚本时,它给出了错误: 错误开始: 注意:未定义索引:expires\u在第485行的in\google api php client\src\google\client.php中 致命错误:未捕获的异常“LogicException”,消息“必须传入刷新令牌或将其设置为setAccessToken的一部

我在这里遇到了quickstart php脚本的问题:

当我第一次运行脚本时,它执行得非常完美,访问令牌存储在一个名为:drive-php-quickstart.json的文件中

当我第二次运行脚本时,它给出了错误:

错误开始:

注意:未定义索引:expires\u在第485行的in\google api php client\src\google\client.php中

致命错误:未捕获的异常“LogicException”,消息“必须传入刷新令牌或将其设置为setAccessToken的一部分”

错误结束:

我的假设是,保存在文件中的访问令牌的格式不正确

当前格式:

ya29.CODE-oN_-Bearer36001//u-other-CODE-other_-other_-CODE

如您所见,它不包含变量“expires\u in”


有什么建议我哪里出了问题吗?我正在按原样运行脚本,没有任何修改

我已经调试过了。。。。编写它的人犯了一个错误,在将auth结果写入token.json文件之前没有调用
json\u encode

您可以通过在第45行添加
json\u encode
来修复它

所以

……应该是:

file_put_contents($credentialsPath, json_encode($accessToken));
我已经提交了反馈,希望它能被修复

编辑:相同方法中的令牌刷新调用也会出现相同的问题

编辑2:以下是我在Github讨论中的相关评论和谷歌的回答:

我的建议大致如下:

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());
}
谷歌已经更新了他们的网站,并改进了处理方法:

// Exchange authorization code for an access token.
$accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
$client->setAccessToken($accessToken);

// Refresh the token if it's expired.
if ($client->isAccessTokenExpired()) {
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
file_put_contents($credentialsPath, json_encode($client->getAccessToken()));
}

你在AppEngine上运行的到底是什么?您指向的快速启动,以及您问题的所有文本,都表明您正在本地运行,与AppEngine无关。如果是的话,你能换一下标签吗?如果没有,请编辑您的问题以澄清应用程序引擎的作用?谢谢,谢谢你,亚历克斯。我已经做了改变。是的,我目前正在本地执行,但我会很快将其转移到谷歌应用程序引擎。我有确切的问题。不做任何修改就运行脚本。第一次运行完全正常,第二次使用
刷新令牌退出时,必须传入或设置为setAccessToken的一部分。谢谢!我还提交了反馈。虽然它看起来是一条直线47@RoshanBhumbra啊,是的,也许是47。。这个Github票证中还有一些信息:@Erfan-我必须在Github评论中应用你的刷新令牌设置。你能在这里提到这一点吗,或者把这一段粘贴到这里?我觉得这很有用。谢谢@mederomuraliev,补充道:)太好了。实际上,我确实实现了这一点,它在
sheets.googleapis.com php quickstart.json
文件中有
refresh\u token
节点,但我得到了
致命错误:未捕获的异常“LogicException”,在后续调用中会显示消息“refresh token必须传入或设置为setAccessToken的一部分”
。有什么想法吗?
// Exchange authorization code for an access token.
$accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
$client->setAccessToken($accessToken);

// Refresh the token if it's expired.
if ($client->isAccessTokenExpired()) {
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
file_put_contents($credentialsPath, json_encode($client->getAccessToken()));
}