Telegram-бот для выставления счетов через Halfin API
Кейс · Telegram-бот · платёжная интеграция · Python
Автоматизация создания платёжных ссылок для менеджеров с разграничением доступа и защитой от повторных операций. Сотрудник выставляет счёт прямо в Telegram, не открывая личный кабинет платёжного сервиса.
Принцип надёжности: повторное действие пользователя или повторная доставка события не должны создавать второй инвойс.

Задача
Нужно было создать закрытого Telegram-бота, через которого менеджеры могут сформировать счёт и получить готовую ссылку на оплату. Бот собирает параметры по шагам, показывает их перед отправкой и обращается к Halfin API только после подтверждения.
Ключевое требование — платёжная операция не должна повторяться из-за двойного нажатия, задержки сети или повторной доставки обновления Telegram.
Как создаётся счёт
Проверка доступа
Бот принимает команды только от активированных сотрудников. Посторонним пользователям не раскрываются ни функции системы, ни рабочие данные.
Закрытый контур · роли и разрешенияСбор параметров
FSM в aiogram проводит менеджера через последовательный диалог и хранит состояние черновика до подтверждения.
Telegram · aiogram 3.31 · FSMПодтверждение
Перед запросом к платёжному сервису менеджер видит собранные параметры и осознанно запускает создание счёта.
Проверка перед операциейСоздание ссылки
Отдельный сервисный слой отправляет запрос в Halfin API через httpx, сохраняет результат и возвращает готовую платёжную ссылку в чат.
Halfin API · httpx
Защита от повторного создания
Каждый черновик получает собственный draft_id. При обращении к платёжному API он участвует в формировании Idempotency-Key. Повторное нажатие относится к той же операции, а не создаёт новый независимый инвойс.
Это надёжнее одной только блокировки кнопки: событие может прийти дважды, а сетевой ответ — потеряться. Идемпотентность связывает повторный запрос с уже начатой операцией.
Архитектура без лишней инфраструктуры
| Компонент | Реализация |
|---|---|
| Backend | Python 3.10, aiogram 3.31 |
| Платёжная интеграция | Halfin API, httpx |
| Хранение данных | SQLite |
| Интерфейс | Telegram, FSM |
| Безопасность | Разграничение ролей и контроль доступа |
| Надёжность | draft_id, Idempotency-Key |
| Тестирование | 25 автоматизированных тестов |
| Инфраструктура | Ubuntu, SSH, rsync; systemd unit подготовлен |
Long polling позволяет обойтись без публичного IP, домена и веб-сервера для webhook. Для текущего объёма достаточно SQLite.
Доступ и возможность развития
Только для сотрудников
Доступ получают менеджеры, активированные администратором. Бот не проектировался как публичный платёжный сервис.
Логика отделена от интерфейса
Создание инвойса вынесено в отдельный слой, поэтому его можно повторно использовать при разработке Telegram Mini App.
Проверяемые сценарии
Набор из 25 тестов покрывает ключевую логику, включая доступ и защиту от повторных операций.
Статус внедрения
Код, тесты и unit-файл systemd подготовлены. Автоматический запуск службы на целевом сервере зависит от действий администратора, поэтому кейс не утверждает, что бот уже работает в production под управлением systemd.
Результат
Менеджер открывает Telegram, указывает параметры, проверяет их и отправляет клиенту готовую ссылку. Платёжный кабинет остаётся за пределами повседневного сценария, а повторное действие не должно превращаться во второй инвойс.
Python 3.10 · aiogram 3.31 · Halfin API · httpx · SQLite · Telegram FSM · Idempotency-Key · systemd
