PHP中通过Google Contacts API导入联系人失败问题排查
排查Google Contacts API突然失效的可能原因
结合你的代码和Google API的政策变化,从以下几个方向逐一排查:
旧API端点已停用
你使用的https://www.google.com/m8/feeds是Google Contacts API v3的端点,该API已于2023年9月宣布弃用,并在2024年6月正式停止服务。旧端点目前已无法返回有效数据,必须迁移到People API来获取联系人信息。权限范围冗余或废弃
代码中添加了多个无效或冗余的权限范围:userinfo.profile、userinfo.email这类旧范围已被OIDC标准的profile、email替代,无需重复添加;gmail.labels与联系人获取完全无关,属于多余权限;
若迁移到People API,需使用对应权限范围,比如https://www.googleapis.com/auth/contacts.readonly或https://www.googleapis.com/auth/contacts。
访问令牌传递方式不符合规范
你直接将access_token拼在URL的oauth_token参数中,这种传递方式已被Google API弃用。正确做法是在请求头中添加Authorization: Bearer {access_token},而非通过URL参数传递令牌。令牌有效性问题
- 检查
$_SESSION['access_token']中的令牌是否过期:access_token默认有效期仅1小时,若未实现refresh_token自动刷新逻辑,令牌过期后会直接导致请求失败; - 确认授权时是否设置了
access_type=offline以获取refresh_token,否则无法刷新过期的access_token。
- 检查
Google Cloud项目配置异常
- 登录Google Cloud Console,确认项目已启用People API(旧Contacts API已无法使用);
- 检查OAuth consent screen状态:若为测试状态,测试用户数量有限且令牌有效期受限;若已发布,需确认权限是否通过Google审核。
缺少错误排查逻辑
代码中file_get_contents($surl)未做任何错误处理,无法获取具体报错信息。建议添加错误捕获逻辑,示例如下:$context = stream_context_create([ 'http' => [ 'header' => "Authorization: Bearer " . $_SESSION['access_token']['access_token'] ] ]); $response = file_get_contents($contactUrl, false, $context); if ($response === false) { $error = error_get_last(); var_dump($error); // 打印具体错误信息,快速定位问题 } else { // 处理响应数据 }通过HTTP状态码(如401/403/404)和错误描述,能直接定位问题根源。
内容的提问来源于stack exchange,提问作者Mukhila Asokan
相关产品推荐
相关产品推荐

