PHP调用Google Ads API遇OAUTH_TOKEN_HEADER_INVALID错误求助
解决Google Ads API认证错误(OAUTH_TOKEN_HEADER_INVALID/NOT_ADS_USER)
核心问题排查与修复
针对OAUTH_TOKEN_HEADER_INVALID错误
检查Customer ID格式
Google Ads API要求Customer ID为不带连字符的10位纯数字(例如1234567890,而非后台显示的123-456-7890)。验证getCustomerId()返回的格式是否符合要求,若带连字符需去除。验证Access Token有效性
调用令牌校验接口检查拿到的access_token:curl https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=你的token值确认返回结果中:
scope包含https://www.googleapis.com/auth/adwordsexpires_in未过期aud与你的OAuth2客户端ID/服务账号ID匹配
检查GoogleAdsClient构建配置
尝试移除usingGapicV2Source(true)参数,使用默认的Gapic V3版本:$this->client = (new GoogleAdsClientBuilder()) ->withOAuth2Credential($oauth2) ->withDeveloperToken(config('google.developer_key')) ->build();旧版Gapic V2可能存在与新版SDK的兼容性问题,导致授权头传递异常。
排查Laravel中间件干扰
检查项目中是否有中间件修改了HTTP请求头,尤其是Authorization字段。可以通过日志输出实际发送请求的头信息,确认格式为Bearer <完整token>,无截断、空格缺失等问题。
针对NOT_ADS_USER错误(服务账号模拟场景)
修正ImpersonateEmail参数
服务账号不能直接作为Google Ads用户,withImpersonatedEmail()必须填写已在Ads账号中拥有管理员权限的域用户邮箱(即你提到的域管理员+Ads管理员邮箱),而非服务账号自身的邮箱。无需邀请服务账号到Ads账号
服务账号通过全域委派模拟域用户身份,无需单独邀请服务账号加入Ads账号。只要被模拟的域用户已在Ads账号中具备权限,服务账号即可通过该身份发起请求。确认全域委派配置
在Google Workspace admin控制台:- 服务账号已启用全域委派
- 已添加
https://www.googleapis.com/auth/adwords作为委派作用域 - 委派权限已应用到目标域用户
代码细节验证
OAuth2 Web项目方式
- 确认
client_id、client_secret为Web项目的凭证(而非服务账号的) - 确认
refresh_token未过期、未被撤销(测试模式下若重新授权,旧refresh_token会失效)
服务账号方式
- 确认JSON密钥文件为服务账号的密钥文件(下载自Google Cloud控制台的服务账号详情页)
- 确认
withScopes()传入的是正确的adwords作用域字符串
内容的提问来源于stack exchange,提问作者Stephen Rushing
相关产品推荐
相关产品推荐

