Имя: Пароль:
1C
 
Wildberries - изменение цены
0 lamme
 
27.01.24
18:40
Приветствую.

сам по себе апи метод описан тут
https://openapi.wb.ru/prices/api/ru/#tag/Ceny/paths/~1public~1api~1v1~1info/get

Вроде не сложно.
Но все методы до этого делал - GET
тут -POST

ОДним словом - приходит всегда пока 400 ошибка:
{"errors":["incorrect data"]}
1 lamme
 
27.01.24
18:41
Сам по себе запрос делаю так


Ключ =ВБ_Ключ();
    ПолныйАдресРесурса =  "https://suppliers-api.wildberries.ru/public/api/v1/prices";

    СтруктураURI = СтруктураURI(ПолныйАдресРесурса);
    SSL =  Новый ЗащищенноеСоединениеOpenSSL();
    ssl4 = Новый ЗащищенноеСоединениеOpenSSL( неопределено, неопределено );         
            
    HTTPСоединение = Новый HTTPСоединение(СтруктураURI.Хост, СтруктураURI.Порт, , , , , ssl4);
    HTTPЗапрос = Новый HTTPЗапрос(СтруктураURI.ПутьНаСервере);
    HTTPЗапрос.Заголовки.Вставить("Authorization",Строка(Ключ));
    HTTPЗапрос.Заголовки.Вставить("Content-type",Строка("application/json"));
    
    //    
        Данные = Новый Структура();
        МассивЦен = новый массив();
        Для каждого стр из Тз_Цен цикл
            Данные.Вставить("nmId",стр.nmId);
            Данные.Вставить("price",стр.price);
            МассивЦен.Добавить(Данные);
        конеццикла;
        

        ЗаписьJSON = Новый ЗаписьJSON;            
        ЗаписьJSON.УстановитьСтроку();
        ЗаписатьJSON(ЗаписьJSON, МассивЦен);            
        ТелоЗапроса = ЗаписьJSON.Закрыть();
        
        HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса);


    Попытка
        Ответ =  HTTPСоединение.ВызватьHTTPМетод("POST",HTTPЗапрос);
    Исключение
        Сообщить("Произошла сетевая ошибка!" + ОписаниеОшибки());
        ВызватьИсключение;
    КонецПопытки;
    
    
     Если Ответ.КодСостояния=200 тогда
        //Сообщить (Ответ.ПолучитьТелоКакСтроку());
        ЗначениеОтвета = Ответ.ПолучитьТелоКакСтроку();
        ЧтениеJSON = Новый ЧтениеJSON;
        ЧтениеJSON.УстановитьСтроку(ЗначениеОтвета);
        Данные = ПрочитатьJSON(ЧтениеJSON);
    иначе    
        Сообщить ("ошибка");
        Данные = неопределено;
        Сообщить (Ответ.ПолучитьТелоКакСтроку());
    конецесли;
2 lamme
 
27.01.24
18:41
тело запроса имеет вид - как по учебнику.
те как в апи написано


[
{
"nmId": 183643644,
"price": 11000
}
]



че ему не хватает?
3 lamme
 
27.01.24
18:46
СтруктураURI.Хост = suppliers-api.wildberries.ru
труктураURI.ПутьНаСервере = public/api/v1/prices
4 timurhv
 
27.01.24
20:43
Попробуйте через (хотя по коду ошибки что-то с JSON не так):

HTTPСоединение (HTTPConnection)
ОтправитьДляОбработки (Post)
Синтаксис:
ОтправитьДляОбработки(<HTTPЗапрос>, <ИмяВыходногоФайла>)
Параметры:
<HTTPЗапрос> (обязательный)
Тип: HTTPЗапрос.
HTTP-запрос.
<ИмяВыходногоФайла> (необязательный)
Тип: Строка.
Имя выходного файла, в который записываются полученные с сервера данные.
Если не указан или содержит пустую строку, то тело ответа может быть получено из объекта HTTPОтвет.
Возвращаемое значение:
Тип: HTTPОтвет.
Описание:
Отправляет данные на указанный адрес для обработки при помощи HTTP-запроса POST.
5 BrainDamage
 
