Имя: Пароль:
1C
1С v8
Помогите написать POST-запрос для обработки заказов kaspi.kz
0 Повелитель
 
29.08.24
09:24
Всем привет.

В каспи есть справочник, в котором есть примеры запросов. Например вот пример получения заказов:
GET
https://kaspi.kz/shop/api/v2/orders?page[number]=0&page[size]=20&filter[orders][state]=NEW
&filter[orders][creationDate][$ge]=1478736000000&filter[orders][creationDate][$le]=1479945600000
&filter[orders][status]=APPROVED_BY_BANK&filter[orders][deliveryType]=PICKUP
&filter[orders][signatureRequired]=false&include[orders]=user
Content-Type:application/vnd.api+json
X-Auth-Token: <token>


Более подробно из справочника:
https://guide.kaspi.kz/partner/ru/shop/api/orders/q3201

С получением заказов через GET-запрос я с вашей помощью разобрался.
Запрос из примера выше, на данный момент работает и в 1с выглядит вот так:
мТокен = "v+Lm2au10000000000000000000000000000000000000"; //реальный токен скрыл
	
	//Формируем период в миллисекундах
	ПолучатьЗаказыСДаты = Дата('20240829');
	ДнейДо =  (НачалоДня(ТекущаяДата()) - ПолучатьЗаказыСДаты)/86400 + 1;
	ТекДата = ТекущаяДата();
	ИсхДата = Дата(1970, 1, 1);
	ДатаВМил = (ТекДата - ИсхДата) * 1000;
	ДатаВМилСтрока = Формат(ДатаВМил,"ЧГ=");
	ДатаВмилНачало = ДатаВМил - 86400*ДнейДо * 1000;
	ДатаВМилНачалоСтрока = Формат(ДатаВмилНачало,"ЧГ=");
	
	//Заголовки
	ЗаголовокЗапроса  = Новый Соответствие;
	ЗаголовокЗапроса.Вставить("Content-Type","application/vnd.api+json");
	ЗаголовокЗапроса.Вставить("X-Auth-Token", мТокен);
	HTTP = Новый HTTPСоединение("kaspi.kz",,,,,,Новый ЗащищенноеСоединениеOpenSSL());
	
	//Запрос
	ТекстЗапроса = "/shop/api/v2/orders?page[number]=0&page[size]=100&filter[orders][state]= NEW&filter[orders][creationDate][$ge]=" 
	+ ДатаВМилНачалоСтрока + "&filter[orders][creationDate][$le]=" 
	+ ДатаВМилСтрока 
	+ "&filter[orders][status]=APPROVED_BY_BANK&include[orders]=user";
	
	Запрос = Новый HTTPЗапрос(ТекстЗапроса, ЗаголовокЗапроса);
	
	Результат = HTTP.Получить(Запрос);
	Если Результат.КодСостояния <> 200 Тогда
		Сообщить(Результат.КодСостояния);
		Возврат;
	КонецЕсли; 
	
	ОтветJSON = Результат.ПолучитьТелоКакСтроку();
	
	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(ОтветJSON);
	ОбъектJSON = ПрочитатьJSON(ЧтениеJSON);
	
	ЧтениеJSON.Закрыть();


Теперь нужно в 1с отправить POST запрос для формирования накладных.
В справке: https://guide.kaspi.kz/partner/ru/shop/api/orders/q3210 вот такой пример:

https://kaspi.kz/shop/api/v2/orders
POST /api/v2/orders
HTTP/1.1
Host: kaspi.kz/shop
Content-Type: application/vnd.api+json
X-Auth-Token:token
{
"data":
{
"type": "orders",
"id": " ordersID",
"attributes": {
"status": "ASSEMBLE",
"numberOfSpace": "2"
}
}
}


Не понимаю, как и куда вставить эти параметры, которые в скобках {{}}

Помогите, подскажите.
1 Волшебник
 
29.08.24
09:24
Это POST-запрос
2 trad
 
29.08.24
09:36
(0)
HTTPЗапрос.УстановитьТелоИзСтроки(JSON)
HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос)
3 Повелитель
 
29.08.24
09:45
(1) (2) Я нашел пример POST запроса:
 КодПриглашения = "inviteCode=" + 
		"<=" + ltValue +
		"&execution=" + executionValue +
		"&_eventId=" + _eventIdValue +
		"&username=" + ЛогинИТС +
		"&password=" + ПарольИТС;	
 
	// 4. Наконец, посылаем Post-запрос, вкладывая в тело запроса
	// код приглашения, а куках указыаем второй идентификатор сессии.	
 
	Ресурс =
		"/login;" +
		ИдентификаторСессии2 +
		"?service=https%3A%2F%2Fusers.v8.1c.ru%2Fdistribution%2Fpublic%2Fsecurity_check%3B" +
		ИдентификаторСессии1;
 
	Соединение = Новый HTTPСоединение("login.1c.ru",,,,,,
		Новый ЗащищенноеСоединениеOpenSSL());
 
	Заголовки = Новый Соответствие;	
	Заголовки.Вставить("Cookie", ИдентификаторСессии2);
	Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded;");	
 
	Запрос = Новый HTTPЗапрос(Ресурс, Заголовки);
	Запрос.УстановитьТелоИзСтроки(КодПриглашения);
 
	Результат = Соединение.ОтправитьДляОбработки(Запрос);


