
Привет, Хабр!
Больше не нужно переключаться между различными приложениями или веб-сайтами, чтобы совершить покупку. Теперь всё это возможно прямо в телеге, платформе, которая уже является частью повседневной жизни миллионов людей.
Платежи через ботов позволяют пользователям совершать покупки напрямую в интерфейсе чата. А непосредственно разработчикам, можно интегрировать функции электронной коммерции в бота, позволяя пользователям покупать товары или услуги без выхода из телеги.
Платежи обрабатываются через проверенных и надежных платежных провайдеров, что обеспечивает безопасность транзакций. Пользователям не нужно беспокоиться о сохранности своих финансовых данных, так как Telegram не хранит информацию о картах. Всё, что им нужно – это выбрать товар, нажать на кнопку покупки, и они будут направлены на безопасную страницу платежной системы для завершения транзакции.
Особенности платежей 2.0
Тelegram впервые представил платежи через ботов в 2017 году. Эта функция позволяла ботам отправлять счета пользователям. Пользователи могли вводить данные своей карты непосредственно в чате для осуществления покупок.
В этих ранних версиях функциональность платежей была довольно ограничена. Например, не было поддержки инлайн-режима, что означало, что все платежные операции должны были проходить внутри чата с ботом.
Платежи обрабатывались через сторонние платежные провайдеры, такие как Stripe, Yandex.Money, и другие. Telegram не обрабатывал платежи напрямую, а лишь предоставлял платформу для их интеграции...
Payments 2.0 представляет собой расширенный функционал для отправки счетов. Разработчики теперь могут включать в счета дополнительную информацию, такую как фотографии товаров, описание, и даже предоставлять покупателям различные варианты товаров или услуг прямо в счете. Это делает процесс покупки более наглядным и удобным.

