jonny008 Опубликовано 23 ноября, 2021 Жалоба Поделиться Опубликовано 23 ноября, 2021 (изменено) Проблема с авторизацией. Завёл новый аккаунт. Добавил его в Администраторы магазина. Зарегистрировал новое приложение с доступом к Яндекс-Маркет. Получил oauth ключ через id_client. Но получаю 401 ошибку. Ниже сам код. В чём может быть проблема? Пробовал создавать приложение через владельца магазина ,история та же. <?php require_once('Simpla.php'); class MarketApi extends Simpla { public function change_order_status($id, $status, $reason = '') { if (empty($id) || empty($status)) { return false; } $url = "https://api.partner.market.yandex.ru/v2/campaigns/".$this->settings->market_campaign_id ."/orders/".$id."/status.json?oauth_token=".$this->settings->market_oauth_token ."&oauth_client_id=".$this->settings->market_oauth_client_id; echo $url."<BR>"; $data = array("order"=>array("status"=>$status)); if (!empty($reason)) { $data['order']['substatus'] = $reason; } $curl = curl_init($url); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json;charset=utf-8')); curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); $response = curl_exec($curl); $headers = curl_getinfo($curl); curl_close($curl); if ($headers['http_code'] != '200') { $response = (empty($response) ? new stdClass() : json_decode($response)); $response->error = (!isset($response->error) ? new stdClass() : $response->error); $response->error->code = (isset($response->error->code) ? $response->error->code : $headers['http_code']); return $response; } return json_decode($response); } } Изменено 23 ноября, 2021 пользователем jonny008 Цитата Ссылка на сообщение Поделиться на другие сайты
jonny008 Опубликовано 23 ноября, 2021 Автор Жалоба Поделиться Опубликовано 23 ноября, 2021 Хочу добавить, то что запрос формируется с необходимыми параметрами. https://yadi.sk/i/-48UmtdTHgPyZg В интерфейсе Яндекс Маркета указан метод авторизации HTTP Все ключи и id_client проверил по 10 раз. Скрипт выше, нужен для передачи статуса заказа через админку Симплы. Может кто работал через этот метод? Если поможете решить проблему, выложу всё решение в Готовые. Если кто знает в чём причина и хочет денег за подсказку, то пишите в личку. Цитата Ссылка на сообщение Поделиться на другие сайты
jonny008 Опубликовано 23 ноября, 2021 Автор Жалоба Поделиться Опубликовано 23 ноября, 2021 4 минуты назад, a13x сказал: Я не знаю в чём проблема, но в коде у вас явно ошибка есть На скрине показа https://yadi.sk/i/WPYlUIMEobDBmg если ответа нет то вы создаёте пустой объект, а в конце этот объект декодируете через json_decode. Это так не работает. Правильнее будет написать не new stdClass() а "[]" и тогда json_decode вернет пустой массив. По данному коду я получаю 401 ошибку от Яндекс Маркета (Code:401, OAuth credentials are not specified). Но данные в запросе присутствуют, мало того, они ещё и верные (я про токен и client_id). Яндекс ничего не отвечает судя по логам. Просто вот такой ответ: Заголовок Connection: close Date: Tue, 23 Nov 2021 15:45:40 GMT Тело Отсутствует Цитата Ссылка на сообщение Поделиться на другие сайты
a13x Опубликовано 23 ноября, 2021 Жалоба Поделиться Опубликовано 23 ноября, 2021 Попробуйте в заголовках передать эти данные, может так сервер пропустит. Согласно документации можно в заголовке передать или в урле. Цитата Ссылка на сообщение Поделиться на другие сайты
jonny008 Опубликовано 23 ноября, 2021 Автор Жалоба Поделиться Опубликовано 23 ноября, 2021 1 минуту назад, a13x сказал: Попробуйте в заголовках передать эти данные, может так сервер пропустит. Согласно документации можно в заголовке передать или в урле. Я вроде как и пытаюсь через URL передать запрос с авторизацией. Делал через HEADER. Но получил ответ что данный метод не поддерживается (перед этим менял в интерфейсе способ авторизации). Ни с одним сервисом (OZON WB) не было столько проблем, сколько с ЯМ. Цитата Ссылка на сообщение Поделиться на другие сайты
jonny008 Опубликовано 23 ноября, 2021 Автор Жалоба Поделиться Опубликовано 23 ноября, 2021 Может нужно подождать после смены способа авторизации минут 30. Цитата Ссылка на сообщение Поделиться на другие сайты
a13x Опубликовано 23 ноября, 2021 Жалоба Поделиться Опубликовано 23 ноября, 2021 $opts = array("http"=>array("method"=>"GET","header"=>"")); $context = stream_context_create($opts); $url = sprintf("https://api.partner.market.yandex.ru/v2/campaigns/%s/orders/%d/status.json?oauth_token=%s&oauth_client_id=%s", $this->settings->market_campaign_id, $id, $this->settings->market_oauth_token, $this->settings->market_oauth_client_id); $response = file_get_contents($url, false, $context); print_r($response); а если так отправить запрос, что отвечает? Цитата Ссылка на сообщение Поделиться на другие сайты
jonny008 Опубликовано 23 ноября, 2021 Автор Жалоба Поделиться Опубликовано 23 ноября, 2021 1 час назад, a13x сказал: $opts = array("http"=>array("method"=>"GET","header"=>"")); $context = stream_context_create($opts); $url = sprintf("https://api.partner.market.yandex.ru/v2/campaigns/%s/orders/%d/status.json?oauth_token=%s&oauth_client_id=%s", $this->settings->market_campaign_id, $id, $this->settings->market_oauth_token, $this->settings->market_oauth_client_id); $response = file_get_contents($url, false, $context); print_r($response); а если так отправить запрос, что отвечает? Unexpected end of content Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 24 ноября, 2021 Жалоба Поделиться Опубликовано 24 ноября, 2021 На стр https://yandex.ru/dev/market/partner-dsbs/doc/dg/reference/put-campaigns-id-orders-id-status.html сказано: Авторизационные данные передаются в HTTP-заголовке Authorization: Если ресурс API вызван без авторизационных данных, сервер Маркета возвратит HTTP-статус 401 Unauthorized. Похоже, тут Ваш случай точно описан. Вы почему-то эти авторизационные данные пихаете в URL, а не туда, куда инструкцией велено... Цитата Ссылка на сообщение Поделиться на другие сайты
jonny008 Опубликовано 24 ноября, 2021 Автор Жалоба Поделиться Опубликовано 24 ноября, 2021 (изменено) 52 минуты назад, phukortsin сказал: На стр https://yandex.ru/dev/market/partner-dsbs/doc/dg/reference/put-campaigns-id-orders-id-status.html сказано: Авторизационные данные передаются в HTTP-заголовке Authorization: Если ресурс API вызван без авторизационных данных, сервер Маркета возвратит HTTP-статус 401 Unauthorized. Похоже, тут Ваш случай точно описан. Вы почему-то эти авторизационные данные пихаете в URL, а не туда, куда инструкцией велено... В Яндекс Маркете предусмотрено два способа авторизации. HEADER и URL. В панели управления магазином ЯМ, выбрано именно URL. https://yadi.sk/i/fqO0CTQ7sTxlEg Изменено 24 ноября, 2021 пользователем jonny008 Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 24 ноября, 2021 Жалоба Поделиться Опубликовано 24 ноября, 2021 На стр https://yandex.ru/dev/market/partner-marketplace-cd/doc/dg/concepts/authorization.html сказано "Авторизационные данные передаются в HTTP-заголовке". Не нахожу, где говорится про два способа, можете ссылочку дать? Цитата Ссылка на сообщение Поделиться на другие сайты
jonny008 Опубликовано 25 ноября, 2021 Автор Жалоба Поделиться Опубликовано 25 ноября, 2021 21 час назад, phukortsin сказал: На стр https://yandex.ru/dev/market/partner-marketplace-cd/doc/dg/concepts/authorization.html сказано "Авторизационные данные передаются в HTTP-заголовке". Не нахожу, где говорится про два способа, можете ссылочку дать? Я руководствовался тем материалом, который прислал менеджер Яндекса https://yadi.sk/i/kDF3SKFGDTY9kQ 7 стр. Может что-то поменялось, но на бэкенде Яндекс-Маркет есть чёткое понятие метода авторизации: HEADER или URL. https://yadi.sk/i/fqO0CTQ7sTxlEg Я написал в поддержку Маркета. Скорее всего проблема на их стороне. Всем спасибо за помощь. Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 25 ноября, 2021 Жалоба Поделиться Опубликовано 25 ноября, 2021 1. Присланный материал датирован 2015 годом, с большой вероятностью в нем не все актуально. 2. В присланном материале сказано: Авторизационные данные могут быть переданы в запросе несколькими способами (способы указаны в порядке приоритета): в HTTP-заголовке Authorization, в параметрах URL запроса. То есть даже в 2015 году приоритетно было использование HTTP-заголовка. Весьма вероятно, что к настоящему моменту второй метод устарел и не действует. 3. Текущий online справочник Ямаркета явно более актуален, нежели индивидуально присланный материал. Если еще окажется, что Вам его прислали в 2015-2016 году, то вывод очевиден. Цитата Ссылка на сообщение Поделиться на другие сайты
jonny008 Опубликовано 26 ноября, 2021 Автор Жалоба Поделиться Опубликовано 26 ноября, 2021 В 25.11.2021 в 10:31, phukortsin сказал: 1. Присланный материал датирован 2015 годом, с большой вероятностью в нем не все актуально. 2. В присланном материале сказано: Авторизационные данные могут быть переданы в запросе несколькими способами (способы указаны в порядке приоритета): в HTTP-заголовке Authorization, в параметрах URL запроса. То есть даже в 2015 году приоритетно было использование HTTP-заголовка. Весьма вероятно, что к настоящему моменту второй метод устарел и не действует. 3. Текущий online справочник Ямаркета явно более актуален, нежели индивидуально присланный материал. Если еще окажется, что Вам его прислали в 2015-2016 году, то вывод очевиден. Всё верно вы написали. Это я не путёвый) Всё сделал. Спасибо за подсказку. Цитата Ссылка на сообщение Поделиться на другие сайты
jonny008 Опубликовано 27 ноября, 2021 Автор Жалоба Поделиться Опубликовано 27 ноября, 2021 Ещё вопрос, если можно. Не могу получить id заказа через через market_order_id (само значение есть) в файле Orders изменил get_order на /*Выборка конкретного заказа*/ public function get_order($id, $is_market_order = false) { if (empty($id)) { return false; } if ($is_market_order) { $where = $this->db->placehold('WHERE o.market_order_id=? ', intval($id)); } else if(is_int($id)) { $where = $this->db->placehold('AND o.id=? ', intval($id)); } else { $where = $this->db->placehold('AND o.url=? ', $id); } Пытаюсь получить вот так: $order = $simpla->orders->get_order($request['order']['id'], true); ['order']['id'] - есть в получаемом json'e https://yadi.sk/i/hDnkem-1gZ-DIA Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 27 ноября, 2021 Жалоба Поделиться Опубликовано 27 ноября, 2021 Надо проверять, что в таблице есть поле market_order_id и есть запись, у которой в поле запрашиваемый номер стоит... И, само собой, проверять значение $request['order']['id']. Или даже сам запрос к БД выводить и пробовать его отдельно выполнять, например, в PHPMyAdmin... Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 27 ноября, 2021 Жалоба Поделиться Опубликовано 27 ноября, 2021 (изменено) А еще может оказаться, что надо использовать $request->order->id. Изменено 27 ноября, 2021 пользователем phukortsin Цитата Ссылка на сообщение Поделиться на другие сайты
jonny008 Опубликовано 27 ноября, 2021 Автор Жалоба Поделиться Опубликовано 27 ноября, 2021 12 минут назад, phukortsin сказал: А еще может оказаться, что надо использовать $request->order->id. Не совсем вас понял, где это использовать. В таблице есть поле market_order_id https://yadi.sk/i/JAWnPEEkxfaiJA Все номера в порядке. Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 27 ноября, 2021 Жалоба Поделиться Опубликовано 27 ноября, 2021 Если не работает, проверять надо ВСЕ по порядку. Сначала проверять значение $request['order']['id'] ( может оказаться, что вместо него надо использовать $request->order->id). Потом, если все верно, проверять сам запрос к БД: выводить его и пробовать отдельно выполнять, например, в PHPMyAdmin... Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.