Вот эти параметры не пойму как вписать:
{
 "data":
 {
  "type": "orders",
  "id": " ordersID",
  "attributes": {
    "status": "ASSEMBLE",
    "numberOfSpace": "2"
   }
 }
}


По аналогии как с кодом приглашения? Тут просто двойные скобки, не могу понять
4 Волшебник
 
29.08.24
09:41
(3) это формат wiki:JSON
5 Повелитель
 
29.08.24
09:42
(4) (2) Понятно, спасибо, буду изучать.
6 trad
 
29.08.24
09:49
(3) ранее ты освоил ЧтениеJSON и ПрочитатьJSON
Теперь надо освоить ЗаписьJSON и ЗаписатьJSON

Делаешь структуру, загоняешь ее в ЗаписатьJSON и получаешь строку JSON со своими "двойными скобками"
7 Повелитель
 
11.09.24
10:20
Нужна помощь. Вернемся к моему запросу.

нужно в 1с отправить POST запрос для формирования накладных.
В справке: https://guide.kaspi.kz/partner/ru/shop/api/orders/q3210 вот такой пример:

https://kaspi.kz/shop/api/v2/orders
POST /api/v2/orders
HTTP/1.1
Host: kaspi.kz/shop
Content-Type: application/vnd.api+json
X-Auth-Token:token
{
"data":
{
"type": "orders",
"id": " ordersID",
"attributes": {
"status": "ASSEMBLE",
"numberOfSpace": "2"
}
}
}



Составил код:

мТокен = "v+Lm2au1";

	ЗаголовокЗапроса  = Новый Соответствие;
	ЗаголовокЗапроса.Вставить("Content-Type","application/vnd.api+json");
	ЗаголовокЗапроса.Вставить("X-Auth-Token", мТокен);
	ЗаголовокЗапроса.Вставить("Host", "kaspi.kz/shop");
	HTTP = Новый HTTPСоединение("kaspi.kz",,,,,15,Новый ЗащищенноеСоединениеOpenSSL());
	                
	//ТекстЗапроса = "shop/api/v2/orders";
	ТекстЗапроса = "/api/v2/orders";
	
    Запрос         = Новый HTTPЗапрос(ТекстЗапроса, ЗаголовокЗапроса);
	
	//Формируем Параметр JSON
	СтруктураАртирбуты = Новый Структура;
	СтруктураАртирбуты.Вставить("status","ASSEMBLE");
	СтруктураАртирбуты.Вставить("numberOfSpace","2");
	
	СтруктураТела = Новый Структура;
	СтруктураТела.Вставить("type","orders");
	СтруктураТела.Вставить("id","NDA5OT"); //ИД заказа
	СтруктураТела.Вставить("attributes",СтруктураАртирбуты);
	
	СтруктураДопПолей = Новый Структура;
	СтруктураДопПолей.Вставить("data", СтруктураТела);
	
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.ПроверятьСтруктуру = Ложь;
	//ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(,Символы.Таб);
	ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON();
	ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
	
	ЗаписатьJSON(ЗаписьJSON, СтруктураДопПолей);
	
	ТелоЗапроса = ЗаписьJSON.Закрыть();
	
	Запрос.УстановитьТелоИзСтроки(ТелоЗапроса);
	
	РезультатЗапроса     = HTTP.ОтправитьДляОбработки(Запрос);
	
	Сообщить("Нам вернули код " + РезультатЗапроса.КодСостояния);



Тело запроса получилось сделать как в справке:
https://disk.yandex.com/i/wOCGyiukc3SF-A


Результат такого запроса:
Нам вернули код 503
<html><body><b>Http/1.1 Service Unavailable</b></body> </html>


Если заголовки поменять:
ЗаголовокЗапроса  = Новый Соответствие;
	ЗаголовокЗапроса.Вставить("Content-Type","application/vnd.api+json");
	ЗаголовокЗапроса.Вставить("X-Auth-Token", мТокен);
	//ЗаголовокЗапроса.Вставить("Host", "kaspi.kz/shop");
	HTTP = Новый HTTPСоединение("kaspi.kz",,,,,15,Новый ЗащищенноеСоединениеOpenSSL());
					
	ТекстЗапроса = "shop/api/v2/orders";
	//ТекстЗапроса = "/api/v2/orders";

То получаем:
Нам вернули код 500
Получен пустой ответ

Подскажите что не так?
8 Волшебник
 
11.09.24
10:21
ошибки 500 и 503 сигнализируют о проблемах на стороне сервиса.
Сообщите разработчикам
9 Повелитель
 
11.09.24
10:30
(8) Так может я запрос не правильно составил, и он стучится не туда?

