Перейти к содержанию
Официальный форум поддержки Simpla

Рекомендуемые сообщения

Проблема с авторизацией. Завёл новый аккаунт. Добавил его в Администраторы магазина. Зарегистрировал новое приложение с доступом к Яндекс-Маркет. Получил 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);
    }

}

 

Изменено пользователем jonny008
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

Ссылка на сообщение
Поделиться на другие сайты
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
Тело
Отсутствует
Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты
1 минуту назад, a13x сказал:

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

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

Ссылка на сообщение
Поделиться на другие сайты
$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);

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

Ссылка на сообщение
Поделиться на другие сайты
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

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Ссылка на сообщение
Поделиться на другие сайты
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

Изменено пользователем jonny008
Ссылка на сообщение
Поделиться на другие сайты

На стр

https://yandex.ru/dev/market/partner-marketplace-cd/doc/dg/concepts/authorization.html

сказано "Авторизационные данные передаются в HTTP-заголовке".

 

Не нахожу, где говорится про два способа, можете ссылочку дать?

Ссылка на сообщение
Поделиться на другие сайты
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

 

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Ссылка на сообщение
Поделиться на другие сайты
В 25.11.2021 в 10:31, phukortsin сказал:

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

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

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

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

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

Ссылка на сообщение
Поделиться на другие сайты


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

Изменено пользователем phukortsin
Ссылка на сообщение
Поделиться на другие сайты
12 минут назад, phukortsin сказал:


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

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

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

https://yadi.sk/i/JAWnPEEkxfaiJA

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...