jonny008 Posted November 23, 2021 Report Share Posted November 23, 2021 (edited) Проблема с авторизацией. Завёл новый аккаунт. Добавил его в Администраторы магазина. Зарегистрировал новое приложение с доступом к Яндекс-Маркет. Получил 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); } } Edited November 23, 2021 by jonny008 Quote Link to post Share on other sites
jonny008 Posted November 23, 2021 Author Report Share Posted November 23, 2021 Хочу добавить, то что запрос формируется с необходимыми параметрами. https://yadi.sk/i/-48UmtdTHgPyZg В интерфейсе Яндекс Маркета указан метод авторизации HTTP Все ключи и id_client проверил по 10 раз. Скрипт выше, нужен для передачи статуса заказа через админку Симплы. Может кто работал через этот метод? Если поможете решить проблему, выложу всё решение в Готовые. Если кто знает в чём причина и хочет денег за подсказку, то пишите в личку. Quote Link to post Share on other sites
jonny008 Posted November 23, 2021 Author Report Share Posted November 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 Тело Отсутствует Quote Link to post Share on other sites
a13x Posted November 23, 2021 Report Share Posted November 23, 2021 Попробуйте в заголовках передать эти данные, может так сервер пропустит. Согласно документации можно в заголовке передать или в урле. Quote Link to post Share on other sites
jonny008 Posted November 23, 2021 Author Report Share Posted November 23, 2021 1 минуту назад, a13x сказал: Попробуйте в заголовках передать эти данные, может так сервер пропустит. Согласно документации можно в заголовке передать или в урле. Я вроде как и пытаюсь через URL передать запрос с авторизацией. Делал через HEADER. Но получил ответ что данный метод не поддерживается (перед этим менял в интерфейсе способ авторизации). Ни с одним сервисом (OZON WB) не было столько проблем, сколько с ЯМ. Quote Link to post Share on other sites
jonny008 Posted November 23, 2021 Author Report Share Posted November 23, 2021 Может нужно подождать после смены способа авторизации минут 30. Quote Link to post Share on other sites
a13x Posted November 23, 2021 Report Share Posted November 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); а если так отправить запрос, что отвечает? Quote Link to post Share on other sites
jonny008 Posted November 23, 2021 Author Report Share Posted November 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 Quote Link to post Share on other sites
phukortsin Posted November 24, 2021 Report Share Posted November 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, а не туда, куда инструкцией велено... Quote Link to post Share on other sites
jonny008 Posted November 24, 2021 Author Report Share Posted November 24, 2021 (edited) 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 Edited November 24, 2021 by jonny008 Quote Link to post Share on other sites
phukortsin Posted November 24, 2021 Report Share Posted November 24, 2021 На стр https://yandex.ru/dev/market/partner-marketplace-cd/doc/dg/concepts/authorization.html сказано "Авторизационные данные передаются в HTTP-заголовке". Не нахожу, где говорится про два способа, можете ссылочку дать? Quote Link to post Share on other sites
jonny008 Posted November 25, 2021 Author Report Share Posted November 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 Я написал в поддержку Маркета. Скорее всего проблема на их стороне. Всем спасибо за помощь. Quote Link to post Share on other sites
phukortsin Posted November 25, 2021 Report Share Posted November 25, 2021 1. Присланный материал датирован 2015 годом, с большой вероятностью в нем не все актуально. 2. В присланном материале сказано: Авторизационные данные могут быть переданы в запросе несколькими способами (способы указаны в порядке приоритета): в HTTP-заголовке Authorization, в параметрах URL запроса. То есть даже в 2015 году приоритетно было использование HTTP-заголовка. Весьма вероятно, что к настоящему моменту второй метод устарел и не действует. 3. Текущий online справочник Ямаркета явно более актуален, нежели индивидуально присланный материал. Если еще окажется, что Вам его прислали в 2015-2016 году, то вывод очевиден. Quote Link to post Share on other sites
jonny008 Posted November 26, 2021 Author Report Share Posted November 26, 2021 В 25.11.2021 в 10:31, phukortsin сказал: 1. Присланный материал датирован 2015 годом, с большой вероятностью в нем не все актуально. 2. В присланном материале сказано: Авторизационные данные могут быть переданы в запросе несколькими способами (способы указаны в порядке приоритета): в HTTP-заголовке Authorization, в параметрах URL запроса. То есть даже в 2015 году приоритетно было использование HTTP-заголовка. Весьма вероятно, что к настоящему моменту второй метод устарел и не действует. 3. Текущий online справочник Ямаркета явно более актуален, нежели индивидуально присланный материал. Если еще окажется, что Вам его прислали в 2015-2016 году, то вывод очевиден. Всё верно вы написали. Это я не путёвый) Всё сделал. Спасибо за подсказку. Quote Link to post Share on other sites
jonny008 Posted November 27, 2021 Author Report Share Posted November 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 Quote Link to post Share on other sites
phukortsin Posted November 27, 2021 Report Share Posted November 27, 2021 Надо проверять, что в таблице есть поле market_order_id и есть запись, у которой в поле запрашиваемый номер стоит... И, само собой, проверять значение $request['order']['id']. Или даже сам запрос к БД выводить и пробовать его отдельно выполнять, например, в PHPMyAdmin... Quote Link to post Share on other sites
phukortsin Posted November 27, 2021 Report Share Posted November 27, 2021 (edited) А еще может оказаться, что надо использовать $request->order->id. Edited November 27, 2021 by phukortsin Quote Link to post Share on other sites
jonny008 Posted November 27, 2021 Author Report Share Posted November 27, 2021 12 минут назад, phukortsin сказал: А еще может оказаться, что надо использовать $request->order->id. Не совсем вас понял, где это использовать. В таблице есть поле market_order_id https://yadi.sk/i/JAWnPEEkxfaiJA Все номера в порядке. Quote Link to post Share on other sites
phukortsin Posted November 27, 2021 Report Share Posted November 27, 2021 Если не работает, проверять надо ВСЕ по порядку. Сначала проверять значение $request['order']['id'] ( может оказаться, что вместо него надо использовать $request->order->id). Потом, если все верно, проверять сам запрос к БД: выводить его и пробовать отдельно выполнять, например, в PHPMyAdmin... Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.