Интеграция платежей Telegram Stars в Telegram-боте с помощью Python

от автора

Сегодня я покажу, как настроить платежи в вашем телеграм-боте, используя внутреннюю валюту Telegram Stars ⭐️.

Шаг 1: Создание бота

Сначала создайте бота с помощью BotFather. Если вы знакомы с этим процессом, можете использовать своего тестового бота. В этом примере я буду использовать бота @repeats_bot.

Использование бота

Использование бота

Шаг 2: Подготовка структуры проекта

Вот пример структуры нашего проекта:

TelegramStarsBot (корневая папка) |-img/   |-img-X9ptcIuiOMICY0BUQukCpVYS.png |-bot.py |-config.py |-database.py |-.env

Шаг 3: Код бота

bot.py

import telebot from telebot import types from config import TOKEN from database import init_db, save_payment import os  bot = telebot.TeleBot(TOKEN)  # Инициализация базы данных init_db()  # Функция создания клавиатуры для платежа def payment_keyboard():     keyboard = types.InlineKeyboardMarkup()     button = types.InlineKeyboardButton(text="Заплатить 1 XTR", pay=True)     keyboard.add(button)     return keyboard  # Функция создания клавиатуры с кнопкой "Купить изображение" def start_keyboard():     keyboard = types.InlineKeyboardMarkup()     button = types.InlineKeyboardButton(text="Купить изображение", callback_data="buy_image")     keyboard.add(button)     return keyboard  # Обработчик команды /start @bot.message_handler(commands=['start']) def handle_start(message):     bot.send_message(         message.chat.id,         "Добро пожаловать! Нажмите на кнопку ниже, чтобы купить изображение.",         reply_markup=start_keyboard()     )  # Обработчик нажатия кнопки "Купить изображение" @bot.callback_query_handler(func=lambda call: call.data == "buy_image") def handle_buy_image(call):     prices = [types.LabeledPrice(label="XTR", amount=1)]  # 1 XTR     bot.send_invoice(         call.message.chat.id,         title="Покупка изображения",         description="Купите изображение за 1 звезду!",         invoice_payload="image_purchase_payload",         provider_token="",  # Для XTR этот токен может быть пустым         currency="XTR",         prices=prices,         reply_markup=payment_keyboard()     )  # Обработчик запросов перед оплатой @bot.pre_checkout_query_handler(func=lambda query: True) def handle_pre_checkout_query(pre_checkout_query):     bot.answer_pre_checkout_query(pre_checkout_query.id, ok=True)  # Обработчик успешных платежей @bot.message_handler(content_types=['successful_payment']) def handle_successful_payment(message):     user_id = message.from_user.id     payment_id = message.successful_payment.provider_payment_charge_id     amount = message.successful_payment.total_amount     currency = message.successful_payment.currency      # Отправка подтверждающего сообщения о покупке     bot.send_message(message.chat.id, "✅ Платеж принят, пожалуйста, подождите, фото скоро будет отправлено!")      # Сохранение информации о платеже в базе данных     save_payment(user_id, payment_id, amount, currency)      # Отправка изображения     photo_path = 'img/img-X9ptcIuiOMICY0BUQukCpVYS.png'     if os.path.exists(photo_path):         with open(photo_path, 'rb') as photo:             bot.send_photo(message.chat.id, photo, caption="?Спасибо за покупку!?")     else:         bot.send_message(message.chat.id, "Извините, изображение не найдено.")  # Обработчик команды /paysupport @bot.message_handler(commands=['paysupport']) def handle_pay_support(message):     bot.send_message(         message.chat.id,         "Покупка изображения не подразумевает возврат средств. "         "Если у вас есть вопросы, пожалуйста, свяжитесь с нами."     )  # Запуск опроса bot.polling()

config.py

import os from dotenv import load_dotenv  # Загрузка переменных окружения из файла .env load_dotenv()  # Получение значений из переменных окружения TOKEN = os.getenv('TOKEN') DATABASE = os.getenv('DATABASE')

database.py

import sqlite3 from config import DATABASE  def init_db():     with sqlite3.connect(DATABASE) as conn:         cursor = conn.cursor()         cursor.execute('''             CREATE TABLE IF NOT EXISTS payments (                 user_id INTEGER,                 payment_id TEXT,                 amount INTEGER,                 currency TEXT,                 PRIMARY KEY (user_id, payment_id)             )         ''')         conn.commit()  def save_payment(user_id, payment_id, amount, currency):     with sqlite3.connect(DATABASE) as conn:         cursor = conn.cursor()         cursor.execute('''             INSERT INTO payments (user_id, payment_id, amount, currency)             VALUES (?, ?, ?, ?)         ''', (user_id, payment_id, amount, currency))         conn.commit() 

Объяснение кода

Платежи с помощью Telegram Stars

  • payment_keyboard и start_keyboard создают кнопки для взаимодействия с пользователем. Первая кнопка позволяет произвести оплату, а вторая инициирует покупку изображения.

  • handle_buy_image создает и отправляет счет для оплаты с использованием валюты XTR. Здесь provider_token может быть пустым, так как XTR не требует токена.

  • handle_pre_checkout_query и handle_successful_payment обрабатывают проверку и подтверждение платежа.

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

Работа с базой данных

  • init_db создает таблицу payments, если она не существует. Эта таблица хранит информацию о пользователе, платеже, сумме и валюте.

  • save_payment сохраняет информацию о платеже в базе данных. Это необходимо для возможных возвратов и отчетов о транзакциях.

Важные замечания

  • Платежи владельца бота: Если владелец бота попытается сделать покупку в боте, покупка не будет завершена. Это предотвращает мошенничество или ошибочные покупки, сделанные администратором.

  • Управление звездами: Звезды хранятся внутри бота Telegram. Чтобы просмотреть баланс, перейдите в настройки бота в Telegram, выберите «Управление ботом» и нажмите «Баланс«. Здесь вы можете просмотреть и управлять заработанными звездами, вывести их или потратить на рекламу.

Управление ботом

Управление ботом
Баланс

Баланс
Статистика Telegram Stars

Статистика Telegram Stars
Статистика покупок

Статистика покупок

Заключение

Ваш бот теперь настроен для приема платежей через Telegram Stars и отправки изображения после успешной покупки. Убедитесь, что все настройки и данные в конфигурационных файлах корректны.

Буду благодарен, если оставите реакцию или комментарий! Полный исходный код вы можете найти на GitHub.


ссылка на оригинал статьи https://habr.com/ru/articles/839590/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *