Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Соединение с API

Соединение с API
Я
   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
УстановитьИмяФайлаТела()
и
Получить()

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

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

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

Сравни это:

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

и это:

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

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

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

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

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

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

   seraf
 
45 - 11.06.20 - 09:47
(45) понял спасибо, попробую вручную пока не разобрал шифрованием в 1с


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.