Почему я решил сделать свой платёжный бот
Я просто хотел принимать платежи и донаты в своём Telegram-канале. Ничего сложного: кинул ссылку — получил деньги. Но когда начал смотреть существующие сервисы (Трибьюн, BotPay и подобные), столкнулся с одним и тем же: регистрация, паспорт, ИП, привязка карт. Мне это было неприятно — как будто чужой дядька лезет в интимные места.
Я не хотел светить данные, не хотел оформлять юридическое лицо, не хотел возиться с налоговой. Хотел просто продавать мануалы и принимать донаты, используя встроенную валюту Telegram — Stars.
Так родилась идея сделать своего бота: анонимного, без регистраций, без паспортов. Чтобы любой человек, у которого есть Telegram, мог создать товар, кинуть ссылку и получить деньги.
Архитектура и стек
Бот написан на Python с использованием aiogram 3. В качестве базы данных выбрал SQLite — просто, не надо поднимать отдельный сервер, для старта хватает.
Помимо самого бота, потребовался отдельный API для Mini App. Его написал на aiohttp, чтобы не тащить лишние зависимости. API работает на том же сервере, но на отдельном порту (8080). Основные эндпоинты:
/api/products— список товаров для витрины/api/donate— информация о донат-кнопке/api/create_invoice— создание инвойса на оплату
Вся логика платежей живёт в основном боте. Mini App просто общается с API, а бот уже создаёт инвойсы и обрабатывает успешные платежи.
Реализация бэкенда
Уникальные ссылки
Первая версия бота использовала ссылки вида pay_1, pay_2. Это было удобно для прототипа, но абсолютно небезопасно — любой мог перебрать ID и посмотреть чужие товары. Кроме того, такие ссылки не давали аналитики: невозможно понять, откуда пришёл покупатель.
Поэтому я переделал систему на уникальные коды. Теперь при создании товара бот генерирует строку вида prod_fgU7d и сохраняет её в отдельной таблице. Ссылка становится такой:
https://t.me/System_Paybot?start=prod_fgU7d
По коду в таблице payment_links можно найти ID товара и ID продавца. Это решило проблему перебора и заодно позволило добавить аналитику (например, отслеживать, из какого источника пришёл покупатель).
В aiogram для отправки разных типов файлов есть отдельные методы: sendDocument, sendPhoto, sendVideo, sendAudio. Чтобы не гадать, что именно прислал продавец, я сделал универсальный механизм: при создании товара определяю тип файла и сохраняю его file_id, а при выдаче просто пробую sendDocument — он работает для любых файлов. Если вдруг не срабатывает, падаю на sendPhoto и так далее. Костыль, но ни один файл не остаётся неотправленным.
try: await message.answer_document(document=content, caption=thanks) except: try: await message.answer_photo(photo=content, caption=thanks) except: # и так далее
Этот подход оказался надёжным и работает для любых форматов, которые Telegram поддерживает.
Платежи через Stars
Telegram Stars — встроенная валюта. Для приёма платежей достаточно создать инвойс через метод create_invoice_link. Всё остальное Telegram делает сам: показывает окно оплаты, списывает звёзды, присылает подтверждение.

В коде это выглядит так:
invoice_link = await bot.create_invoice_link( title=title, description=f"Покупка: {title}", payload=f"pay_{product_id}_{user_id}", provider_token="", currency="XTR", prices=[{"label": title, "amount": amount}] )
После успешной оплаты Telegram присылает событие successful_payment, где в payload лежит та самая строка, которую мы передали. По ней мы понимаем, какой товар купили, и выдаём его пользователю.
Админка для владельца
Я добавил несколько команд, доступных только мне:
/admin_stats— общая статистика бота/admin_users— список последних 20 пользователей/admin_broadcast— рассылка/admin_ban//admin_unban— блокировка
Это удобно для мониторинга и управления, если ботом пользуется кто-то ещё (пока нет, но на будущее).
Великое разочарование ((
Telegram не даёт переводить Stars продавцам...
Самая неприятная неожиданность. Оказалось, что Telegram не позволяет ботам переводить звёзды другим пользователям. Все деньги, которые платят покупатели, падают в кошелёк владельца бота, а не того, кто создал товар.
Я долго искал способ обойти это ограничение, но его нет. Единственное, что можно сделать — давать код бота другим пользователям. Тогда они запускают своего бота, и все платежи идут уже им.
Mini App требует HTTPS, а порт 443 занят Xray
Вторая серьёзная проблема. Для работы Mini App Telegram требует HTTPS. У меня на сервере уже стоял Xray (VPN), который слушал порт 443. Просто повесить Nginx на тот же порт не получилось.
Решение нашёл такое:
Сделал поддомен
shop.system-dev.ruНастроил Nginx на порт 8443
Получил SSL-сертификат через Certbot
Открыл порт 8443 в iptables
В BotFather указал URL
https://shop.system-dev.ru:8443
Всё заработало, но пришлось повозиться с фаерволом и правами доступа к папке /var/www/systempay. Nginx не хотел отдавать файлы, пока я не поменял права на chmod 755.
CORS и права на файлы
Когда Mini App пытался получить список товаров, запросы падали с CORS. Добавил в webapp.py простой middleware, который подставляет нужные заголовки:
@web.middleware async def cors_middleware(request, handler): response = await handler(request) response.headers['Access-Control-Allow-Origin'] = '*' response.headers['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS' response.headers['Access-Control-Allow-Headers'] = 'Content-Type' return response
Права на файлы — тоже была морока. Nginx запускается от пользователя www-data, а папка лежала в /root, куда у него не было доступа. Перенёс всё в /var/www/systempay и выставил права.
Что получилось в итоге
В результате получился полноценный платёжный бот:
Товары — можно загрузить любой файл или ссылку
Донаты — любая сумма (пользователь сам вводит)
Mini App — каталог с кубом, кнопками, адаптивным дизайном
Статистика — для продавца через команду
/statsАдминка — для владельца
Бот работает, Mini App открывается, платежи проходят.

А вообще разрабатываю Telegram-ботов и сервисы, которые решают конкретные проблемы: приём платежей, автоматизация, инструменты для админов. Боты делаю максимально простыми — без регистраций, без лишних телодвижений. Если что-то можно автоматизировать, я это автоматизирую.
Следующей моей разработкой будет Golem!))
Ссылки
Бот: @System_Paybot
Mini App: https://t.me/System_Paybot/shop
ТГ-канал: SYSTEM
