Сегодня я покажу, как настроить платежи в вашем телеграм-боте, используя внутреннюю валюту 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.

Комментарии (10)


  1. d-sh
    29.08.2024 14:26

    Куда попадут эти звёзды, и что с ними потом делать можно.


    1. KING_TRITON Автор
      29.08.2024 14:26

      звезды находятся внутри боты, в статье написано и прикреплены скриншоты, смотрите внимательно пожалуйста, звезды потом можно вывести или потратить на рекламу этого бота в котором звезды находятся, вообще если интересна эта тема, советую прочитать официальную документацию по звездам https://telegram.org/tos/stars


      1. d-sh
        29.08.2024 14:26

        Там написано про купле-продажу чего то. Звучит как коммерческая деятельность, как ее оформлять надо?

        И не понятно можно ли таким способом просто донаты принимать а не продавать вещества.

        И что значит вывод звёзд, можно просто на русскую карту рубли получить?


        1. KING_TRITON Автор
          29.08.2024 14:26

          на счет вывода пока не знаю, не тестировал, как оформлять тоже не знаю, но в случае чего у меня есть ТОО (этот как ООО в РФ), просто донаты тоже принимать можно, для этого нужно настроить бота так, чтобы юзер мог произвольно ввести кол-во звезд, или сделать кнопочки 10⭐️, 20⭐️, 30⭐️ и тд


        1. KING_TRITON Автор
          29.08.2024 14:26

  1. 4wards1
    29.08.2024 14:26
    +1

    Звёзды в текущем виде - мертворождённый продукт. Дикие комиссии, неудобный вывод. Нет смысла их использовать, если у вас не слишком популярный бот, который может привлечь внимание "контролеров" из Telegram.


  1. d-sh
    29.08.2024 14:26

    А как это можно отлаживать? Делать фейковые покупки для тестирования.

    И какой курс, надо же знать сколько это стоит юзеру и сколько дойдет до тебя.


    1. KING_TRITON Автор
      29.08.2024 14:26

      по поводу отладки не знаю, я купил 50 звезд и просто тестировал покупки по 1 звезде, 50 звезд стоит меньше 100 руб., не думаю что это большая сумма для теста, по поводу курса, в статье есть скриншот, где видно что 8 звезд это 0,104$, делим на 8 получаем 0,013$ за звезду, в остальном не знаю, еще не тестировал, вообще с выводом кажется будут танцы с бубном, потому вывести заработанные звезды можно будет через fragmet чрез TON, а тут я так понимаю еще будет учитываться курс доллара, в общем пока не понятно


      1. d-sh
        29.08.2024 14:26

        Самому себе нельзя передавать звезды? Значит еще и другой аккаунт нужен для тестов?


        1. KING_TRITON Автор
          29.08.2024 14:26

          да, я тоже был дико удивлен, когда в своем боте у меня оплата не проходила