Google drive api Google API PHP客户端出现问题,运行快速启动脚本时出错
我在这里遇到了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”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的一部
有什么建议我哪里出了问题吗?我正在按原样运行脚本,没有任何修改 我已经调试过了。。。。编写它的人犯了一个错误,在将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()));
}