A
A
Alexander2021-11-18 09:42:53
PHP
Alexander, 2021-11-18 09:42:53

How to fix an error when sending a request (php curl) to the Yandex market?

There is a script written by Yandex, HERE , it works, but does not transmit anything.
I add data to it that I want to send.

<?
    // Входные данные
    $authKey = '********************';
    $oauthClientId = '****************';
    $requestURL = 'https://api.partner.market.yandex.ru/v2/campaigns/21614343/hidden-offers.json';

    // Установка HTTP-заголовков запроса
    $headers = array("Authorization: OAuth oauth_token=$authKey, oauth_client_id=$oauthClientId");

// данные которые нужно отправить
    $post_data = array(
        "hiddenOffers" => array(
            array(
                "offerId" => 146688, // sku на маркете который нужно скрыть
                "comment" => 'clear markret',
                "ttlInHours" => 720,
            )
        ),
    );


    echo "<h3>POST  как есть</h3>";
    print_r($post_data);

    $data_json = json_encode($post_data); // переводим поля в формат JSON

    echo "<h3>POST как JSON</h3>";
    print_r($data_json);

    echo "<h3> Сам запрос </h3>";



    // Инициализация c URL
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $requestURL);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data_json);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_HEADER, true);
    curl_setopt($curl, CURLINFO_HEADER_OUT, true);


    // Выполнение запроса, получение результата
    $result = curl_exec($curl);

    // Обработка результата выполнения запроса
    if (!$result) {
        echo 'Ошибка cURL: ' . curl_errno($curl) . ' - ' . curl_error($curl);
    } else {
        // Разделение полученных HTTP-заголовков и тела ответа
        $responseHeadersSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
        $responseHeaders = substr($result, 0, $responseHeadersSize);
        $responseBody = substr($result, $responseHeadersSize);
        $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);

        if ($httpCode == 200) {
            // Если HTTP-код ответа равен 200, то выводится отформатированное тело ответа
            // в формате JSON
            echo 'Запрос: ' . $requestURL;
            $decodedBody = json_decode($responseBody);
            echo '<br>Тело ответа: <pre>' . json_encode(
                    $decodedBody,
                    JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES
                ) . '</pre>';
        } else {
            echo 'HTTP-код ответа: ' . $httpCode;
            // Если тело ответа не пустое, то производится попытка декодирования JSON-кода
            if (!empty($responseBody)) {
                $decodedBody = json_decode($responseBody);
                if ($decodedBody != null) {
                    // Если ответ содержит тело в формате JSON,
                    // то выводится отформатированное тело в формате JSON
                    echo '<br>Тело ответа: <pre>' . json_encode(
                            $decodedBody,
                            JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES
                        ) . '</pre>';
                } else {
                    // Если не удалось декодировать JSON либо тело имеет другой формат,
                    // то выводится преобразованное тело ответа
                    echo '<br>Тело ответа: <pre>' . htmlspecialchars($responseBody) . "</pre>";
                }
            }
        }

        // Вывод необработанных HTTP-заголовков запроса и ответа
         echo '<hr>Заголовки запроса: <pre>' . curl_getinfo($curl, CURLINFO_HEADER_OUT) . '</pre>';
         echo 'Заголовки ответа: <pre>' . $responseHeaders . '</pre>';
    }

    curl_close($curl);
    ?>


all this gives
HTTP-код ответа: 400
Тело ответа: 
{
    "status": "ERROR",
    "errors": [
        {
            "code": "BAD_REQUEST",
            "message": "bad request"
        }
    ]
}

or here are the headings,

support cannot tell, who can tell or did it differently

Answer the question

In order to leave comments, you need to log in

1 answer(s)
N
Nadim Zakirov, 2021-11-18
@kikher

Try like this:

<?php

header('Content-Type: application/json; charset=UTF-8');

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

$authKey = '********************';
$oauthClientId = '****************';
$requestURL = 'https://api.partner.market.yandex.ru/v2/campaigns/21614343/hidden-offers.json';

$data = array(
  'hiddenOffers' => array(
    array(
      'offerId' => 146688,
      'comment' => 'clear markret',
      'ttlInHours' => 720
    )
  ),
);

$data_string = json_encode($data);

$result = file_get_contents($requestURL, null, stream_context_create(array(
      'http' => array(
        'method' => 'POST',
        'header' => array(
          "Authorization: OAuth oauth_token=$authKey, oauth_client_id=$oauthClientId\r\n" .
          "Content-Type: application/json; charset=utf-8\r\n" .
          "Content-Length: " . strlen($data_string) . "\r\n" .
          "Host: " . parse_url($requestURL)['host']
        ),
        'content' => $data_string
      )
    )
  )
);

echo $result;

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question