PHP调用Google Ads API遇401认证错误,求解决方案
Google Ads API 401 未授权问题解决(基于你的PHP cURL代码)
核心问题
你遇到的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小时),步骤如下:
- 准备好你的OAuth 2 Client ID、Client Secret、Refresh Token
- 用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
相关产品推荐
相关产品推荐

