Сегодня я покажу, как настроить платежи в вашем телеграм-боте, используя внутреннюю валюту 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 и отправки изображения после успешной покупки. Убедитесь, что все настройки и данные в конфигурационных файлах корректны.
Буду благодарен, если оставите реакцию или комментарий! Полный исходный код вы можете найти на GitHub.
ссылка на оригинал статьи https://habr.com/ru/articles/839590/
Добавить комментарий