За последние 24 часа нас посетили 21736 программистов и 1017 роботов. Сейчас ищут 666 программистов ...

Отправка POST запроса к QIWI API

Тема в разделе "PHP для новичков", создана пользователем AIMON, 8 дек 2017.

  1. AIMON

    AIMON Новичок

    С нами с:
    8 дек 2017
    Сообщения:
    7
    Симпатии:
    1
    Ситуация следующая. Пытаюсь разобраться в QIWI API. Запрос на получение баланса аккаунта получается и приходит верно, а вот запрос на перевод средств другому человеку не получается.

    Для работы с API требуется помимо каких-то данных отправлять ещё и header'ы, тут проблем нету, но в варианте с переводом средств нужно передать ещё и некоторые данные, связанные с получателем.

    На сайте API написан такой пример запроса на перевод:

    Код (Text):
    1.  
    2. user@server:~$ curl -X POST 'https://edge.qiwi.com/sinap/api/v2/terms/99/payments'
    3.   --header "Content-Type: application/json"
    4.   --header "Accept: application/json"
    5.   --header "Authorization: Bearer YUu2qw048gtdsvlk3iu"
    6.   -d '{
    7.         "id":"11111111111111",
    8.         "sum": {
    9.           "amount":100,
    10.           "currency":"643"
    11.         },
    12.         "paymentMethod": {
    13.           "type":"Account",
    14.           "accountId":"643"
    15.         },
    16.         "comment":"test",
    17.         "fields": {
    18.           "account":"+79121112233"
    19.         }
    20.       }'

    Проблема сейчас в том, как понять это "-d" и как его передать в PHP.
    Вот мой неполный вид запроса. Тут данные я передаю видимо не так, как надо:

    Код (Text):
    1.  
    2. $data = Какая-то информация в массиве;
    3. $url = $this->urls[$achive];
    4.      
    5.         $options = array(
    6.             'http' => array(
    7.                 'header' => $this->headers["accept"],
    8.                 'header'  => $this->headers["contentType"],
    9.                 'header' => $this->headers["authorization"],
    10.                 'd' => json_encode($data),
    11.             )
    12.         );
    13.         $context  = stream_context_create($options);
    14.         $res = file_get_contents($url, false, $context);
    15.         if ($res === FALSE) {
    16.             return 0;
    17.         }
    18.         else{
    19.             return $res;
    20.         }
    Надеюсь, что есть тут кто-то, кто сможет подсказать, в чём проблема)
     
  2. AIMON

    AIMON Новичок

    С нами с:
    8 дек 2017
    Сообщения:
    7
    Симпатии:
    1
    Так же пробую отправлять запрос через curl.
    Вот мои два запроса и ответ от севера
    1) file_get_contents:
    Код (Text):
    1.  
    2. $url = "https://edge.qiwi.com/sinap/api/v2/terms/99/payments";
    3.  
    4. $data["id"] = time()*100000; //Некий id запроса, создаётся мной и должен не превышать 20 символов
    5. $data["sum"]["amount"] = 1;
    6. $data["sum"]["currency"] = strval(RUB);
    7. $data["paymentMethod"]["type"] = "Account";
    8. $data["paymentMethod"]["accountId"] = strval(RUB);
    9. $data["comment"] = "Hello!()()()";
    10. $data["fields"]["account"] = "+380734237599";
    11.  
    12.  
    13. $data = json_encode($data);
    14.      
    15. $options = array(
    16.     'http' => array(
    17.         'header' => "Accept: application/json",
    18.         'header'  => "Content-type: application/json",
    19.         'header' => "Authorization: Bearer ".$MYAPIKEY,
    20.         // 'header' => "Content-Length: ".strlen($data),
    21.         'content' => $data,
    22.     )
    23. );
    24. $context  = stream_context_create($options);
    25. $res = file_get_contents($url.$data, false, $context);
    26. if ($res === FALSE) {
    27.     return 0;
    28. }
    29. else{
    30.     print_r($res);
    31. }
    Ответ:
    Код (Text):
    1.  
    2. 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
    3.  
    4. 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):
    1. $res = file_get_contents($url.$data, false, $context);
    2) CURL запрос:
    Код (Text):
    1.  
    2. $url = "https://edge.qiwi.com/sinap/api/v2/terms/99/payments?";
    3.  
    4. $data["id"] = time()*100000; //Некий id запроса, создаётся мной и должен не превышать 20 символов
    5. $data["sum"]["amount"] = 1;
    6. $data["sum"]["currency"] = strval(RUB);
    7. $data["paymentMethod"]["type"] = "Account";
    8. $data["paymentMethod"]["accountId"] = strval(RUB);
    9. $data["comment"] = "My comment";
    10. $data["fields"]["account"] = "+380123456789";
    11.  
    12. $data = json_encode($data);
    13.  
    14. print_r($data);
    15.  
    16. $headers = [
    17.     "Accept: application/json",
    18.     "Content-type: application/json\r\n",
    19.     "Authorization: Bearer ".$MYAPIKEY,
    20.     "Content-Length: " . strlen($data)
    21. ];
    22.  
    23. $ch = curl_init();
    24. curl_setopt($ch, CURLOPT_URL, $url);
    25. curl_setopt($ch, CURLOPT_POST, 1);
    26. curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    27. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    28. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    29.  
    30. $server_output = curl_exec ($ch);
    31.  
    32. curl_close ($ch);
    33.  
    34. print  $server_output ;
    Ответ:
    Код (Text):
    1.  
    2. {"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. Но не получается в обеих случаях. Надеюсь, что кто-то поможет))
    Спасибо)
     
  3. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Ну если ты не много по гуглишь, то найдёшь информацию след характера:
    Что вы не передаёте данный заголовок:
    Код (Text):
    1. application/x-www-form-urlencoded
    а это значит что php машина фейлит при обработки данного запроса с ошибкой 400 и комментом плохой запрос. То есть что-то вы туда отправляете не верно.
    --- Добавлено ---
    Проверьте документацию по работе с qiwi и посмотрите верно ли вы составляете строку запроса.
    И предавайте заголовок который от вас требует их сервер.
    Но у меня складывается ощущение, что вы пытаетесь связаться с сервером через кросс-доменные запросы, но я могу ошибаться. А значит вам нужно отправлять соответствующие заголовки с передачей таких данных.
    "Content-type: application/json\r\n"
    замените на вот это
    "Content-type: application/x-www-form-urlencoded"
     
  4. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    Вы не подготавливаете ни как POST данные. Вот пример из комментариев в документации

    PHP:
    1. <?php
    2. /**
    3. make an http POST request and return the response content and headers
    4. @param string $url    url of the requested script
    5. @param array $data    hash array of request variables
    6. @return returns a hash array with response content and headers in the following form:
    7.     array ('content'=>'<html></html>'
    8.         , 'headers'=>array ('HTTP/1.1 200 OK', 'Connection: close', ...)
    9.         )
    10. */
    11. function http_post ($url, $data)
    12. {
    13.     $data_url = http_build_query ($data);
    14.     $data_len = strlen ($data_url);
    15.  
    16.     return array ('content'=>file_get_contents ($url, false, stream_context_create (array ('http'=>array ('method'=>'POST'
    17.             , 'header'=>"Connection: close\r\nContent-Length: $data_len\r\n"
    18.             , 'content'=>$data_url
    19.             ))))
    20.         , 'headers'=>$http_response_header
    21.         );
    22. }
    23. ?>