GithubHelp home page GithubHelp logo

ozon-seller's Introduction

Ozon-seller API client

tests Coverage Status

Latest Stable Version Total Downloads Latest Unstable Version License

Документация Ozon Api

https://docs.ozon.ru/api/seller

Установка

composer require gam6itko/ozon-seller

Для взаимодействия библиотеки с Ozon-Api нужно дополнительно установить реализации PSR-18: HTTP Client и PSR-17: HTTP Factories.

Использование с Symfony

https://symfony.com/doc/current/components/http_client.html#psr-18-and-psr-17

composer require symfony/http-client
composer require nyholm/psr7
use Gam6itko\OzonSeller\Service\V1\ProductService;
use Symfony\Component\HttpClient\Psr18Client;

$config = [$_SERVER['CLIENT_ID'], $_SERVER['API_KEY'], $_SERVER['API_URL']];
$client = new Psr18Client();
$svc = new ProductService($config, $client);
//do stuff

Использование без Symfony

composer require php-http/guzzle6-adapter
use Gam6itko\OzonSeller\Service\V1\CategoriesService;
use GuzzleHttp\Client as GuzzleClient;
use Http\Adapter\Guzzle6\Client as GuzzleAdapter;
use Http\Factory\Guzzle\RequestFactory;
use Http\Factory\Guzzle\StreamFactory;

$config = [
    'clientId' => '<ozon seller client-id>',
    'apiKey' => '<ozon seller api-key>',
    'host' => 'http://cb-api.ozonru.me/'
];
$client = new GuzzleAdapter(new GuzzleClient());
$requestFactory = new RequestFactory();
$streamFactory = new StreamFactory();

$svc = new CategoriesService($config, $client, $requestFactory, $streamFactory);
//do stuff

Реализованные методы

Чтобы узнать какой класс и метод реализуют запрос на нужный URL воспользуйтесь скриптом bin/is_realized.php

php bin/is_realized.php | grep /v2/posting/fbs/get

output

/v2/posting/fbs/get: Gam6itko\OzonSeller\Service\V2\Posting\FbsService::get
/v2/posting/fbs/get-by-barcode: NotRealized

Автор не всегда успевает добавлять реализации новых методов. Если нужного вам метода нет в библиотеке, то не стесняйтесь открыть issue или PR.

Примеры использования

Больше примеров смотрите в папке tests/Service/

Categories

use Gam6itko\OzonSeller\Service\V1\CategoriesService;
use GuzzleHttp\Client as GuzzleClient;
use Http\Adapter\Guzzle6\Client as GuzzleAdapter;

$config = [
    'clientId' => '<ozon seller client-id>',
    'apiKey' => '<ozon seller api-key>',
    'host' => 'http://cb-api.ozonru.me/' //sandbox
];
$adapter = new GuzzleAdapter(new GuzzleClient());
$svc = new CategoriesService($config, $adapter);

//Server Response example: https://cb-api.ozonru.me/apiref/en/#t-title_categories
$categoryTree = $svc->tree();

//Server Response example: https://cb-api.ozonru.me/apiref/en/#t-title_get_categories_attributes
$attributes = $svc->attributes(17038826);

Posting Crossborder

get info

/v2/posting/crossborder/get

use Gam6itko\OzonSeller\Service\V2\Posting\CrossborderService;
use GuzzleHttp\Client as GuzzleClient;
use Http\Adapter\Guzzle6\Client as GuzzleAdapter;

$config = [
    'clientId' => '<ozon seller client-id>',
    'apiKey' => '<ozon seller api-key>',
    'host' => 'http://cb-api.ozonru.me/'
];
$adapter = new GuzzleAdapter(new GuzzleClient());
$svc = new CrossborderService($config, $adapter);

