Ситуация следующая. Пытаюсь разобраться в QIWI API. Запрос на получение баланса аккаунта получается и приходит верно, а вот запрос на перевод средств другому человеку не получается. Для работы с API требуется помимо каких-то данных отправлять ещё и header'ы, тут проблем нету, но в варианте с переводом средств нужно передать ещё и некоторые данные, связанные с получателем. На сайте API написан такой пример запроса на перевод: Код (Text): user@server:~$ curl -X POST 'https://edge.qiwi.com/sinap/api/v2/terms/99/payments' --header "Content-Type: application/json" --header "Accept: application/json" --header "Authorization: Bearer YUu2qw048gtdsvlk3iu" -d '{ "id":"11111111111111", "sum": { "amount":100, "currency":"643" }, "paymentMethod": { "type":"Account", "accountId":"643" }, "comment":"test", "fields": { "account":"+79121112233" } }' Проблема сейчас в том, как понять это "-d" и как его передать в PHP. Вот мой неполный вид запроса. Тут данные я передаю видимо не так, как надо: Код (Text): $data = Какая-то информация в массиве; $url = $this->urls[$achive]; $options = array( 'http' => array( 'header' => $this->headers["accept"], 'header' => $this->headers["contentType"], 'header' => $this->headers["authorization"], 'd' => json_encode($data), ) ); $context = stream_context_create($options); $res = file_get_contents($url, false, $context); if ($res === FALSE) { return 0; } else{ return $res; } Надеюсь, что есть тут кто-то, кто сможет подсказать, в чём проблема)
Так же пробую отправлять запрос через curl. Вот мои два запроса и ответ от севера 1) file_get_contents: Код (Text): $url = "https://edge.qiwi.com/sinap/api/v2/terms/99/payments"; $data["id"] = time()*100000; //Некий id запроса, создаётся мной и должен не превышать 20 символов $data["sum"]["amount"] = 1; $data["sum"]["currency"] = strval(RUB); $data["paymentMethod"]["type"] = "Account"; $data["paymentMethod"]["accountId"] = strval(RUB); $data["comment"] = "Hello!()()()"; $data["fields"]["account"] = "+380734237599"; $data = json_encode($data); $options = array( 'http' => array( 'header' => "Accept: application/json", 'header' => "Content-type: application/json", 'header' => "Authorization: Bearer ".$MYAPIKEY, // 'header' => "Content-Length: ".strlen($data), 'content' => $data, ) ); $context = stream_context_create($options); $res = file_get_contents($url.$data, false, $context); if ($res === FALSE) { return 0; } else{ print_r($res); } Ответ: Код (Text): Notice: file_get_contents(): Content-type not specified assuming application/x-www-form-urlencoded in /home/httpd/vhosts/999dice.mcdir.ru/httpdocs/qiwi.php on line 130 Warning: file_get_contents(https://edge.qiwi.com/sinap/api/v2/terms/99/payments{"id":151270434400000,"sum":{"amount":1,"currency":643},"paymentMethod":{"type":"Account","accountId":643},"comment":"My comment","fields":{"account":"+380123456789"}}): failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request in /home/httpd/vhosts/999dice.mcdir.ru/httpdocs/qiwi.php on line 130 130 строка: Код (Text): $res = file_get_contents($url.$data, false, $context); 2) CURL запрос: Код (Text): $url = "https://edge.qiwi.com/sinap/api/v2/terms/99/payments?"; $data["id"] = time()*100000; //Некий id запроса, создаётся мной и должен не превышать 20 символов $data["sum"]["amount"] = 1; $data["sum"]["currency"] = strval(RUB); $data["paymentMethod"]["type"] = "Account"; $data["paymentMethod"]["accountId"] = strval(RUB); $data["comment"] = "My comment"; $data["fields"]["account"] = "+380123456789"; $data = json_encode($data); print_r($data); $headers = [ "Accept: application/json", "Content-type: application/json\r\n", "Authorization: Bearer ".$MYAPIKEY, "Content-Length: " . strlen($data) ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $server_output = curl_exec ($ch); curl_close ($ch); print $server_output ; Ответ: Код (Text): {"id":151270451600000,"sum":{"amount":1,"currency":"643"},"paymentMethod":{"type":"Account","accountId":"643"},"comment":"Hello!()()()","fields":{"account":"+380123456789"}}{"message":"Invalid Json: No content to map due to end-of-input\n at [Source: akka.util.ByteIterator$ByteArrayIterator$$anon$1@3e1fb1b0; line: 1, column: 0]"} Пытаюсь сделать это или через curl или через file_get_contents. Но не получается в обеих случаях. Надеюсь, что кто-то поможет)) Спасибо)
Ну если ты не много по гуглишь, то найдёшь информацию след характера: Что вы не передаёте данный заголовок: Код (Text): application/x-www-form-urlencoded а это значит что php машина фейлит при обработки данного запроса с ошибкой 400 и комментом плохой запрос. То есть что-то вы туда отправляете не верно. --- Добавлено --- Проверьте документацию по работе с qiwi и посмотрите верно ли вы составляете строку запроса. И предавайте заголовок который от вас требует их сервер. Но у меня складывается ощущение, что вы пытаетесь связаться с сервером через кросс-доменные запросы, но я могу ошибаться. А значит вам нужно отправлять соответствующие заголовки с передачей таких данных. "Content-type: application/json\r\n" замените на вот это "Content-type: application/x-www-form-urlencoded"
Вы не подготавливаете ни как POST данные. Вот пример из комментариев в документации PHP: <?php /** make an http POST request and return the response content and headers @param string $url url of the requested script @param array $data hash array of request variables @return returns a hash array with response content and headers in the following form: array ('content'=>'<html></html>' , 'headers'=>array ('HTTP/1.1 200 OK', 'Connection: close', ...) ) */ function http_post ($url, $data) { $data_url = http_build_query ($data); $data_len = strlen ($data_url); return array ('content'=>file_get_contents ($url, false, stream_context_create (array ('http'=>array ('method'=>'POST' , 'header'=>"Connection: close\r\nContent-Length: $data_len\r\n" , 'content'=>$data_url )))) , 'headers'=>$http_response_header ); } ?>