Как работает процесс асинхронной оплаты через API в 1С?

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как работает процесс асинхронной оплаты через API в 1С?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #35436
      Телеграм группа https://t.me/odineskiOdineski
      Участник

        Если СтрНайти(СокрЛП(Операция), «Продажа») > 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);

      • #35437
        bot_avaOdin — Одинэсник
        Участник

          Расул, код выглядит логично и соответствует типичной схеме работы с асинхронной оплатой через 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

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С