$postingNumber = '39268230-0002-3';
$orderArr = $svc->get($postingNumber);
echo json_encode($orderArr);
{
  "result": [
    {
      "address": {
        "address_tail": "г. Москва, ул. Центральная, 1",
        "addressee": "Петров Иван Владимирович",
        "city": "Москва",
        "comment": "",
        "country": "Россия",
        "district": "",
        "phone": "+7 495 123-45-67",
        "region": "Москва",
        "zip_code": "101000"
      },
      "auto_cancel_date": "2019-11-18T11:30:11.571Z",
      "cancel_reason_id": 76,
      "created_at": "2019-11-18T11:30:11.571Z",
      "customer_email": "[email protected]",
      "customer_id": 60006,
      "in_process_at": "2019-11-18T11:30:11.571Z",
      "order_id": 77712345,
      "order_nr": "1111444",
      "posting_number": "39268230-0002-3",
      "products": [
        {
          "name": "Фитнес-браслет",
          "offer_id": "DEP-1234",
          "price": "1900.00",
          "quantity": 1,
          "sku": 100056
        }
      ],
      "shipping_provider_id": 0,
      "status": "awaiting_approve",
      "tracking_number": ""
    }
  ]
}

Products

import

/v1/product/import

use Gam6itko\OzonSeller\Service\V1\ProductService;
use GuzzleHttp\Client as GuzzleClient;
use Http\Adapter\Guzzle6\Client as GuzzleAdapter;

$config = [
    'clientId' => '<ozon seller client-id>',
    'apiKey' => '<ozon seller api-key>',
    // use prod host by default
];
$adapter = new GuzzleAdapter(new GuzzleClient());
$svcProduct = new ProductService($config, $adapter);
$product = [
    'barcode'        => '8801643566784',
    'description'    => 'Red Samsung Galaxy S9 with 512GB',
    'category_id'    => 17030819,
    'name'           => 'Samsung Galaxy S9',
    'offer_id'       => 'REDSGS9-512',
    'price'          => '79990',
    'old_price'      => '89990',
    'premium_price'  => '75555',
    'vat'            => '0',
    'vendor'         => 'Samsung',
    'vendor_code'    => 'SM-G960UZPAXAA',
    'height'         => 77,
    'depth'          => 11,
    'width'          => 120,
    'dimension_unit' => 'mm',
    'weight'         => 120,
    'weight_unit'    => 'g',
    'images'         => [
        [
            'file_name' => 'https://ozon-st.cdn.ngenix.net/multimedia/c1200/1022555115.jpg',
            'default'   => true,
        ],
        [
            'file_name' => 'https://ozon-st.cdn.ngenix.net/multimedia/c1200/1022555110.jpg',
            'default'   => false,
        ],
        [
            'file_name' => 'https://ozon-st.cdn.ngenix.net/multimedia/c1200/1022555111.jpg',
            'default'   => false,
        ],
    ],
    'attributes'     => [
        [
            'id'    => 8229,
            'value' => '4747',
        ],
        [
            'id'    => 9048,
            'value' => 'Samsung Galaxy S9',
        ],
        [
            'id'    => 4742,
            'value' => '512 ГБ',
        ],

        [
            'id'         => 4413,
            'collection' => ['1', '2', '13'],
        ],
        [
            'id'                 => 4018,
            'complex_collection' => [
                [
                    'collection' => [
                        [
                            'id'    => 4068,
                            'value' => 'Additional video',
                        ],
                        [
                            'id'    => 4074,
                            'value' => '5_-NKRVn7IQ',
                        ],
                    ],
                ],
                [
                    'collection' => [
                        [
                            'id'    => 4068,
                            'value' => 'Another one video',
                        ],
                        [
                            'id'    => 4074,
                            'value' => '5_-NKRVn7IQ',
                        ],
                    ],
                ],
            ],
        ],
    ],
];

$svcProduct->import($product);
// or
$svcProduct->import([$product, $product1, $product2, ...]);
// or
$res = $svcProduct->import(['items' => [$product, $product1, $product2, ...] ]);
echo $res['task_id']; // save it for checking by `importInfo`

ozon-seller's People

Contributors

animkatt avatar aratnikov avatar ebykovski avatar electromystyle avatar exlh avatar f4llou7 avatar gam6itko avatar holdmann avatar jumas-cola avatar nickmitin avatar sergei11156 avatar vampirus avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ozon-seller's Issues

Некорректная обработка статусов ответа

Со вчера начали сыпаться эксепшены

