PHP 7.3 调用 Yandex API 需用 cURL 构造标准 JSON POST 请求,正确设置 Authorization(Api-Key 或 Bearer Token)、Content-Type: application/json 及 Accept 头,中文需 json_encode(..., JSON_UNESCAPED_UNICODE),并校验 HTTP 状态码。

PHP 7.3 模拟 POST 请求调用 Yandex 相关接口(如 Yandex.Translate、Yandex.Direct API 或 Yandex.Metrica 等),核心是正确构造 HTTP 请求:确保 URL 准确、携带必要认证凭据(如 OAuth Token 或 API Key)、设置标准请求头,并按接口要求发送表单或 JSON 数据。Yandex 官方 API 普遍要求 JSON 格式请求体 + Content-Type: application/json,且多数需在请求头中带 Authorization 字段。
确认目标接口与认证方式
Yandex 各服务认证机制不同,必须先查清文档:
-
Yandex.Translate API v1.5:已停用,v2+ 使用
API Key,放在请求头Authorization: Api-Key <your-key> -
Yandex.Direct API:使用 OAuth 2.0 token,头为
Authorization: Bearer <access_token>,且需指定Accept: application/json和Content-Type: application/json -
Yandex.Metrica API:同样依赖 OAuth token,请求地址类似
https://api-metrika.yandex.net/stat/v1/data,参数多走 query string,但部分写操作(如创建目标)仍需 POST + JSON
发标准 JSON POST(推荐用 cURL)
以调用 Direct API 创建一个广告组为例(PHP 7.3 兼容写法):
注意:以下代码默认已启用 cURL 扩展,且不跳过 SSL 验证(生产环境必须)
立即学习“PHP免费学习笔记(深入)”;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.direct.yandex.com/json/v5/adgroups');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer your_actual_oauth_token_here',
'Accept: application/json',
'Content-Type: application/json',
'Client-Login: your_client_login' // 如使用代理账户
]);
$data = [
'method' => 'add',
'params' => [
'AdGroups' => [
[
'Name' => 'Test Group via PHP',
'CampaignId' => 123456789,
'RegionIds' => [225] // 莫斯科
]
]
]
];
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data, JSON_UNESCAPED_UNICODE));
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($response === false) {
echo 'cURL error: ' . curl_error($ch);
} elseif ($httpCode >= 400) {
echo "HTTP $httpCode: " . $response;
} else {
$result = json_decode($response, true);
print_r($result);
}
关键避坑点(Yandex 特别敏感)
-
Token 必须有效且有对应权限:OAuth token 需通过 Yandex.OAuth 授权获取,scope 必须包含目标服务(如
direct),过期需刷新 -
Content-Type 不可省略或错写:Yandex API 拒绝
application/x-www-form-urlencoded类型的 JSON 请求;传数组给CURLOPT_POSTFIELDS会触发自动表单编码,必须用json_encode()后传字符串 -
中文字段要加
JSON_UNESCAPED_UNICODE:否则 Yandex 可能返回 400(如广告组名含俄文/中文时) -
不要忽略 HTTP 状态码:Yandex 常返回
400 Bad Request(参数错)、401 Unauthorized(token 失效)、429 Too Many Requests(限频),需检查curl_getinfo($ch, CURLINFO_HTTP_CODE) -
开发调试建议加
CURLOPT_VERBOSE:临时开启可查看完整请求头/体,确认 Authorization 和 Content-Type 是否真实发出
替代方案:file_get_contents(仅简单场景)
若仅做轻量测试(如调 Translate API),且确定不涉及复杂 header 或重定向,可用:
$url = 'https://translate.api.cloud.yandex.net/translate/v2/translate';
$data = json_encode([
'sourceLanguageCode' => 'en',
'targetLanguageCode' => 'ru',
'texts' => ['hello world']
], JSON_UNESCAPED_UNICODE);
$opts = [
'http' => [
'method' => 'POST',
'header' => "Authorization: Api-Key your_translate_api_key\r\n" .
"Content-Type: application/json\r\n",
'content' => $data,
'timeout' => 10
]
];
$result = file_get_contents($url, false, stream_context_create($opts));
echo $result;
⚠️ 注意:file_get_contents 无法自动处理重定向或细粒度错误,也不支持 OAuth 刷新逻辑,仅适合一次性、低频调用。



















