Как исправить ошибку при отправке запроса (php curl) на яндекс маркет?

Есть скрипт написанный Яндексом, ТУТ, он работает, но ничего не передает.
Я его добавляю данные в него которые хочу отправить.
<?
    // Входные данные
    $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);
    ?>


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

или вот заговлоки

поддержка не может подсказать, кто может подскажет или делал как то по другому
  • Вопрос задан
  • 410 просмотров
Решения вопроса 1
zkrvndm
@zkrvndm
Архитектор решений
Попробуй так:
<?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;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы