Jump to content

Recommended Posts

Проблема с авторизацией. Завёл новый аккаунт. Добавил его в Администраторы магазина. Зарегистрировал новое приложение с доступом к Яндекс-Маркет. Получил 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 by jonny008
Link to post
Share on other sites

Хочу добавить, то что запрос формируется с необходимыми параметрами.

https://yadi.sk/i/-48UmtdTHgPyZg

В интерфейсе Яндекс Маркета указан метод авторизации HTTP

Все ключи и id_client проверил по 10 раз. 

Скрипт выше, нужен для передачи статуса заказа через админку Симплы. 

Может кто работал через этот метод? Если поможете решить проблему, выложу всё решение в Готовые. Если кто знает в чём причина и хочет денег за подсказку, то пишите в личку.

Link to post
Share on other sites
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
Тело
Отсутствует
Link to post
Share on other sites

Попробуйте в заголовках передать эти данные, может так сервер пропустит. Согласно документации можно в заголовке передать или в урле.

Link to post
Share on other sites
1 минуту назад, a13x сказал:

Попробуйте в заголовках передать эти данные, может так сервер пропустит. Согласно документации можно в заголовке передать или в урле.

Я вроде как и пытаюсь через URL передать запрос с авторизацией. Делал через HEADER. Но получил ответ что данный метод не поддерживается (перед этим менял в интерфейсе способ авторизации).  Ни с одним сервисом (OZON WB) не было столько проблем, сколько с ЯМ. 

Link to post
Share on other sites
$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);

а если так отправить запрос, что отвечает?

Link to post
Share on other sites
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

Link to post
Share on other sites

На стр 
https://yandex.ru/dev/market/partner-dsbs/doc/dg/reference/put-campaigns-id-orders-id-status.html
сказано:

Авторизационные данные передаются в HTTP-заголовке Authorization:
Если ресурс API вызван без авторизационных данных, сервер Маркета возвратит HTTP-статус 401 Unauthorized.

Похоже, тут Ваш случай точно описан. 
Вы почему-то эти авторизационные данные пихаете в URL, а не туда, куда инструкцией велено...

Link to post
Share on other sites
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 by jonny008
Link to post
Share on other sites
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

 

Я написал в поддержку Маркета. Скорее всего проблема на их стороне. 

 Всем спасибо за помощь. 

Link to post
Share on other sites

1. Присланный материал датирован 2015 годом, с большой вероятностью в нем не все актуально.

2. В присланном материале сказано: 

Авторизационные данные могут быть переданы в запросе несколькими способами (способы указаны в порядке приоритета):  в HTTP-заголовке Authorization, в параметрах URL запроса.

То есть даже в 2015 году приоритетно было использование HTTP-заголовка. Весьма вероятно, что к настоящему моменту второй метод устарел и не действует.

3. Текущий online справочник Ямаркета явно более актуален, нежели индивидуально присланный материал. Если еще окажется, что Вам его прислали в 2015-2016 году, то вывод очевиден. 

Link to post
Share on other sites
В 25.11.2021 в 10:31, phukortsin сказал:

1. Присланный материал датирован 2015 годом, с большой вероятностью в нем не все актуально.

2. В присланном материале сказано: 

Авторизационные данные могут быть переданы в запросе несколькими способами (способы указаны в порядке приоритета):  в HTTP-заголовке Authorization, в параметрах URL запроса.

То есть даже в 2015 году приоритетно было использование HTTP-заголовка. Весьма вероятно, что к настоящему моменту второй метод устарел и не действует.

3. Текущий online справочник Ямаркета явно более актуален, нежели индивидуально присланный материал. Если еще окажется, что Вам его прислали в 2015-2016 году, то вывод очевиден. 

Всё верно вы написали. Это я не путёвый) Всё сделал. Спасибо за подсказку. 

Link to post
Share on other sites

Ещё вопрос, если можно. 

Не могу получить 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

Link to post
Share on other sites

Надо проверять, что в таблице есть поле market_order_id и есть запись, у которой в поле запрашиваемый номер стоит...  

И, само собой, проверять значение $request['order']['id'].

Или даже сам запрос к БД выводить и пробовать его отдельно выполнять, например, в PHPMyAdmin...

 

Link to post
Share on other sites
12 минут назад, phukortsin сказал:


А еще может оказаться, что надо использовать $request->order->id.

Не совсем вас понял, где это использовать.

В таблице есть поле market_order_id

https://yadi.sk/i/JAWnPEEkxfaiJA

Все номера в порядке. 

Link to post
Share on other sites

Если не работает, проверять надо ВСЕ по порядку.

Сначала проверять значение $request['order']['id'] ( может оказаться, что вместо него надо использовать $request->order->id).

Потом, если все верно, проверять сам запрос к БД: выводить его и пробовать отдельно выполнять, например, в PHPMyAdmin...

 

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...