Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: PUT запрос (CURL) для Яндекс "Покупка на маркете"

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
deadlexus
Отправлено: 27 Марта, 2014 - 12:40:55
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Март 2014  


Помог: 0 раз(а)




Добрый день. Делаю реализацию "Покупка на маркете"
http://api[dot]yandex[dot]ru/market/part[dot][dot][dot]hase-methods[dot]xml
Все запросы к магазину обработал, все работает как надо, возникла проблема при отправке запроса на сам Яндекс Маркет:
http://api[dot]yandex[dot]ru/market/part[dot][dot][dot]rs-id-status[dot]xml

Реализовал это все таким образом:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. $headers = array(
  3.                             'Accept: application/json',
  4.                             'Content-Type: application/json',
  5.                             'Authorization: OAuth oauth_token="'.$token.'", oauth_client_id="'.$client_id.'", oauth_login="'.$login.'"'
  6.                         );
  7.  
  8.                         $data = json_encode(array('order' => array('status' => 'DELIVERY')));
  9.                         $url = 'https://api.partner.market.yandex.ru/v2/campaigns/21117492/orders/'.$yandex_id.'/status.json';
  10.  
  11.                         $fname=tempnam('','');
  12.                         file_put_contents($fname,$data);
  13.  
  14.                         $ch = curl_init();
  15.                         curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  16.                         curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
  17.                         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  18.                         //curl_setopt($ch, CURLOPT_HEADER, true);
  19.                         curl_setopt($ch, CURLOPT_URL, $url);
  20.                         curl_setopt($ch, CURLOPT_PUT, true);
  21.                         curl_setopt($ch, CURLOPT_INFILE, $fname);
  22.                         curl_setopt($ch, CURLOPT_INFILESIZE, filesize($fname));
  23.                         curl_setopt($ch, CURLOPT_UPLOAD, true);
  24.                        
  25.                         $yand_result = curl_exec($ch);
  26.  
  27.                         curl_close($ch);
  28.  


В ответ приходит ошибка:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. {"error":{"code":405,"message":"Request method 'PUT' not supported"}}
  3.  


Писал в поддержку по этому поводу, на что получил следующий ответ:

Данная ошибка может возникать в случае, если в запросе отсутствует файл с XML или JSON-кодом запроса, либо файл является пустым. Необходимо убедиться, что файл с XML или JSON-кодом формируется и передаётся Вашей программой корректно, в том числе используется именно метод PUT.

Может кто-то сталкивался с этим или хотя бы сможет направить в нужную сторону? Заранее спасибо.

(Отредактировано автором: 27 Марта, 2014 - 12:45:35)

 
 Top
Мелкий Супермодератор
Отправлено: 27 Марта, 2014 - 13:07:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Измените URL на какой-нибудь свой test.php даже с банальным содержимым:

И то будет видно, PUT ли используется.

http://www.php.net/manual/en/fun....curl-setopt.php
Над CURLOPT_INFILE написано: "value should be a stream resource", а вы строку передаёте.
У вас отключен вывод ошибок? По этому поводу warning идёт.


-----
PostgreSQL DBA
 
 Top
deadlexus
Отправлено: 27 Марта, 2014 - 13:35:10
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Март 2014  


Помог: 0 раз(а)




Да, все верно, спасибо. Поправил:
CODE (htmlphp):
скопировать код в буфер обмена
  1. $fname=tempnam('','');
  2.                         file_put_contents($fname,$data);
  3.                         $datafile = fopen($fname, 'r');
  4.                         //$postVars['files[]'] = "@".$fname;
  5.  
  6.                         $ch = curl_init();
  7.                         curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  8.                         curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
  9.                         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  10.                         //curl_setopt($ch, CURLOPT_HEADER, true);
  11.                         curl_setopt($ch, CURLOPT_URL, $url);
  12.                         curl_setopt($ch, CURLOPT_PUT, true);
  13.                         curl_setopt($ch, CURLOPT_INFILE, $datafile);
  14.                         curl_setopt($ch, CURLOPT_INFILESIZE, filesize($fname));
  15.                         curl_setopt($ch, CURLOPT_UPLOAD, true);


Однако основную проблему это не решило, файл отправляется как нужно, проверил. Используется PUT, но в ответ все равно приходит ошибка...
 
 Top
Ch_chov
Отправлено: 27 Марта, 2014 - 13:58:01
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