Самая крутая фича Payments 2.0 - поддержка inline mode. Это позволяет пользователям быстро и легко осуществлять покупки прямо в процессе общения в любом чате или группе, используя inline запросы. Разработчикам в свою очередь предоставляется возможность создавать более динамичные и вовлекающие покупательские сценарии.
Также разработчики могут внедрить функцию принятия чаевых. Это открывает дополнительный канал дохода для контент-создателей и сервисов, предоставляя пользователям возможность оценить их работу небольшими финансовыми взносами.
Payments 2.0 сосредоточен на улучшении пользовательского опыта. Пользователи могут сохранять свои данные платежной карты для последующих покупок в Telegram, что делает процесс покупки еще быстрее и удобнее.
Также расширили регионы оплаты.
Шаги работы платежного процесса
Создание счета
Создание счета в осуществляется через метод sendInvoice
, который является частью Bot API.
Метод sendInvoice
используется для отправки счетов пользователям. Этот метод требует ряда параметров, включая ID чата, заголовок счета, описание, payload, провайдера для обработки платежей, сведения о цене и валюте.
Параметры API
chat_id
: Уникальный идентификатор пользователя или группы.
title
: Название продукта или услуги.
description
: Описание продукта или услуги.
payload
: Уникальный идентификатор транзакции.
provider_token
: Токен, полученный от платежного провайдера.
start_parameter
: Строковый параметр для глубоких ссылок.
currency
: Валюта транзакции.
prices
: Массив цен, каждый элемент которого содержит label
(название) и amount
(стоимость в минимальных единицах валюты, например, копейках или центах).
Допустим, вы хотите отправить счет за покупку книги. Ваш код может выглядеть примерно так:
from telegram import LabeledPrice, Bot
bot = Bot(token='ВАШ_TELEGRAM_BOT_TOKEN')
chat_id = 'CHAT_ID_ПОЛЬЗОВАТЕЛЯ'
title = 'Название Книги'
description = 'Описание книги'
payload = 'Уникальный_Payload_Транзакции'
provider_token = 'TOKEN_ПЛАТЕЖНОГО_ПРОВАЙДЕРА'
start_parameter = 'start'
currency = 'RUB' # Валюта
prices = [LabeledPrice('Цена Книги', 10000)] # Цена в копейках
bot.send_invoice(chat_id, title, description, payload, provider_token, start_parameter, currency, prices)
Выбор способа оплаты пользователем
После получения счета пользователь выбирает способ оплаты. Telegram не обрабатывает платежи от пользователей напрямую, а вместо этого использует различных платежных провайдеров по всему миру. Эти провайдеры отвечают за обработку и хранение всех конфиденциальных данных, таких как детали кредитной карты. Ни Telegram, ни разработчики ботов не имеют доступа к этой информации. На данный момент Telegram поддерживает платежи из более чем 200 стран через ряд платежных провайдеров, включая Stripe, YooMoney, Sberbank и другие.
Каждая платежная система предоставляет уникальный токен (provider token), который используется при создании счетов (invoices) через бота.
Обработка платежа
Когда пользователь подтверждает детали платежа, бот получает запрос предпроверки (pre_checkout_query
). Бот должен ответить на этот запрос, используя метод answerPreCheckoutQuery
, чтобы подтвердить, что все детали платежа корректны.
После успешного выполнения платежа боту отправляется обновление (update
) с подтверждением успешной транзакции. Это обновление содержит уникальный идентификатор транзакции (telegram_payment_charge_id
) и идентификатор транзакции провайдера (provider_payment_charge_id
).
from telegram.ext import PreCheckoutQueryHandler
def pre_checkout_callback(update, context):
query = update.pre_checkout_query
if query.invoice_payload != 'Ожидаемый_Payload':
# Ответить с ошибкой, если payload не совпадает
query.answer(ok=False, error_message="Ошибка в данных платежа.")
else:
# Подтвердить предпроверку
query.answer(ok=True)
# Добавить обработчик PreCheckoutQueryHandler в диспетчер
dispatcher.add_handler(PreCheckoutQueryHandler(pre_checkout_callback))
В примере pre_checkout_callback
функция проверяет invoice_payload
и подтверждает предпроверку платежа.
Получение уведомления о статусе платежа
После того, как пользователь завершает процесс оплаты, бот получает уведомление о статусе платежа. Это уведомление включает в себя все детали транзакции, включая идентификатор платежа.
Бот должен подтвердить получение уведомления о платеже, что является финальным этапом процесса.
Завершение транзакции
Когда платеж успешно обработан платежным провайдером, бот получает уведомление successful_payment
от Telegram. Это уведомление содержит все данные о транзакции, включая идентификаторы платежей и сумму.
После обработки успешного платежа, важно отправить пользователю подтверждение, например, сообщение с благодарностью или информацией о доставке товара.
Можно записывать информацию о транзакции в вашей базе данных для дальнейшей обработки и отчетности.
API платежей
Разберем парочку функций из апи. Подробнее с документацией можете ознакомиться официальной страницы API.
sendInvoice
используется для отправки счетов пользователям. Вот пример JSON-запроса:
{
"chat_id": 123456789,
"title": "Название товара",
"description": "Описание товара",
"payload": "BotPayload",
"provider_token": "ProviderToken",
"currency": "USD",
"prices": [{"label": "Название", "amount": 10000}],
"max_tip_amount": 1000,
"suggested_tip_amounts": [100, 200, 300],
"start_parameter": "start",
"provider_data": "ProviderData",
"photo_url": "http://example.com/photo.jpg",
"need_name": true,
"need_shipping_address": true
}
createInvoiceLink
используется для создания ссылки на счет. Пример запроса:
{
"title": "Название товара",
"description": "Описание товара",
"payload": "BotPayload",
"provider_token": "ProviderToken",
"currency": "USD",
"prices": [{"label": "Название", "amount": 10000}]
}
Если вы отправили счет с запросом адреса доставки, используйте метод answerShippingQuery
для ответа. Пример:
{
"shipping_query_id": "queryId",
"ok": true,
"shipping_options": [
{
"id": "option1",
"title": "Доставка 1",
"prices": [{"label": "Доставка", "amount": 500}]
}
]
}
После того как пользователь подтвердит свои платежные и доставочные данные, нужно использовать answerPreCheckoutQuery
для ответа на запрос. Пример:
{
"pre_checkout_query_id": "preCheckoutQueryId",
"ok": true
}
LabeledPrice: Этот объект используется для определения цены на товар или услугу. Например:
{"label": "Кофе", "amount": 15000}
ShippingOption: Описывает вариант доставки для товара. Пример:
{
"id": "fast",
"title": "Экспресс доставка",
"prices": [{"label": "Доставка", "amount": 5000}]
}
SuccessfulPayment: Содержит подтверждение успешной оплаты. Пример:
{
"currency": "RUB",
"total_amount": 20000,
"invoice_payload": "Payload",
"shipping_option_id": "fast",
"order_info": {
"name": "Иван Иванов",
"phone_number": "1234567890",
"email": "ivan@example.com",
"shipping_address": {
"country_code": "RU",
"state": "Москва",
"city": "Москва",
"street_line1": "Улица Пушкина",
"street_line2": "Дом Колотушкина",
"post_code": "123456"
}
}
}
Про ЮKassa
Юкасса - хороший вариант для оплаты в ботах. Предположим, что вы уже зарегистрировались в ЮKassa и имеете все необходимые ключи и токены. В ЮKassa и получите shopId
и secretKey
.
Когда пользователь выбирает что-то для покупки, вы создаете счет в ЮKassa и отправляете пользователю кнопку для оплаты:
import requests
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler
SHOP_ID = 'your_shop_id'
SECRET_KEY = 'your_secret_key'
BOT_TOKEN = 'your_bot_token'
def start(update, context):
# Ваш код для отображения товаров и/или услуг
def create_invoice(update, context):
chat_id = update.message.chat_id
# Сумма и описание покупки
amount = {'value': '100.00', 'currency': 'RUB'}
description = 'Описание покупки'
headers = {
'Idempotence-Key': 'unique_key', # Уникальный ключ для предотвращения дублирования транзакций
'Content-Type': 'application/json',
'Authorization': 'Basic ' + SHOP_ID + ':' + SECRET_KEY
}
payload = {
'amount': amount,
'capture': True,
'confirmation': {
'type': 'embedded'
},
'description': description
}
response = requests.post('https://payment.yandex.net/api/v3/payments', json=payload, headers=headers)
payment_info = response.json()
# Отправка сообщения с кнопкой для оплаты
keyboard = [[InlineKeyboardButton("Оплатить", url=payment_info['confirmation']['confirmation_url'])]]
reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text('Пожалуйста, оплатите ваш заказ:', reply_markup=reply_markup)
def main():
updater = Updater(BOT_TOKEN, use_context=True)
dp = updater.dispatcher
dp.add_handler(CommandHandler("start", start))
dp.add_handler(CommandHandler("buy", create_invoice))
updater.start_polling()
updater.idle()
if __name__ == '__main__':
main()
Также нужно настроить webhook в ЮKassa для получения уведомлений о статусе платежей. Ваш сервер должен принимать и обрабатывать эти уведомления.
Фича с оплатой в телеге только обеспечивает удобный способ совершения покупок и оплаты услуг, а также значительно расширяет возможности использования Telegram как инструмента для бизнеса.
Также рекомендую вам ознакомиться с нашими другими статьями про телеграм-ботов:
Разработка высокопроизводительного кеш-слоя на основе Redis в телеграм-боте
9 архитектурных антипаттернов при разработке телеграм-ботов на Python
Как сделать вашего телеграм-бота лучше? Конечно, добавить ему аналитику
А получить практические навыки по архитектуре приложений вы традиционно можете в рамках онлайн-курсов от моих коллег из OTUS. Переходите в каталог и выбирайте подходящий курс.