База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как работает процесс асинхронной оплаты через API в 1С?
- В этой теме 1 ответ, 2 участника, последнее обновление 1 день, 18 часов назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
9 января 2026 в 6:30 #35436
Если СтрНайти(СокрЛП(Операция), «Продажа») > 0 Тогда
ЭтоВозврат = Ложь;
КоличествоПопыток = 0;
МаксКоличествоПопыток = 250;//ОплатаПрошлаУспешно = Ложь;
// Шаг 1: Создание платежа
Тип = «/create-payment»;ТелоJSON = Новый Структура;
ТелоJSON.Вставить(«amount», СуммаКредита);
ТелоЗапроса = «{«;
Для Каждого КлючИЗначение Из ТелоJSON Цикл
ТелоЗапроса = ТелоЗапроса + СтрШаблон(«»»%1″»:%2,», КлючИЗначение.Ключ, Формат(КлючИЗначение.Значение, «ЧЦ=12; ЧДЦ=2; ЧРД=.; ЧГ=0»));
КонецЦикла;
ТелоЗапроса = Лев(ТелоЗапроса, СтрДлина(ТелоЗапроса) — 1) + «}»;Заголовки = Новый Соответствие;
Заголовки.Вставить(«Content-Type», «application/json»);Запрос = Новый HTTPЗапрос(Тип, Заголовки);
Запрос.УстановитьТелоИзСтроки(ТелоЗапроса);Результат = Соединение.ОтправитьДляОбработки(Запрос);
Если Результат.КодСостояния = 200 Тогда
СтрокаДокументаJSON = Результат.ПолучитьТелоКакСтроку();
СтруктураОтвета = фПрочитатьJSON(СтрокаДокументаJSON);Если СтруктураОтвета.Свойство(«id») Тогда
ИдентификаторОперации = СтруктураОтвета.id;// Шаг 2: Запускаем проверку статуса
Пока КоличествоПопыток < МаксКоличествоПопыток Цикл // ВАЖНО: Разрешаем прервать цикл клавишами Ctrl+Break, если все зависнет ОбработкаПрерыванияПользователя(); КоличествоПопыток = КоличествоПопыток + 1; Тип = "check_payment_status"; Параметр = СокрЛП(ИдентификаторОперации); Результат = ОтправитьЗапросМКСА(Соединение, Тип, Параметр); Если Результат.КодСостояния = 200 Тогда СтрокаДокументаJSON = Результат.ПолучитьТелоКакСтроку(); СтруктураОтвета = фПрочитатьJSON(СтрокаДокументаJSON); Если СтруктураОтвета.Свойство("status") Тогда Статус = СтруктураОтвета.status; Если Статус = "success" Тогда //ОплатаПрошлаУспешно = Истина; Прервать; ИначеЕсли Статус = "FAILED" Тогда // ... код ошибки ... Сообщение = ?(СтруктураОтвета.Свойство("message"), СтруктураОтвета.message, ""); Сообщить("Оплата не удалась: " + Сообщение, СтатусСообщения.ОченьВажное); Возврат; ИначеЕсли Статус = "UNKNOWN" Тогда // ... код ошибки ... Сообщение = ?(СтруктураОтвета.Свойство("message"), СтруктураОтвета.message, ""); Сообщить("Неизвестный статус: " + Сообщение, СтатусСообщения.ОченьВажное); Возврат; ИначеЕсли Статус = "INITED" Тогда // Меняем статус внизу экрана Состояние("Ожидайте... Проверка статуса (" + КоличествоПопыток + ")"); // Ждем 1 секунду перед следующей попыткой Пауза(1); -
9 января 2026 в 6:30 #35437
Расул, код выглядит логично и соответствует типичной схеме работы с асинхронной оплатой через API. Вот что происходит:
1. Проверяется, что операция — продажа.
2. Формируется JSON с суммой платежа.
3. Отправляется POST-запрос на создание платежа (/create-payment).
4. Если ответ успешен и есть id операции, запускается цикл проверки статуса платежа.
5. В цикле с паузой 1 секунда отправляется запрос check_payment_status с id операции.
6. Если статус «success» — цикл прерывается, оплата успешна.
7. Если статус «FAILED» или «UNKNOWN» — выводится сообщение об ошибке и выполнение прерывается.
8. Если статус «INITED» — цикл продолжается, ожидается изменение статуса.Рекомендации и замечания:
— В цикле стоит предусмотреть таймаут или максимальное время ожидания, чтобы не зависать бесконечно.
— Обработка прерывания пользователя (Ctrl+Break) — хорошая практика.
— В теле JSON для суммы стоит убедиться, что формат соответствует API (например, число с точкой, без лишних пробелов).
— Можно добавить логирование попыток и ответов для отладки.
— Если API поддерживает вебхуки, лучше использовать их вместо опроса статуса.В целом, код корректен и соответствует стандартному паттерну работы с платежными API.
9
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.