Внимание
Статья сильно устарела, новая по ссылке Интеграция с API WIldberries. Что нового в 2022 во взаимодействии 1С и Вайлдберриз
Целых 3 API
Для начала оказалось, что у Вайлдберриз аж 3 АПИ:
1) АПИ Контент (позволяет авторизоваться и получить карточки товаров, а также загрузить описания и фото)
https://suppliers.wildberries.ru/remote-wh-site/api-content.html
Для его работы сильно помогла публикация //infostart.ru/public/1316698/
2) API Stock&Price - обмен остатками на складе
Для его работы требуются отдельные токены АПИ, получаемые в настройках ЛК.
https://suppliers.wildberries.ru/marketplace-pass/api-access
Если вы их забудете и не скопируете сразу при получении(как я), то придется недельку подождать ответа ТП. Видимо, такой же дикой как ягоды, потому что ну "гениальное" же решение показать токены ровно 1 раз в ЛК а дальше написать "Токены уже предоставлены. Для повторного получения токенов необходимо обратиться в техническую поддержку."
Также не забудьте, что токен занимает целых 64 символа и не обрезается у вас.
3) API Orders - работа с заказами и сборочными заданиями.
Эту часть я дополню позже.
Подготовка к обмену товарами/остатками
Я исходил из того что в ЛК уже есть сколько-то загруженных товаров, через Ексель или созданных вручную. Возможно позже допишу обработку для создания товаров из 1С.
Для работы со вторым АПИ остатков требуется знать Код размера (chrtId) и Артикул WB (nmId) для каждой номенклатуры. Можно их получить, кроме работы с АПИ, просто выгрузив Ексель из перечня номенклатуры поставщика (https://suppliers.wildberries.ru/analytics/nomenclatures) и из него загрузить в дополнительные реквизиты номенклатуры. Но мы же не ищем легких путей? Поэтому написал код получения всех товаров из АПИ. Но, кстати, загрузку из Ексель (точнее csv) тоже оставил.
В процессе работы с АПИ контент для получения номенклатуры столкнулся с такой ошибкой: передавал валидный Json в метод card/list но приходила ошибка доступ запрещен "code":-32603,"message":"access denied"
Оказалось, нужно передавать SupplierID вовсе не тот что получается из АПИ по методу suppliers/getID а из раздела Спецификаций в ЛК полученный по кнопке "получить uuid". Это кстати было в Инструкции написано! Полезно иногда читать мануал.
Кстати говоря чтобы получить WbToken и нормально с ним работать надо сделать логин 3 раза (о да!)
1) сначала получить пинкод смс и смс-токен с помощью метода
/passport/api/v2/auth/login_by_phone
2) потом с этим смс-токеном и пинкодом получить куки со значением WBToken
/passport/api/v2/auth/login
кстати да кроме куки тут в ответе ничего нет
3) потом можно "запомнить" этот WBToken отправив его на
/passport/api/v2/auth/grant
в ответ возвращается еще один токен (аутентификации или как я его назвал основной)
и вот его мы отправляем вместе с куки WBToken на passport/api/v2/auth/login в виде
{
"country": "RU",
"device": "test",
"token": "основной"
}
Теперь с токеном аутентификации можно запрашивать обновление через cookies того самого ВБТокен. Дописал для этого процедуру ОбновитьВБТокенПоОсновному
Запрос номенклатуры
Следующий прикол на который я наткнулся, запросив наконец-то карточки номенклатуры методом LIST (https://content-suppliers.wildberries.ru/card/list) - ограничение лимита по 100 штук, даже если я хочу 999 и явно поставил лимит. Блин мы в 2020, у меня мощный канал интернета, у вас в Диких Ягодах наверняка Дико Производительный Сервер на Golang, если я хочу получить сразу 999 карточек, так дайте мне их блин. Но нет, прилетает 100 штук, и приходится запрашивать еще раз.
Дальше понятно, получаем номенклатуру в Json, находим ее по артикулу и записываем в регистр дополнительные сведения данные по chrtId и nmId. Далее эти сведения нам пригодятся при обмене остатков.
Обмен остатков
Получаем остатки по нужному складу и цены по нужному виду цен. Данные по chrtId и nmId получаем из регистра ДополнительныеСведения. Кстати, если заносить их из файла выгрузки Ексель - тоже можно, есть у меня функция ЗанестиВДопРеквизиты. Только пересохраните Ексель в CSV, так с ним проще работать.
Дальше произошло чудо - сразу возникает ошибка "token is not valid". Причем я пробовал оба, и тестовый и рабочий. Это кажется возникало если данные по ценам были в 0. Или еще json is not valid без каких-то пояснений.
Я долго смотрел на разницу примера, приведенного у Диких Ягод, и своего тестового json и не мог ничего увидеть. Потом понял - цены были с дробной частью, а ДЯ требуют int. Поправил, получил "token is not valid", оказалось что у меня обрезался токен до 50 символов. Поправил, получил успех, остатки обновились.
Создаем номенклатуру
Для начала попробовал создать номенклатуру без фото. Есть метод АПИ https://content-suppliers.wildberries.ru/card/batchCreate
Но думаете там все так просто? Как бы не так!
Создать-то карточку получается, вот только в ответе АПИ поля nmId и chrtId, которые дальше нужны для обмена остатками в API Stock&Price, приходят в 0 - не заполнены то есть! Подозреваю что карточка отправляется на модерацию, но пока точный ответ про это не получил. Поддержка отправляет писать в заспамленный телеграм чат.
Созданная таким образом карточка не появляется в "Аналитике - Отчет с перечнем номенклатур" и не выгружается в Ексель, однако появляется в разделе "Спецификации New". Но этот новый раздел нерабочий и из него карточка не открывается.
Также не все просто оказалось с загрузкой фото - если просто установить тело из двоичных данных, вылезает ошибка upload file 'data' error: request has no multipart/form-data Content-Type. Тут мне помогла статья про формирование multipart/form-data из 1С //infostart.ru/public/20017/ - оказалось двоичные данные картинки нужно кодировать с помощью XMLСтрока. Тогда загрузка файла в Вайлдберриз заработала.
Тестировал на УТ 11.1, платформа 8.3.11.
Иногда обработка работает не у всех - выдает ошибку "access denied" или "supplierID is not valid" - в таких случаях техподдержка отправляет искать помощь в заспамленный телеграм чат. К сожалению, эту проблему можно решать только на стороне WildBerries.
UPD1: добавил версию для УТ 10.3 на обычных формах.
UPD2: на текущий момент написан функционал обмена остатками и создания карточек