Задача
Нужно было принимать оплату в TON прямо в Telegram без ручной сверки переводов. Ключи от кошелька нельзя держать на сервере, а каждый платёж должен однозначно находить свой счёт.
Решение
Бот на python-telegram-bot ведёт диалог и пишет счета в PostgreSQL. Фоновая задача в том же процессе раз в 20 секунд читает переводы через toncenter, идёт от последней обработанной транзакции и сопоставляет перевод со счётом по комментарию. Все запросы к базе параметризованы.
Решённые задачи
- Сделал счёт на любую сумму с уникальным комментарием через меню бота
- Дал кнопку в Tonkeeper с заполненными адресом, суммой и комментарием
- Сделал наблюдатель, который читает кошелёк продавца и сверяет переводы со счетами
- Засчитываю оплату только при совпадении комментария и сумме не меньше счёта
- Снимаю неоплаченные счета по истечении срока и предупреждаю покупателя
- Храню суммы в нанотонах целыми числами, без дробей с плавающей точкой
- Обошёлся без приватных ключей: сервису нужен только публичный адрес
Результат
Покупатель платит в пару нажатий и сразу получает подтверждение в чате, продавцу не нужно сверять переводы. Код открыт на GitHub, перед запуском бот можно проверить в тестовой сети TON.
Технологии
Pythonpython-telegram-botasyncioPostgreSQLasyncpgtoncenter API