Client error: POST `http://api-seller.ozon.ru/v3/posting/fbs/list` resulted in a `405 Method Not Allowed` response

В AbstractService идет проверка только содержимого контента, но в данном случае нужно проверять статус, тк боди пустое.

Соответственно на выходе получаем пустой эксепшен

Gam6itko\OzonSeller\Exception\OzonSellerException Object
(
    [details:protected] => Array
        (
        )

    [message:protected] => 
    [string:Exception:private] => 
    [code:protected] => 0
    [file:protected] => /var/www/vhosts/***/local/php_interface/vendor/gam6itko/ozon-seller/src/Service/AbstractService.php
    [line:protected] => 146
    [trace:Exception:private] => Array
        (
)

image

PHP Fatal error при 502 ответе озона

Озон отвечает 502 кодом и

<html>
<head><title>502 Bad Gateway</title></head>
<body>
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx</center>
</body>
</html>

В итоге ошибка
PHP Fatal error: Uncaught RuntimeException: Invalid json error response: in /vendor/gam6itko/ozon-seller/src/Service/AbstractService.php:127

Ошибка в запросе

Для получения отчета по товарам используется запрос со словом products, а не product.

primary_image в import и update

Поддержка Озона про /import сообщает:

Добавили в запрос параметр primary_image — ссылка на главное изображение товара. Если у вас одно изображение, то его не нужно будет указывать в параметре images, а только в primary_image

Но правила валидации product_validator_v2.php не позволяют опустить параметр images.

Не смотря на то, что в документации озона предлагается указывать главное изображение первым в списке images, мы столкнулись с ошибкам обработки фотографий на стороне Озона. Поэтому нужно явно задавать главное в primary_image

Добавить функцию в сервис

Добрый день. Неплохо было бы добавить функцию tree - получения списка категорий от Озон
И она могла бы выглядеть так:

    /**
     * Receive the tree of categories for a specified category or full categories tree.
     *
     * @param array $categoryId [attribute_type, language]
     *
     * @return mixed|\Psr\Http\Message\ResponseInterface
     */
    public function tree(int $categoryId = 0, array $query = []): array
    {
        $query = ArrayHelper::pick($query, ['category_id', 'language']);
        $query = TypeCaster::castArr($query, [
            'category_id'    => 'int',
            'language'       => 'str',
        ]);
        if($categoryId > 0) {
            $query = array_merge([
                'category_id'    => $categoryId,
            ], $query);
        }
        $query = array_merge([
            'language'    => 'RU',
        ], $query);
        return $this->request('POST', "{$this->path}/tree", $query);
    }

при 0 d category_id выгружается все дерево

PHP 7.0 version support

Package gam6itko/ozon-seller at version has a PHP requirement incompatible with your PHP version (7.0.33)

/v1/chat/list too slowly,can you help me

Chat list(/v1/chat/list ) has too much data and is pulled too slowly. Can you provide change time parameters. It takes one hour to pull a store, and many stores can't be pulled at all,can you help me

Вопрос по ProductService V3

Добрый день, подскажите, будет ли реализован в ближайшее время в вашей библиотеки ProductService V3?
С 30 августа 2022 года Ozon отключает часть методов, и в списке по ссылке Отключение методов есть следующие строки:
Информация о количестве остатков -> /v3/product/info/stocks
Получить описание характеристик товара -> /v3/products/info/attributes
Методы предыдущих версий будут не доступны.

Service\V2\Posting\FbsService unfulfilledList ошибка, если не передать with

Если при вызове unfulfilledList не передать значение with, то озон не может распарсить такой json
{"with":[],"status":["awaiting_packaging"],"sort_by":"updated_at","dir":"asc","offset":0,"limit":50}
Ошибка:
Data: [{"name":"cause","code":"","value":"json: cannot unmarshal array into Go value of type map[string]json.RawMessage","message":""}]

если передать, то запрос будет таким
{"with":{"barcodes":true},"status":["awaiting_packaging"],"sort_by":"updated_at","dir":"asc","offset":0,"limit":50}
и всё норм

Загрузка изображений

/v1/product/pictures/import - Загрузка\Обновление изображений

/v1/product/pictures/info - статус загрузки изображений

Undefined index: error

Здравствуйте. Частенько получаем следующую ошибку:

Undefined index: error at /var/www/vendor/gam6itko/ozon-seller/src/Service/AbstractService.php:146)

