Как стать автором
Обновить
669.37
OTUS
Цифровые навыки от ведущих экспертов

Коротко про платежи через ботов в Telegram

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров20K

Привет, Хабр!

Больше не нужно переключаться между различными приложениями или веб-сайтами, чтобы совершить покупку. Теперь всё это возможно прямо в телеге, платформе, которая уже является частью повседневной жизни миллионов людей.

Платежи через ботов позволяют пользователям совершать покупки напрямую в интерфейсе чата. А непосредственно разработчикам, можно интегрировать функции электронной коммерции в бота, позволяя пользователям покупать товары или услуги без выхода из телеги.

Платежи обрабатываются через проверенных и надежных платежных провайдеров, что обеспечивает безопасность транзакций. Пользователям не нужно беспокоиться о сохранности своих финансовых данных, так как 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 как инструмента для бизнеса.

Также рекомендую вам ознакомиться с нашими другими статьями про телеграм-ботов:

  1. Масштабирование телеграм-ботов на примере aiogram

  2. Как управлять состоянием телеграм-бота

  3. Разработка высокопроизводительного кеш-слоя на основе Redis в телеграм-боте

  4. 9 архитектурных антипаттернов при разработке телеграм-ботов на Python

  5. Как сделать вашего телеграм-бота лучше? Конечно, добавить ему аналитику

А получить практические навыки по архитектуре приложений вы традиционно можете в рамках онлайн-курсов от моих коллег из OTUS. Переходите в каталог и выбирайте подходящий курс.

Теги:
Хабы:
Всего голосов 9: ↑8 и ↓1+9
Комментарии7

Публикации

Информация

Сайт
otus.ru
Дата регистрации
Дата основания
Численность
101–200 человек
Местоположение
Россия
Представитель
OTUS