Создание объявлений

PHP версии 5, протокол SOAP, используется класс SoapClient

Пример демонстрирует выполнение запроса методом Ads.add, обработку и вывод результата. Для использования примера во входных данных укажите OAuth-токен и идентификатор группы, в которой будет создано новое объявление. При запросе от имени агентства необходимо также указать логин клиента.

<?php
ini_set("soap.wsdl_cache_enabled", "0");

//--- Входные данные ----------------------------------------------------//
// Адрес WSDL-описания сервиса Ads (регистрозависимый)
$wsdlUrl = 'https://api.direct.yandex.com/v5/ads?wsdl';
// OAuth-токен пользователя, от имени которого будут выполняться запросы
$token = 'ТОКЕН';
// Логин клиента рекламного агентства
// Обязательный параметр, если запросы выполняются от имени рекламного агентства
$clientLogin = 'ЛОГИН_КЛИЕНТА';
// Идентификатор группы объявлений, в которую будет добавлено новое объявление
$adGroupId = ИДЕНТИФИКАТОР_ГРУППЫ;

//--- Подготовка и выполнение запроса -----------------------------------//
// Создание контекста потока: установка HTTP-заголовков
$streamOptions = stream_context_create(array(
   'http' => array(
      'header' => "Authorization: Bearer $token"."\r\n".    // OAuth-токен. Использование слова Bearer обязательно
                  "Client-Login: $clientLogin"."\r\n".      // Логин клиента рекламного агентства
                  "Accept-Language: ru"                     // Язык ответных сообщений
   ),
   /*
   // Для полноценного использования протокола HTTPS можно включить проверку SSL-сертификата сервера API Директа
   'ssl' => array(
      'verify_peer' => true,
      'cafile' => getcwd().DIRECTORY_SEPARATOR.'CA.pem' // Путь к локальной копии корневого SSL-сертификата
   )
   */
));

// Инициализация SOAP-клиента
$client = new SoapClient($wsdlUrl,
   array(
      'trace'             => true,
      'exceptions'        => false,
      'features'          => SOAP_SINGLE_ELEMENT_ARRAYS,
      'cache_wsdl'        => WSDL_CACHE_NONE,
      'encoding'          => 'UTF-8',
      'stream_context'    => $streamOptions
    )
);

// Параметры запроса к серверу API Директа
$params = array(
   'Ads' => array(
      array(
         'AdGroupId' => $adGroupId,
         // Параметры объявления
         'TextAd' => array(
            'Title' => 'Заголовок объявления',
            'Text' => 'Текст объявления',
            'Mobile' => 'NO',
            'Href' => 'http://www.yandex.ru'
         )
      )
   )
);

// Выполнение запроса методом add сервиса Ads, получение результата
$result = $client->add($params);

//--- Обработка результата выполнения запроса ---------------------------//
if (is_soap_fault($result)) {
   $error = "SOAP Fault: faultcode: {$result->faultcode}, faultstring: {$result->faultstring}";
   if (isset($result->detail->FaultResponse)) { 
      $apiErr = $result->detail->FaultResponse;
      $error .= " detail: {$apiErr->errorCode} - {$apiErr->errorDetail} (RequestId: {$apiErr->requestId})";
   }
   echo $error;
}
else {
   // Извлечение HTTP-заголовков ответа: RequestId (Id запроса) и Units (информация о баллах)
   $headers = explode("\r\n", $client->__getLastResponseHeaders());
   foreach ($headers as $header) {
      if (preg_match('/(RequestId|Units):/', $header)) { echo "$header<br>"; }
   }

   // Вывод результата
   // Обработка всех элементов массива AddResults, где каждый элемент соответствует одному объявлению
   foreach ($result->AddResults as $item) {
      // Обработка вложенных элементов (может быть либо Errors, либо Id и, возможно, Warnings)
      foreach ($item as $key => $value) {
         // Если присутствует массив Errors, то объявление не создано из-за ошибки (ошибок может быть несколько)
         if ($key == 'Errors') {
            foreach ($value as $errItem) { echo "Ошибка: {$errItem->Code} - {$errItem->Message} ({$errItem->Details})<br>"; }
         }
         else {
            // Если присутствует массив Warnings, то объявление создано, но есть предупреждения (предупреждений может быть несколько)
            if ($key == 'Warnings') {
               foreach ($value as $warItem) { echo "Предупреждение: {$warItem->Code} - {$warItem->Message} ({$warItem->Details})<br>"; }
            }
            echo "Создано объявление №{$value}<br>";
         }
      }
   }
}

//--- Отладочная информация ---------------------------------------------//
//echo "<hr>Заголовки запроса:<pre>".$client->__getLastRequestHeaders()."</pre>";
//echo "Запрос:<pre>".htmlspecialchars($client->__getLastRequest())."</pre>";
//echo "Заголовки ответа:<pre>".$client->__getLastResponseHeaders()."</pre>";
//echo "Ответ:<pre>".htmlspecialchars($client->__getLastResponse())."</pre>";
?>