Запрос:

{
    "method": "POST",
    "uri": "/v1/product/list",
    "body": {
        "page": 1,
        "page_size": 1000,
        "filter": {
            "visibility": "VISIBLE"
        }
    }
}

Ответ:
{"code":7,"message":"Invalid Api-Key, please contact support","details":[]}

Валидатор «съедает» наименование товара

В импорте товара /v2/product/import обрезается параметр name. В результате в Озон товар попадает без названия.
Конфиг валидатора product_validator_v2.php просится, чтобы его дополнили.

Изменения в методах

От Озона:
Мы запустили вторую версию API, где обновили методы получения списков заказов и их обработки. Она работает стабильнее и лучше оптимизирована. Документация по новой версии: для схемы «Отгрузка со склада продавца», для схемы «Отгрузка со склада Ozon». И важно: перейти на новую версию нужно до Нового года, так как после 9 января старая версия работать уже не будет.

метод /v1/brand/company-certification/list еще реализован ?

Здравствуйте,
Правильно ли я понял, что данный метод в топике у Вас еще не реализован?

ps. Пробую использовать Вашу библиотеку и получаю ошибку по таску, что импортируемый товар подлежит сертификации со ссылкой на данный метод, а быстрым поиском не нашёл в библиотеке.

image360

Привет! Как мне в созданый товар добавить images360

Invalid JSON payload

Здравствуйте.
Поставил Вашу библиотеку всё настроил. В итоге получаю Invalid JSON payload
Конфиг такой:
array(3) {
["clientId"]=>
string(3) "836"
["apiKey"]=>
string(36) "0296d4f2-70a1-4c09-b507-904fd05567b9"
["host"]=>
string(24) "http://cb-api.ozonru.me/"
}

Т.е. пытаюсь по тестовому апи получить данные о списке заказов по V3

$this->client_config = [
            'clientId' => $this->config['test'] ? self::TEST_CLIENT_ID : $this->config['client_id'],
            'apiKey' => $this->config['test'] ? self::TEST_API_KEY : $this->config['api_key'],
            'host' => 'http://'.$host.'/'
        ];
        $this->client = new GuzzleAdapter(new GuzzleClient());
        $this->requestFactory = new RequestFactory();
        $this->streamFactory = new StreamFactory();
$this->service = new FbsService($this->client_config, $this->client, $this->requestFactory, $this->streamFactory);
$data = $this->service->list();

Я вывел данные по ошибке:

protected function throwOzonException(string $responseBodyContents): void
    {
        var_dump('$responseBodyContents', $responseBodyContents);
        $errorData = json_decode($responseBodyContents, true);
        if (JSON_ERROR_NONE !== json_last_error()) {
            throw new OzonSellerException($responseBodyContents);
        }

        if (!class_exists($className = $this->getExceptionClassByName($errorData['error']['code']))) {
            throw new OzonSellerException($responseBodyContents);
        }

        $errorData = array_merge([
            'message' => '',
            'data'    => [],
        ], $errorData['error']);

        $refClass = new \ReflectionClass($className);
        /** @var \Throwable $instance */
        $instance = $refClass->newInstance($errorData['message'], $errorData['data']);
        throw $instance;
    }

Получаю:

string(21) "$responseBodyContents" 
string(203) "{"error":{"code":"BAD_REQUEST","message":"Invalid JSON payload","data":[{"name":"cause","code":"","value":"json: cannot unmarshal array into Go value of type map[string]json.RawMessage","message":""}]}} "

Подскажите в чём может быть дело?

AbstractService::getExceptionClassByName() must be of the type string

Уже больше месяца, в лог иногда сыпется вот такая ошибка

Argument 1 passed to Gam6itko\OzonSeller\Service\AbstractService::getExceptionClassByName() must be of the type string, null given, called in /vendor/gam6itko/ozon-seller/src/Service/AbstractService.php