Например вот тут у них в примере
https://kaspi.kz/shop/api/v2/orders
POST /api/v2/orders
HTTP/1.1
Host: kaspi.kz/shop
Content-Type: application/vnd.api+json
X-Auth-Token:token
{
"data":
{
"type": "orders",
"id": " ordersID",
"attributes": {
"status": "ASSEMBLE",
"numberOfSpace": "2"
}
}
}


есть HTTP/1.1, а я нигде это не указывал.
10 Галахад
 
11.09.24
11:16
Если убрать ЗаголовокЗапроса.Вставить("Host", "kaspi.kz/shop");
ругается на просроченный токен. ))
11 Повелитель
 
11.09.24
12:11
(10) К сожалению реальный токен выложить не могут, так как поменять его нет возможности
12 ttk
 
11.09.24
12:11
Тести в постмане, а потом уже в 1с сделай все по красоте.
13 Галахад
 
11.09.24
12:18
(11) Я к тому, что ошибки 500-х уходят.
14 Повелитель
 
11.09.24
12:47
(12) Не получается через постман тоже.
Вот скрины
параметры:
https://disk.yandex.com/i/6HiWVsfXQTTqaw
авторизация:
https://disk.yandex.com/i/Khdt2M0j-zT03A
заголовки:
https://disk.yandex.com/i/mrAMTHqilclAxA
Ответ:
400
Bad Request



Заголовки:
https://disk.yandex.com/i/x5ctE2sMrlRcAw
Ответ:
Response
15 ttk
 
11.09.24
12:52
{
"data":
{
"type": "orders",
"id": " ordersID",
"attributes": {
"status": "ASSEMBLE",
"numberOfSpace": "2"
}
}

ну это обычно в тело пихают
16 ttk
 
11.09.24
12:52
(15)
17 dergreche
 
11.09.24
13:01
(0) посмотри как сделано в решении на инфостарте https://infostart.ru/1c/tools/2041374/
18 Повелитель
 
11.09.24
13:03
(15) Спасибо, в посмман получилось:
Тело:
https://disk.yandex.com/i/ZhyeK3aBuvM8uw
Заголовки:
https://disk.yandex.com/i/ZVBORZmf4-XHIA

Теперь бы это ещё в 1с заработало.
19 ttk
 
11.09.24
13:05
(18) в 1с заработает, если сделаешь как в (2)
20 Greeen
 
11.09.24
13:17
вы как в (10) попробовали? =)
21 Повелитель
 
11.09.24
13:19
(20) Пробовал, не помогает.
Сейчас буду пробовать (19) и (2)
22 Повелитель
 
11.09.24
13:47
Всем спасибо. Всё получилось!

Вот рабочий код:
    
мТокен = "хххххх";
	
	ЗаголовокЗапроса  = Новый Соответствие;
	ЗаголовокЗапроса.Вставить("Content-Type","application/vnd.api+json");
	ЗаголовокЗапроса.Вставить("X-Auth-Token", мТокен);
	//ЗаголовокЗапроса.Вставить("Host", "kaspi.kz/shop");
	HTTP = Новый HTTPСоединение("kaspi.kz",,,,,15,Новый ЗащищенноеСоединениеOpenSSL());
	                
	ТекстЗапроса = "/shop/api/v2/orders";

	
    HTTPЗапрос         = Новый HTTPЗапрос(ТекстЗапроса, ЗаголовокЗапроса);
	
	

	//Формируем Параметр JSON
	СтруктураАртирбуты = Новый Структура;
	СтруктураАртирбуты.Вставить("status","ASSEMBLE");
	СтруктураАртирбуты.Вставить("numberOfSpace","1");
	
	СтруктураТела = Новый Структура;
	СтруктураТела.Вставить("type","orders");
	СтруктураТела.Вставить("id","idzakaz");
	СтруктураТела.Вставить("attributes",СтруктураАртирбуты);
	
	СтруктураДопПолей = Новый Структура;
	СтруктураДопПолей.Вставить("data", СтруктураТела);
	
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.ПроверятьСтруктуру = Ложь;
	ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON();
	ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
	ЗаписатьJSON(ЗаписьJSON, СтруктураДопПолей);
	
	ТелоЗапроса = ЗаписьJSON.Закрыть();
	
	HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса,КодировкаТекста.UTF8,ИспользованиеByteOrderMark.НеИспользовать);
	
	
	Попытка
		РезультатЗапроса     = HTTP.ОтправитьДляОбработки(HTTPЗапрос);
	Исключение
	    Сообщить(ОписаниеОшибки());
	КонецПопытки;
	
	Сообщить("Нам вернули код " + РезультатЗапроса.КодСостояния);


До этого код был практически такой же.
Вот тут:
    
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса,КодировкаТекста.UTF8,ИспользованиеByteOrderMark.НеИспользовать);

Не хватало параметров в УстановитьТелоИзСтроки
КодировкаТекста.UTF8,ИспользованиеByteOrderMark.НеИспользовать

и сразу заработало.
23 Greeen
 
11.09.24
13:48
(22)👍
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.