Данные должны быть в теле запроса. upload файла вооще не нужно делать.
(Добавление)
Мелкий пишет:
Измените URL на какой-нибудь свой test.php даже с банальным содержимым

На яндекс маркете есть специальный интерфейс для отладки входящих запросов.
http://api[dot]yandex[dot]ru/market/part[dot][dot][dot]epts/sandbox[dot]xml
 
 Top
deadlexus
Отправлено: 27 Марта, 2014 - 14:28:19
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Март 2014  


Помог: 0 раз(а)




Ch_chov пишет:
Данные должны быть в теле запроса. upload файла вооще не нужно делать.

deadlexus пишет:
Писал в поддержку по этому поводу, на что получил следующий ответ:

Данная ошибка может возникать в случае, если в запросе отсутствует файл с XML или JSON-кодом запроса, либо файл является пустым. Необходимо убедиться, что файл с XML или JSON-кодом формируется и передаётся Вашей программой корректно, в том числе используется именно метод PUT.


Ch_chov пишет:
На яндекс маркете есть специальный интерфейс для отладки входящих запросов.

Да, там есть отладочный модуль, но в нем отображаются только запросы к магазину. Их обработка у меня уже реализована. Мне необходимо реализовать запрос от магазина к маркету, лога данных запросов в отладочном модуле нет.
 
 Top
Ch_chov
Отправлено: 27 Марта, 2014 - 14:44:09
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




deadlexus пишет:
Писал в поддержку по этому поводу, на что получил следующий ответ:

Данная ошибка может возникать в случае, если в запросе отсутствует файл с XML или JSON-кодом запроса, либо файл является пустым. Необходимо убедиться, что файл с XML или JSON-кодом формируется и передаётся Вашей программой корректно, в том числе используется именно метод PUT.

Вы не правильно поняли, то что они вам ответили. Данные (файл) должны быть в теле запроса. Не нужно их форматировать как multipart/form-data.
(Добавление)
PHP:
скопировать код в буфер обмена
  1.   $headers = array(
  2.     'Content-Type: application/json',
  3.     ym_authorization_header(),
  4.   );
  5.  
  6.   $ch = curl_init($url);
  7.   curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  8.   curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  9.   curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
  10.  
  11.   $data = new stdClass;
  12.   $data->order = new stdClass;
  13.   $data->order->status = $status
  14.   if ($data->order->status == 'CANCELLED') {
  15.     $data->order->substatus = $substatus;
  16.   }
  17.  
  18.   curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
  19.   $response = curl_exec($ch);
 
 Top
deadlexus
Отправлено: 27 Марта, 2014 - 16:11:26
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Март 2014  


Помог: 0 раз(а)




Попробовал так, все равно не хочет работать... Даже и не знаю в какую сторону копать уже...
 
 Top
deadlexus
Отправлено: 31 Марта, 2014 - 12:24:24
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Март 2014  


Помог: 0 раз(а)




Все, сделал. Все работает. Если кому интересно, вот код:
PHP:
скопировать код в буфер обмена
  1.  
  2. $url="https://api.partner.market.yandex.ru/v2/campaigns/$campaign/orders/$yandex_order_id/status?oauth_token=$token&oauth_client_id=$app_id&oauth_login=$login";
  3.  
  4.                         // Содержимое запроса
  5.  
  6.                         if($order_status == 'CANCELLED')
  7.                                 $body = json_encode(array("order" => array ("status" => $order_status, "substatus" => "SHOP_FAILED")));
  8.                         else
  9.                                 $body = json_encode(array("order" => array ("status" => $order_status)));
  10.  
  11.                         // Создание временного файла, содержимое которого будет передано методом PUT
  12.                         $fp = fopen('php://temp/maxmemory:256000', 'w');
  13.                         fwrite($fp, $body);
  14.                         fseek($fp, 0);
  15.  
  16.                         // Выполнение PUT-запроса и вывод результата
  17.                         $ch = curl_init();
  18.                         curl_setopt($ch, CURLOPT_URL, $url);
  19.                         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  20.                         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  21.                         curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/json', 'Accept: application/json', 'Expect:'));
  22.                         curl_setopt($ch, CURLOPT_PUT, true);
  23.                         curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
  24.                         curl_setopt($ch, CURLOPT_INFILE, $fp);
  25.                         curl_setopt($ch, CURLOPT_INFILESIZE, strlen($body));  
  26.  
  27.                         $output = curl_exec($ch);
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« HTTP и PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB