Сегодня я покажу, как настроить платежи в вашем телеграм-боте, используя внутреннюю валюту Telegram Stars ⭐️.
Шаг 1: Создание бота
Сначала создайте бота с помощью BotFather. Если вы знакомы с этим процессом, можете использовать своего тестового бота. В этом примере я буду использовать бота @repeats_bot.
![Использование бота Использование бота](https://habrastorage.org/getpro/habr/upload_files/3c2/441/b9d/3c2441b9ddcf4474063513a9acbd34ff.png)
Шаг 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, выберите "Управление ботом" и нажмите "Баланс". Здесь вы можете просмотреть и управлять заработанными звездами, вывести их или потратить на рекламу.
![Управление ботом Управление ботом](https://habrastorage.org/getpro/habr/upload_files/e53/43b/cf1/e5343bcf15efd3c79ee5d0454c67a54c.png)
![Баланс Баланс](https://habrastorage.org/getpro/habr/upload_files/942/149/1fc/9421491fc7fad7af1e429f26ca08eba6.png)
![Статистика Telegram Stars Статистика Telegram Stars](https://habrastorage.org/getpro/habr/upload_files/17d/4b2/658/17d4b2658367441294f5687441ac99f7.png)
![Статистика покупок Статистика покупок](https://habrastorage.org/getpro/habr/upload_files/7de/ca0/75e/7deca075eed7b755245c928128bbac07.png)
Заключение
Ваш бот теперь настроен для приема платежей через Telegram Stars и отправки изображения после успешной покупки. Убедитесь, что все настройки и данные в конфигурационных файлах корректны.
Буду благодарен, если оставите реакцию или комментарий! Полный исходный код вы можете найти на GitHub.
Комментарии (10)
4wards1
29.08.2024 14:26+1Звёзды в текущем виде - мертворождённый продукт. Дикие комиссии, неудобный вывод. Нет смысла их использовать, если у вас не слишком популярный бот, который может привлечь внимание "контролеров" из Telegram.
d-sh
29.08.2024 14:26А как это можно отлаживать? Делать фейковые покупки для тестирования.
И какой курс, надо же знать сколько это стоит юзеру и сколько дойдет до тебя.
KING_TRITON Автор
29.08.2024 14:26по поводу отладки не знаю, я купил 50 звезд и просто тестировал покупки по 1 звезде, 50 звезд стоит меньше 100 руб., не думаю что это большая сумма для теста, по поводу курса, в статье есть скриншот, где видно что 8 звезд это 0,104$, делим на 8 получаем 0,013$ за звезду, в остальном не знаю, еще не тестировал, вообще с выводом кажется будут танцы с бубном, потому вывести заработанные звезды можно будет через fragmet чрез TON, а тут я так понимаю еще будет учитываться курс доллара, в общем пока не понятно
d-sh
29.08.2024 14:26Самому себе нельзя передавать звезды? Значит еще и другой аккаунт нужен для тестов?
KING_TRITON Автор
29.08.2024 14:26да, я тоже был дико удивлен, когда в своем боте у меня оплата не проходила
d-sh
Куда попадут эти звёзды, и что с ними потом делать можно.
KING_TRITON Автор
звезды находятся внутри боты, в статье написано и прикреплены скриншоты, смотрите внимательно пожалуйста, звезды потом можно вывести или потратить на рекламу этого бота в котором звезды находятся, вообще если интересна эта тема, советую прочитать официальную документацию по звездам https://telegram.org/tos/stars
d-sh
Там написано про купле-продажу чего то. Звучит как коммерческая деятельность, как ее оформлять надо?
И не понятно можно ли таким способом просто донаты принимать а не продавать вещества.
И что значит вывод звёзд, можно просто на русскую карту рубли получить?
KING_TRITON Автор
на счет вывода пока не знаю, не тестировал, как оформлять тоже не знаю, но в случае чего у меня есть ТОО (этот как ООО в РФ), просто донаты тоже принимать можно, для этого нужно настроить бота так, чтобы юзер мог произвольно ввести кол-во звезд, или сделать кнопочки 10⭐️, 20⭐️, 30⭐️ и тд
KING_TRITON Автор
на https://pressanybutton.ru/post/novosti/telegram-stars-limity-i-vyvod/ там все расписано