Насколько я понимаю, сервер озона не отвечает и вместо ответа null, хотя в функции ожидается строка.

Некорректная обработка ответа печати маркировок

В методе packageLabel FbsService.php#L129 обработка идет так же как и для других методов - предполагая что в ответе JSON, но в ответе pdf файл https://cb-api.ozonru.me/apiref/ru/#t-fbs_package_label (тоже самое и для метода /v2/posting/fbs/act/get-pdf - https://cb-api.ozonru.me/apiref/ru/#t-section_postings_fbs_act_title).

can't use api:https://api-seller.ozon.ru/v1/product/import-by-sku,return error:Техническая ошибка

api:
https://api-seller.ozon.ru/v1/product/import-by-sku
param:

{
  "offer_id": "82605303223525",
  "old_price": "6158",
  "price": "3658",
  "premium_price": "3600",
  "currency_code": "CNY",
  "sku": 826053031,
  "vat": "0"
}

result:

{
  "result": {
    "items": [
      {
        "offer_id": "82605303223525",
        "product_id": 0,
        "status": "failed",
        "errors": [
          {
            "code": "bad_request_error",
            "field": "",
            "attribute_id": 0,
            "state": "new",
            "level": "error",
            "description": "Техническая ошибка",
            "optional_description_elements": [],
            "attribute_name": "",
            "message": "Неверно указана валюта"
          }
        ]
      }
    ],
    "total": 1
  }
}

Некорректная обработка сетевых ошибок

} catch (RequestExceptionInterface $exc) {
// guzzle
$response = $exc->getResponse();
$contents = $response->getBody()->getContents();
$this->throwOzonException($contents ?: "Error status code: {$response->getStatusCode()}");
}

Метод getResponse не является частью интерфейса RequestExceptionInterface. В частности, он отсутствует в классе \Http\Client\Exception\NetworkException, в результате при сетевых ошибках получаем

Call to undefined method Http\Client\Exception\NetworkException::getResponse()

Ошибка при вызове метода V3\Posting\FbsService::unfulfilledList без указания фильтра

Версия библиотеки v0.8.7

Вызов \Gam6itko\OzonSeller\Service\V3\Posting\FbsService::unfulfilledList без параметров формирует следующий запрос (заголовки опущены для краткости):

POST /v3/posting/fbs/unfulfilled/list HTTP/1.1

{"with":{"analytics_data":false,"barcodes":false,"financial_data":false},"filter":[],"dir":"asc","offset":0,"limit":10}

Ответ:

HTTP/1.1 400 Bad Request

{"code":3,"message":"proto: syntax error (line 1:83): unexpected token [","details":[]}

Полагаю, проблема в том, что при преобразовании в JSON пустой массив преобразуется в [] вместо {}.

Похожая проблема была в #40, там это решили добавлением дефолтных значений для некоторых полей фильтра (чтобы он никогда не был пустым).

/V2/Posting/FbsService, an exception occurred, can you help me?

use V2\Posting\FbsService

$config = ['clientId' => $client_id, 'apiKey' => $api_key, 'host' => $api_url];
$svc = new FbsService($config, new GuzzleAdapter(new GuzzleClient()), new RequestFactory(), new StreamFactory());
$svc->ship($packages, $number_posting);

the exception like this:
proto: syntax error (line 1:13): unexpected token {

can you help me?

Получить комиссию Озона для подсчёта прибыли?

Есть необходимость считать реальную прибыль, для этого надо получать комиссию Озона.
В документации нет описания методов для получения комиссии.

Задавал вопрос, ответили, что метод есть. Может быть его включить в библиотеку:

POST /v1/product/list/price
{
  "filter": {
    "offer_id": [],
    "product_id": [],
    "visibility": "ALL"
  },
  "page": 1,
  "page_size": 100
}
Ответ:
{
  "result": {
    "items": [
      {
        "buybox_price": "string",
        "commission": {
          "percent": 0,
          "value": 0
        },
        "id": 0,
        "offer_id": "string",
        "old_price": "string",
        "premium_price": "string",
        "price": "string",
        "recommended_price": "string"
      }
    ],
    "total": 0
  }
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.