28.01.24
02:25
(2) Возможно вы неправильно пишете тело запроса.
   [- это начало массива объектов {}
В json все описания объектов начинается с
   {
6 BrainDamage
 
28.01.24
02:39
А да, еще была проблема с разделителем разрядов в цене.
Типа 1500 и 1 500
Это тоже надо проверить.
7 Смотрящий
 
28.01.24
08:14
(0) Данные = Новый Структура(); унутр цикла запихни
Где в структуре дисконт и промокод ?
(6) +1
8 Смотрящий
 
28.01.24
08:16
Не увидел про дисконт и промокод
9 lamme
 
28.01.24
10:56
(4)

да. пробовал. аналогичный ответ
10 lamme
 
28.01.24
10:57
(5)

вот у них пример

[
{
"nmId": 1234567,
"price": 1000
}
]


-------


вот у меня

[
{
"nmId": 183643644,
"price": 11000
}
]
11 lamme
 
28.01.24
10:57
(6)
да - стандартные грабли от 1С.
это корректно
12 lamme
 
28.01.24
10:58
(7)
в описании протокола нет дисконт и промокод

скидка - меняется другим запросом

у них же в этом запрсое меняются только цены

Array
nmId    
integer
Номенклатура

price    
number
Цена (указывать без копеек)
13 lamme
 
28.01.24
11:05
(7)
Данные = Новый Структура(); унутр цикла запихни

Тут согласен
пока отправлял 1 значение - было не заметно.

но общая проблема осталась
14 lamme
 
28.01.24
11:07
(7)
Где в структуре дисконт и промокод ?

запрос идет - на изменить цену
а не - получить цены.


в методу - получить цены - там как раз есть скидка и промокод
15 timurhv
 
28.01.24
11:32
(14) У вас в (0) ссылка на GET запрос, а не POST. Поэтому путаница.

183643644 и токен - от продуктивного контура?
Предположу, что товар не принадлежит данному токену.

400 ошибки (но с подробным описанием) могут возникать еще если цена повышается более 30% за неделю, а также если карточка создана недавно и вы меняете цены.
16 lamme
 
28.01.24
13:14
(15)

да.
извиняюсь
не та ссылка

вот ссылка на апи ВБ - на изменение цены
https://openapi.wb.ru/prices/api/ru/#tag/Ceny/paths/~1public~1api~1v1~1prices/post
17 lamme
 
28.01.24
13:14
183643644 и токен - от продуктивного контура?

тут да.
18 lamme
 
28.01.24
13:15
(15)

400 ошибки (но с подробным описанием) могут возникать еще если цена повышается более 30% за неделю, а также если карточка создана недавно и вы меняете цены.

а тут сюрприз ...
чего они так сделали то по уеб.ски
могли бы отчет расшифровывать более подробно
19 lamme
 
28.01.24
13:20
15

тут может быть вероятность в самом токене того
что у него - нет прав на редактирование цены




Предположу, что товар не принадлежит данному токену.
20 timurhv
 
28.01.24
13:47
(18) >могли бы отчет расшифровывать более подробно
Расшифровки есть (судя по гуглу в интернете), но всякое может быть
21 lamme
 
28.01.24
15:31
смущает то
что 400 ошибка по протоколу имеет соверщенно иной вид.


тут же - всяко проблема именно в самих данных

но в чем именно - не понятно
и в каком месте - не понятно

потому что ответ приходит - нет данных.

те сами данные - надо как-то упаковать-в какой то префикс-суфиикс добавить..
да хз
22 lamme
 
28.01.24
15:37
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса,КодировкаТекста.UTF8,ИспользованиеByteOrderMark.НеИспользовать);


во .. теперь начало  выдавать ошибку- как в апи.
{"errors":["No goods for process"],"error_code":1}


те и текст и код ошибки
23 lamme
 
28.01.24
15:47
такое ощущение - что проходит все
а прав нет
24 Ненавижу 1С
 
29.01.24
08:13
вот тут:

Данные = Новый Структура();
        МассивЦен = новый массив();
        Для каждого стр из Тз_Цен цикл
            Данные.Вставить("nmId",стр.nmId);
            Данные.Вставить("price",стр.price);
            МассивЦен.Добавить(Данные);
        конеццикла;

Вы вставляете одну и ту же структуру несколько раз. Создавайте структуру внутри цикла
25 lamme
 
29.01.24
20:51
(24)
да - я это увидел
в (7) сказали
в (13) поправил
26 lamme
 
29.01.24
21:00
одним словом ... вышестоящий код - рабочий ..

что сделано
1. добавили в ЛК прав на редактирование цен (хз где это) и создали новый токе

2. ВНИМАТЕЛЬНО прочитал - что значит 400 ошибка ..


application/json
Example

NoGoodsForProcess
NoGoodsForProcess
Все передаваемые цены/скидки уже установлены


Copy
Expand allCollapse all
{
"error": [
"No goods for process"
],
"error_code": 1
}



те ключевая фраза:

Все передаваемые цены/скидки уже установлены



Схватился за голову.
поменял цену с 99 000 на 90 000 - и все заработало.
сервер вернул код 200 - те все пучком
27 lamme
 
29.01.24
21:04
и там методом научного тыка
вот так работает

    HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса,КодировкаТекста.Системная,ИспользованиеByteOrderMark.Авто);
28 BrainDamage
 
29.01.24
23:47
(24) Лучше вообще все сразу в Соответствие пихать)
Бывает такое, что когда нужно передать свойство объекта через точечку, в качестве ключа, 1с-ый метод, который запиливает уже структуру в JSON  приводит к крашу.
Типа;
{ "Цены":
    {"Цена.Акция": 25} // ну или "25" в зависимости от того какой тип значения определил разработчик API)
....
То есть если в структуру передавать в качестве ключа "Цена.Акция" то система вывалится с ошибкой, если это будет соответствие, то пропустит)
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший