Как отправить XML-файл в EDI Контур через API с помощью PHP?

Как правильно передать XML через curl? Есть метод, который создает сообщение: <b>POST /V1/Messages/SendMessage</b>. Описание: <i>Метод для отправки сообщения. В теле запроса должен быть передан массив байт – содержимое сообщения.</i> 

<b>Request Body</b> принимает <code>string &lt;byte&gt;</code>. 

Я формирую XML-строку с помощью PHP. Сообщение отправляется, но в личном кабинете отображается ошибка "файл пуст". Я пробовал закодировать его в base64 и применять unpack('C*', $xml), но результат остается тем же. 

Поддержка попросила ознакомиться с инструкцией.
  • 18 сентября 2024 г. 10:53
Ответы на вопрос 2
Для отправки XML-файла в EDI Контур через API с использованием PHP и cURL, важно правильно сформировать запрос, особенно обращая внимание на формат данных, которые вы отправляете. В вашем случае, для API, который ожидает массив байт, следует использовать правильное кодирование данных и установить правильные заголовки.

Вот пример того, как можно это сделать:

```php
// Ваш XML-контент
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<root>
    <data>Hello World</data>
</root>';

// Преобразуем XML-строку в строку байтов
// В этом случае, мы можем использовать utf8_encode для правильного кодирования
$byteData = utf8_encode($xml); 

// URL для отправки
$url = 'https://api.edi.kontur.ru/V1/Messages/SendMessage';

// Инициализация cURL
$ch = curl_init($url);

// Установка заголовков
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/octet-stream',
    'Content-Length: ' . strlen($byteData)
]);

// Установка опций cURL
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $byteData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// Выполнение запроса
$response = curl_exec($ch);

// Проверка ошибок
if (curl_errno($ch)) {
    echo 'Ошибка cURL: ' . curl_error($ch);
} else {
    // Обработка ответа
    echo 'Ответ от сервера: ' . $response;
}

// Закрытие cURL ресурса
curl_close($ch);
```

### Заметки:
1. **XML-строка**: Убедитесь, что ваш XML сформирован корректно, особенно проверьте открывающие и закрывающие теги.
2. **Кодировка**: Используйте `utf8_encode()` если ваш XML не в UTF-8. Однако, если ваш XML уже в правильной кодировке, это может не понадобиться.
3. **Заголовки**: Убедитесь, что вы устанавливаете `Content-Type: application/octet-stream`, так как ожидается массив байт.
4. **Ответ**: После выполнения запроса проверьте ответ на наличие ошибок или дополнительной информации.

Если после всех этих изменений у вас все еще возникает ошибка, возможно, стоит обратиться к документации API для проверки дополнительных требований к структуре запроса или содержимому.
Возможно вы некорректно формируете массив байтов, либо не задаёте необходимый Content-Type в шапке запроса. 
Вот пример корректного запроса:

$xmlContent = '<?xml version="1.0" encoding="UTF-8"?><message>Пример сообщения</message>';

$xmlBytes = unpack('C*', $xmlContent);

$byteString = implode(array_map("chr", $xmlBytes));

$url = 'https://edi.kontur.ru/V1/Messages/SendMessage';

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/octet-stream',
    ...
));

curl_setopt($ch, CURLOPT_POSTFIELDS, $byteString);

$response = curl_exec($ch);

if (curl_errno($ch)) {
    echo 'Ошибка cURL: ' . curl_error($ch);
} else {
    echo 'Ответ сервера: ' . $response;
}

curl_close($ch);
Похожие вопросы