Привет. Провозился долго, но так и не получилось решить один вопрос.
Задача стоит в получении статистики с Яндекс.Директ. Использую API (
https://tech.yandex.ru/direct/doc/dg-v4/examples/p...
Пытаюсь подключаться по token, который успешно получил, используя вот этот код:
<?php
$client_id = 'id приложения, полученный при его создании';
$client_secret = 'пароль приложения, полученный при его создании';
// Если мы еще не получили разрешения от пользователя, отправляем его на страницу для его получения
// В урл мы также можем вставить переменную state, которую можем использовать для собственных нужд, я не стал
if (!isset($_GET["code"])) {
Header("Location: https://oauth.yandex.ru/authorize?response_type=code&client_id=".$client_id);
die();
}
// Если пользователь нажимает "Разрешить" на странице подтверждения, он приходит обратно к нам
// $_Get["code"] будет содержать код для получения токена. Код действителен в течении часа.
// Теперь у нас есть разрешение и его код, можем отправлять запрос на токен.
$result=postKeys("https://oauth.yandex.ru/token",
array(
'grant_type'=> 'authorization_code', // тип авторизации
'code'=> $_GET["code"], // наш полученный код
'client_id'=>$client_id,
'client_secret'=>$client_secret
),
array('Content-type: application/x-www-form-urlencoded')
);
// отправляем запрос курлом
function postKeys($url,$peremen,$headers) {
$post_arr=array();
foreach ($peremen as $key=>$value) {
$post_arr[]=$key."=".$value;
}
$data=implode('&',$post_arr);
$handle=curl_init();
curl_setopt($handle, CURLOPT_URL, $url);
curl_setopt($handle, CURLOPT_HTTPHEADER, $headers);
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($handle, CURLOPT_POST, true);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
$response=curl_exec($handle);
$code=curl_getinfo($handle, CURLINFO_HTTP_CODE);
return array("code"=>$code,"response"=>$response);
}
// после получения ответа, проверяем на код 200, и если все хорошо, то у нас есть токен
if ($result["code"]==200) {
$result["response"]=json_decode($result["response"],true);
$token=$result["response"]["access_token"];
echo $token;
}else{
echo "Какая-то фигня! Код: ".$result["code"];
}
// Токен можно кинуть в базу, связав с пользователем, например, а за пару дней до конца токена напомнить, чтобы обновил
* - пример взят с
habr.
Отлично, токен получен - осталось отправить запрос с указанием нужного мне метода:
<?php
error_reporting( E_ALL ) ;
$token='token с предыдущего примера';
function getBallance() {
$method = 'GetSummaryStat';
$params = array(
'CampaignIDS' => array( (int)ID_КОМПАНИИ ),
'StartDate' => '2016-01-01',
'EndDate' => '2016-02-01',
);
function utf8($struct) {
foreach ($struct as $key => $value) {
if (is_array($value)) {
$struct[$key] = utf8($value);
}
elseif (is_string($value)) {
$struct[$key] = utf8_encode($value);
}
}
return $struct;
}
$request = array(
'token'=> $token,
'method'=> $method,
'param'=> utf8($params),
'locale'=> 'ru',
);
$request = json_encode($request);
$opts = array(
'http'=>array(
'method'=>"POST",
'content'=>$request,
)
);
$context = stream_context_create($opts);
$result = file_get_contents('https://api.direct.yandex.ru/v4/json/', 0, $context);
$json = json_decode($result,true);
return $json;
}
echo '<pre>';
print_r( getBallance() );
echo '</pre>';
В итоге получаю:
Array
(
[error_str] => Authorization error
[error_code] => 53
[error_detail] =>
)
Подскажите, куда копать, в чем может быть проблема?