Имя: Пароль:
1C
1С v8
Соединение с API
0 seraf
 
10.06.20
12:13
Привет, подскажете может, не занимался таким.
Делаю демо соединение с API банка такой процедуркой

&НаКлиенте
Процедура Соединение(Команда)
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ИмяФайла = "c:\test\ПримерJSON.json";
    ЗаписьJSON.ОткрытьФайл(ИмяФайла);

    ЗаписьJSON.ЗаписатьНачалоОбъекта();
    ЗаписьJSON.ЗаписатьИмяСвойства("phone");
    ЗаписьJSON.ЗаписатьЗначение("+380963876251");
    ЗаписьJSON.ЗаписатьКонецОбъекта();
    ЗаписьJSON.Закрыть();

    Соединение = Новый HTTPСоединение("u2-demo-ext.mono.st4g3.com",443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
    ЗаголовкиЗапросаHTTP = Новый Соответствие;
    ЗаголовкиЗапросаHTTP.Вставить("store", "test_store_with_confirm");
    ЗаголовкиЗапросаHTTP.Вставить("signature", "secret_98765432--123-123");

    Запрос = Новый HTTPЗапрос("/api/order/confirm", ЗаголовкиЗапросаHTTP);
    Запрос.УстановитьИмяФайлаТела(ИмяФайла);
    Ответ = Соединение.Получить(Запрос);
    Сообщить(Ответ.КодСостояния);

КонецПроцедуры

При этом в файле JSON текст
{
"phone": "+380963876251"
}

Но пока возвращает код ошибки вместо результативного обращения. Может чего не так написал тут? Буду благодарен за совет
1 ДенисЧ
 
10.06.20
12:14
УстановитьИмяФайлаТела()
и
Получить()

как-то слабо совместимы.
2 seraf
 
10.06.20
12:15
а как надо, я думал текст JSON возьмется из файла
3 ДенисЧ
 
10.06.20
12:16
(2) А надо читать описание апи и методов, которыми он вызывается. Внимательно обращать внимание на метдо запроса - PUT или GET
4 fisher
 
10.06.20
12:21
Обычно подобные задачи решаются в два этапа:
1. Сначала добиваются успешного обращения к API вручную через, например, postman (чтобы исключить приколы 1С)
2. Потом добиваются формирования полностью аналогичного вызова API через 1С (подсматривая, что там шлет 1С, например через fiddler)
5 seraf
 
10.06.20
12:26
(4) сейчас гляну, это для теста API сервис
я первый раз столкнулся, по примерам процедурку набросал, вроде все должно быть просто, но мог в синтаксисе заплутать
6 fisher
 
10.06.20
12:27
Есть статья на ИТС "Создание и отладка HTTP-сервисов". Может тоже что полезное найдешь.
7 seraf
 
10.06.20
12:53
я почитаю еще, а тот код что выше написал-то корректен визуально?
8 seraf
 
10.06.20
13:32
Переписал чуток так, но все равно отбивает ошибку вместо результата

Процедура Соединение(Команда)
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();

    ЗаписьJSON.ЗаписатьНачалоОбъекта();
    ЗаписьJSON.ЗаписатьИмяСвойства("phone");
    ЗаписьJSON.ЗаписатьЗначение("+380963876251");
    ЗаписьJSON.ЗаписатьКонецОбъекта();
    СтрJSON = ЗаписьJSON.Закрыть();

    Соединение = Новый HTTPСоединение("u2-demo-ext.mono.st4g3.com",443);
    ЗаголовокЗапросаHTTP = Новый Соответствие;
    //ЗаголовокЗапросаHTTP.Вставить("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
    ЗаголовокЗапросаHTTP.Вставить("store", "test_store_with_confirm");
    ЗаголовокЗапросаHTTP.Вставить("signature", "secret_98765432--123-123");

    Запрос = Новый HTTPЗапрос("/api/order/confirm", ЗаголовокЗапросаHTTP);
    Запрос.УстановитьТелоИзСтроки(СтрJSON,КодировкаТекста.UTF8);
    Ответ = Соединение.Получить(Запрос);
    Сообщить(Ответ.КодСостояния);

КонецПроцедуры
9 seraf
 
10.06.20
13:32
хз че не так-то
10 ДенисЧ
 
10.06.20
13:36
(8) @   Запрос.УстановитьТелоИзСтроки(СтрJSON,КодировкаТекста.UTF8);
    Ответ = Соединение.Получить(Запрос);
@

см (1)
11 arsik
 
гуру
10.06.20
13:42
+ (10) Сделай Соединение.Отправить(Запрос);
12 seraf
 
10.06.20
13:43
смотрю, не понимаю о чем сказать хочешь
создал JSON, перевел в строку, установил заголовки HTTP и тело запроса, выполнил.. в каком месте криво
13 seraf
 
10.06.20
13:45
а, Ответ = Соединение.ОтправитьДляОбработки(Запрос)
исправил, спасибо, правда результат не изменился(
14 sitex
 
naïve
10.06.20
13:45
(12) А ты уверен что твой json  текст валиден для приема ?
15 sitex
 
naïve
10.06.20
13:46
В (4) дело говорит . Сначало так попробуй. а потом в 1С все
16 seraf
 
10.06.20
13:49
(14) не уверен, сейчас это просто строка { "phone": "+380963876251" }
может еще нужен где-то тег описания формата или что
(15) postman пытаюсь глянуть, пока не разобрался
17 sitex
 
naïve
10.06.20
13:50
(16) а описание что нет ? методом перебора json создаешь?
18 seraf
 
10.06.20
13:52
19 Salimbek
 
10.06.20
13:54
(17) Ну дык... он тут у нас в (7) спрашивает - корректен ли код визуально. Видимо и остальное он кодит также - визуально вроде JSON норм выглядит, значит вперед и с песней...
20 seraf
 
10.06.20
13:55
(19) я с этим не сталкивался, хрен знает где чего не учел, поэтому на опытный взгляд спрашиваю, гадать переставляя запятые долго можно
21 arsik
 
гуру
10.06.20
13:56
(18) Там же написано, что все запросы подписаны должны быть
$signature = base64_encode(hash_hmac("sha256", $request_string, "secret_98765432--123-123", true));
22 sitex
 
naïve
10.06.20
13:57
Запрос = Новый HTTPЗапрос("/api/order/confirm", ЗаголовокЗапросаHTTP); посмотри что надо слать order_id  Уникальный идентификатор заявки , а ты шлешь телефон
23 Salimbek
 
10.06.20
13:57
(20) Ты свою ссылку из (18) хоть читал?

Сравни это:

ЗаголовокЗапросаHTTP.Вставить("store", "test_store_with_confirm");

и это:

store-id    - Идентификатор магазина (выданый при заключении договора)

(21) Да какой там о подписях разговор вести, если он реквизиты в упор не видит.
24 sitex
 
naïve
10.06.20
13:58
(22) + json  phone  это к Валидация клиента , post запрос к  /api/client/validate
25 sitex
 
naïve
10.06.20
14:00
(21) Да тут пока это не приготовишь , дальше двигаться тупо смысла нет.
26 seraf
 
10.06.20
14:09
(25) правы, переписывал несколько раз параметр не то имя и апи поменял.
а что в (21) значит, я не понимаю смысл что сделать нужно
27 arsik
 
гуру
10.06.20
14:13
(23) Это нормально в апи указано
Тестовая платформа
Тестовая платформа содержит только 1 магазина и отдает только заранее подготовленные ситуации.
store-id: test_store_with_confirm ключ: secret_98765432--123-123 link: https://u2-demo-ext.mono.st4g3.com[/1С]
28 seraf
 
10.06.20
14:17
всё равно код 400 возвращает - ошибка в запросе
я чувствую где-то может надо было тип может указать application/json;charset=UTF-8 или что..
(21) пока не понял, но наверное 401 бы вернуло
29 sitex
 
naïve
10.06.20
14:19
(26) в (21) тебе надо подписать запросов и передать его в заголовке параметре signature. Вроде нормальное описанный мануал.
30 sitex
 
naïve
10.06.20
14:22
(28) ЗаголовокЗапросаHTTP.Вставить("signature", "secret_98765432--123-123"); <<<---- а ты ему передаешь ДИЧЬ!
31 arsik
 
гуру
10.06.20
14:24
(26) Тебе СтрJSON - сначала в бинарный вид превратить, потом хеш бинарных данных посчитать (вот готовая функция есть http://catalog.mista.ru/public/611505/), потом этот хеш в Base64
Ну и при создании HTTPСоединение - нужно наверно так
Соединение = Новый HTTPСоединение("u2-demo-ext.mono.st4g3.com",443,,,,,Новый ЗащищенноеСоединениеOpenSSL);
32 seraf
 
10.06.20
14:25
В signature должно быть ase64_encode(hash_hmac("sha256", $request_string, "secret_98765432--123-123", true)) ?
К мануалу то вопросов нет, это я тугой)
33 arsik
 
гуру
10.06.20
14:27
(28) 400 - это скорее всего из-за
Соединение = Новый HTTPСоединение("u2-demo-ext.mono.st4g3.com",443,,,,,Новый ЗащищенноеСоединениеOpenSSL);
34 sitex
 
naïve
10.06.20
14:30
(31) Ну все сейчас дело попрет)
35 seraf
 
10.06.20
14:34
(31) ага)
Новый ЗащищенноеСоединениеOpenSSL - всё равно 400
до жирафа вроде дошло, в signature надо "secret_98765432--123-123" превратить в base_64 и передавать?
36 sitex
 
