PHP调用Google Search Console API出现invalid_grant错误求助
解决Google Search Console API返回"invalid_grant"错误的方案
可能的错误原因及解决步骤
刷新令牌失效
Google刷新令牌会因6个月未使用、用户改密码、用户撤销应用授权、安全策略更新等情况失效。解决:删掉本地保存的token文件,重新走授权流程获取新令牌。凭证配置冲突
代码里同时用setClientId/setClientSecret和setAuthConfig,两种方式重复会导致凭证加载异常。解决:只保留setAuthConfig(public_path("client_secret_latest.json")),因为JSON文件已包含client_id、client_secret和redirect_uri信息,删掉单独设置这三个参数的代码。重定向URI不匹配
Google Cloud控制台中OAuth客户端ID配置的重定向URI,必须和代码里的redirect_uri完全一致(含http/https、端口、路径)。解决:登录Google Cloud→API和服务→凭据→对应客户端ID,检查重定向URI列表,确保和代码中的http://localhost/redirect_url完全一致。令牌文件损坏
本地token文件可能因写入错误或内容篡改,导致解析后的令牌无效。解决:删除现有token文件,重新授权生成新文件。账号权限变更
授权的Google账号可能被移除了目标网站的Search Console权限。解决:登录Google Search Console,确认目标网站权限列表包含该账号,且至少拥有"查看者"权限。
代码优化点
针对你的现有代码,调整以下几点:
- 移除重复凭证配置:
// 删除这三行,依赖client_secret_latest.json即可 $client->setClientId($client_id); $client->setClientSecret($client_secret); $client->setRedirectUri($redirect_uri); // 保留这一行 $client->setAuthConfig(public_path("client_secret_latest.json"));
- 刷新令牌后更新本地文件:
当前代码刷新令牌后未写入文件,下次运行仍用旧令牌,这是常见问题。修改刷新逻辑:
// 刷新过期令牌 if ($client->isAccessTokenExpired()) { $refreshTokenSaved = $client->getRefreshToken(); $newAccessToken = $client->fetchAccessTokenWithRefreshToken($refreshTokenSaved); // 合并新令牌,保留refresh_token $accessToken = array_merge($accessToken, $newAccessToken); // 更新本地token文件 file_put_contents($this->tokenFile, json_encode($accessToken)); $client->setAccessToken($accessToken); }
- 修复异常判断语法错误:
catch块里用了赋值操作=,改成相等判断===:
if ($error->error === "invalid_grant") { echo "权限不足或令牌失效,请重新授权。"; }
- 统一站点变量:
代码里定义了$siteToFetch,但调用query时用了$sitesFetched[0]["site"],变量名不一致可能导致站点URL错误,需确认变量对应关系。
验证流程
- 删除本地token文件,重新访问授权页面完成授权。
- 检查Google Cloud控制台的OAuth客户端配置,确保重定向URI、凭证文件正确。
- 运行修改后的代码,测试能否正常获取数据。
内容的提问来源于stack exchange,提问作者Liaqat A.
相关产品推荐
相关产品推荐

