Оплата в Telegram-боте: приём платежей по шагам
Какие есть способы принимать оплату в боте, чем они отличаются, как обрабатывать подтверждение платежа и почему идемпотентность здесь обязательна.
Все статьи гида Telegram-боты · 13
Приём оплаты - место, где ошибки стоят денег и обнаруживаются не сразу. Разберём варианты и обязательный минимум.
Варианты приёма оплаты
Встроенные платежи Telegram. Вы подключаете платёжного провайдера, и пользователь платит, не выходя из мессенджера. Самый короткий путь для пользователя, а значит самая высокая доходимость. Требует подключённого провайдера и работает с его условиями.
Telegram Stars. Внутренняя валюта платформы. Для части цифровых товаров и услуг внутри мессенджера это обязательный способ по правилам платформы. Разбор - в статье про Stars.
Внешняя платёжная страница. Бот отдаёт ссылку, оплата происходит на стороне провайдера, подтверждение приходит вебхуком. Максимум свободы в логике, скидках и отчётности; на один шаг длиннее для пользователя.
Как выбрать: цифровой товар внутри мессенджера - Stars, физический товар или услуга - встроенные платежи или внешняя страница, сложная логика и отчётность - внешняя страница.
Схема, которая работает
Порядок шагов, нарушение которого создаёт большинство проблем:
- Создать заказ в своей базе со статусом «ожидает оплаты». До того, как показывать пользователю счёт.
- Выставить счёт с указанием идентификатора заказа.
- Дождаться подтверждения от платёжной системы. Это отдельное событие, а не нажатие кнопки.
- Проверить, что заказ ещё не оплачен. Если оплачен - выйти, ничего не делая.
- Отметить оплату и выдать товар.
- Сообщить пользователю.
Главное в этой схеме - пункт 4. Без него повторное подтверждение выдаст товар второй раз.
Подтверждение платежа
Ключевая мысль: нажатие кнопки оплаты не является оплатой. Фактом является подтверждение от платёжной системы.
Что с этим связано:
Подтверждение приходит асинхронно. Пользователь может закрыть чат, а подтверждение придёт через минуту. Логика выдачи не должна зависеть от того, находится ли пользователь в диалоге.
Подтверждение может прийти дважды. Это штатное поведение при повторной доставке, а не сбой. Отсюда требование идемпотентности.
Подтверждение нужно проверять. Данные, пришедшие снаружи, должны быть проверены на подлинность способом, который даёт провайдер. Доверять содержимому запроса на слово нельзя.
Сумма и валюта сверяются с заказом. Не с тем, что пришло, а с тем, что вы записали при создании заказа.
Идемпотентность
Развёрнуто: повторная обработка одного и того же платежа не должна ничего менять.
Как это делается на практике:
- У заказа есть устойчивый идентификатор, который передаётся платёжной системе и возвращается в подтверждении.
- Перед выдачей проверяется текущий статус заказа. Оплачен - выходим.
- Изменение статуса и выдача происходят в одной транзакции, чтобы не получилось «статус поменяли, товар не выдали».
Тот же принцип в общем виде разобран в блоге: идемпотентные пайплайны.
Что ещё стоит предусмотреть
- Возвраты. Как минимум - ручная процедура и понимание, что происходит с выданным доступом.
- Незавершённые заказы. Пользователь начал и не оплатил. Такие заказы должны истекать, а не висеть вечно.
- Логи всех платёжных событий. При разборе спора вам понадобится история, а не память.
- Разделение сред. Тестовые платежи и боевые не должны ходить в одну базу.
- Отчётность. Что нужно бухгалтерии, стоит выяснить до запуска, а не после первого месяца продаж.
Как это выглядит на реальном проекте - бот продажи курсов. Про Stars - отдельная статья. Обзор - гид по Telegram-ботам.
Вопросы и ответы
Как принимать оплату в Telegram-боте?
Три способа: встроенные платежи через подключённого провайдера, Telegram Stars для цифровых товаров и переход на внешнюю платёжную страницу. Первый удобнее для пользователя, второй обязателен для части цифровых товаров, третий даёт максимум свободы в логике и отчётности.
Почему нельзя выдавать товар сразу после нажатия кнопки оплаты?
Потому что нажатие кнопки не означает оплату. Подтверждение приходит отдельным событием от платёжной системы, и только оно является фактом. Выдача по нажатию - это способ раздать товар бесплатно всем, кто разберётся в механике.
Что такое идемпотентность в платежах?
Свойство обработки, при котором повторное подтверждение одного и того же платежа не создаёт второй заказ и не выдаёт товар дважды. Платёжные системы штатно повторяют доставку подтверждений, поэтому это не защита от редкого случая, а обязательное условие.
Ещё по теме
- Telegram-боты на Python: полный практический гидГид
- Кнопки в Telegram-боте: обычные и инлайнЧем обычная клавиатура отличается от инлайн-кнопок, когда какая нужна, как обрабатывать нажатия и почему обязательно подтверждать callback.
- Конструкторы Telegram-ботов против кода: что выбратьКакие задачи закрывают конструкторы ботов, где они упираются в потолок, из чего складывается стоимость владения и как выбрать между конструктором и кодом.
- Токен Telegram-бота: получение и безопасностьКак получить токен у BotFather, где его хранить, что делать при утечке и какие настройки бота стоит задать сразу после создания.
Сделаю под ключ
Сделаю Telegram-бота под ваш процесс
Заявки, оплата, выдача доступа, рассылки и воронка в одном боте, с админкой для вас.
от 300 $ · 3-7 дней
«Действительно гуру своего дела. Узнал массу новой и полезной информации по телеграм рассылкам. До этого сжег очень много денег на оплате услуг посредников, но после общения с исполнителем буду делать все сам)»