naïve
10.06.20
14:38
(35) Посмотри Пример подписи на php. Там все ппц как разжевано.
37 seraf
 
10.06.20
14:43
(36) для кого разжевано?

encodeBase64(
   HmacSHA256(
       getBytesUTF-8(
           request_body
       )
   )
)
encodeBase64 - функция преобразования бинарных данных в Base64 формат ,
HmacSHA256 - функция вычисления хеша подписи данных ,
getBytesUTF-8 - функция перевода строки в бинарное представление (в кодировке UTF-8) ,
request_body - тело запроса (или ответа)

я в рамках 1С ничего не понимаю

или этот код сайтом выполнится, просто передать строку?
38 seraf
 
10.06.20
14:58
Хорошо, все опечатки убрал, ошибку понял.
base64_encode(hash_hmac("sha256"...
Подскажите плиз русским языком что и какими функциями мне в 1С проделать с сигнатурой "secret_98765432--123-123", дабы передать ожидаемое значение.
39 Serginio1
 
10.06.20
15:25
40 seraf
 
10.06.20
15:45
(39) спасибо, буду разбираться, не так-то и просто
41 seraf
 
10.06.20
16:18
а что нужно передавать
https://www.freeformatter.com/hmac-generator.html#ad-output
вот онлайн ковертер, текст это моя сигнатура, а секретный ключ что?

надо хэш получить по SHA256, потом этот хеш в base64 и передавать параметром, верно?
42 arsik
 
гуру
10.06.20
16:20
(41)Djn ;t - secret_98765432--123-123
43 seraf
 
10.06.20
16:26
а в поле Copy-paste the string here что вставлять, тоже его?
44 arsik
 
гуру
10.06.20
17:15
(43) Нет. Текст запроса вставляешь
{
"phone": "+380963876251"
}
45 seraf
 
11.06.20
09:47
(45) понял спасибо, попробую вручную пока не разобрал шифрованием в 1с
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.