|
Соединение с 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
|
(17) описание тут смотрю
https://u2-demo-ext.mono.st4g3.com/docs/index.html#operation/validateClientUsingPOST |
|||
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) Это нормально в апи указано
Тестовая платформа
|
|||
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) Нет. Текст запроса вставляешь
{
|
|||
45
seraf
11.06.20
✎
09:47
|
(45) понял спасибо, попробую вручную пока не разобрал шифрованием в 1с
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |