You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP调用Google Ads API遇401认证错误,求解决方案

核心问题

你遇到的401错误,本质是Authorization头里没有填入有效的OAuth 2访问令牌。你尝试的Client ID、Client Secret、Refresh Token、Developer Token都不是直接可用的访问令牌——Refresh Token是用来换取短期Access Token的凭据,不能直接放在Authorization头里。

先修正代码里的低级错误

你的HTTP头里developer-token那一行少了闭合的],应该改成:

'developer-token: [DEVELOPER_TOKEN]',

这个小错误可能也会导致请求异常,先修正。

正确获取OAuth 2访问令牌

你需要用已有的Refresh Token,向Google的OAuth令牌端点换取短期的Access Token(有效期约1小时),步骤如下:

  1. 准备好你的OAuth 2 Client ID、Client Secret、Refresh Token
  2. 用cURL发送POST请求到令牌端点,示例代码:
$tokenCh = curl_init();
curl_setopt($tokenCh, CURLOPT_URL, 'https://oauth2.googleapis.com/token');
curl_setopt($tokenCh, CURLOPT_RETURNTRANSFER, true);
curl_setopt($tokenCh, CURLOPT_POST, true);
curl_setopt($tokenCh, CURLOPT_POSTFIELDS, http_build_query([
    'client_id' => '[YOUR_CLIENT_ID]',
    'client_secret' => '[YOUR_CLIENT_SECRET]',
    'refresh_token' => '[YOUR_REFRESH_TOKEN]',
    'grant_type' => 'refresh_token'
]));

$tokenResponse = json_decode(curl_exec($tokenCh), true);
curl_close($tokenCh);

// 提取有效Access Token
$accessToken = $tokenResponse['access_token'] ?? '';

执行这段代码后,$accessToken就是你需要的访问令牌。

修正后的完整API调用代码

把获取到的$accessToken填入Authorization头,完整代码如下:

// 先获取Access Token
$tokenCh = curl_init();
curl_setopt($tokenCh, CURLOPT_URL, 'https://oauth2.googleapis.com/token');
curl_setopt($tokenCh, CURLOPT_RETURNTRANSFER, true);
curl_setopt($tokenCh, CURLOPT_POST, true);
curl_setopt($tokenCh, CURLOPT_POSTFIELDS, http_build_query([
    'client_id' => '[YOUR_CLIENT_ID]',
    'client_secret' => '[YOUR_CLIENT_SECRET]',
    'refresh_token' => '[YOUR_REFRESH_TOKEN]',
    'grant_type' => 'refresh_token'
]));

$tokenResponse = json_decode(curl_exec($tokenCh), true);
curl_close($tokenCh);

$accessToken = $tokenResponse['access_token'] ?? '';

// 调用Google Ads API
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://googleads.googleapis.com/v14/customers/[CUSTOMER_ID]:generateKeywordHistoricalMetrics');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'developer-token: [DEVELOPER_TOKEN]',
    'login-customer-id: [LOGIN_CUSTOMER_ID]', // 仅经理账户访问子账户时需要,否则可省略
    "Authorization: Bearer {$accessToken}",
    'Accept: application/json',
    'Content-Type: application/json',
]);
// 注意keywords字段不要留空,填入目标关键词
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"historicalMetricsOptions":{"yearMonthRange":{"start":{"month":"JUNE","year":2022},"end":{"month":"MAY","year":2023}}},"keywords":["your-target-keyword"]}');

$response = curl_exec($ch);

// 检查请求错误
if(curl_errno($ch)) {
    echo 'cURL Error: ' . curl_error($ch);
} else {
    print_r(json_decode($response, true));
}

curl_close($ch);

额外注意事项

  • 确保Refresh Token属于当前Google Ads项目,跨项目的Refresh Token无效
  • Developer Token需要通过Google Ads审核并处于可用状态
  • 确认OAuth授权的账号拥有访问目标Customer ID的权限,否则也会触发401错误

内容的提问来源于stack exchange,提问作者Kostas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:25:25