Интеграция с ПОС Госуслуги (витрина), не могу отправить файл csv

Кто проходил этот слабо документированный квест, пожалуйста, откликнитесь. Речь идёт о Витрине ПОС Госуслуг, когда статистические данные о городских проблемах и жалобах отправляем из города --> в Москву. Это вот отсюда

Проблема: при отправке файла CSV на точку /analytic-service/statistic-data получаем ответ null со статусом 400. Пробовали отправлять и на тест, и на прод.

    $url="$gosusREST/analytic-service/statistic-data";
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($curl, CURLOPT_POST , 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, ['file' => $csv, "type"=>"application/vnd.ms-excel"]);
    curl_setopt($curl, CURLOPT_HTTPHEADER, array(
        'Authorization: Bearer '.$resultAuth["access_token"],
        "Content-Type: multipart/form-data",
            ));                    
    $rawdata=curl_exec($curl);

Ключи авторизации верные, далее получаем валидные токены, и даже приём есть, а передачи нет! Если поломать bearer, сервер ответит

401 {"error":"unauthorized","error_description":"Full authentication is required to access this resource"}

...то есть сервер жив. Но как понять пустой ответ 400 и что может быть у них не так?


Ответы (1 шт):

Автор решения: djdance

Успешный вариант отправки отличается в 3 местах: file, ssl и httpauth. Файл надо предварительно сохранить на диск.

...
curl_setopt($curl, CURLOPT_POSTFIELDS, ['file' => new CURLFile($tempFilename), "type"=>"application/vnd.ms-excel"]);//только так! а иначе 500
//curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");   //не надо
curl_setopt($curl, CURLOPT_AUTOREFERER, TRUE); 
curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1); 
curl_setopt($curl, CURLOPT_FORBID_REUSE, 1); 
curl_setopt($curl, CURLOPT_TIMEOUT, 100); 
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY); 
//curl_setopt($curl, CURLOPT_HEADER, true);//чтобы выдало заголовки, но они тут неинформативные
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
...

А недокументированный код ответа 400, это если file пытаться послать прямым вложением.

→ Ссылка