Ниже — упрощённая пошаговая инструкция и рабочий пример на Python, которые помогут настроить оплату «звёздами» (или любую оплату через платежного провайдера) для Telegram‑бота. Типичные причины «не получается» — неверный provider_token / не добавлен провайдер в BotFather, отсутствие обработки pre_checkout_query, неверный формат сумм или попытка принимать оплату не в приватном чате. Всё это учтено в инструкции.
Коротко — этапы
1. Зарегистрируйтесь у платежного провайдера, которого поддерживает Telegram (например, Stripe, YooMoney и т.д.). Получите у провайдера токен/ключ (provider token / API key).
2. В BotFather включите платежи: откройте ваш бот → Bot Settings → Payments → Add Payment Provider и введите provider token (или используйте тестовый провайдер, если нужно). Это «связывает» бота с провайдером.
3. В коде бота используйте метод sendInvoice (send_invoice в python-библиотеках), передавая provider_token (тот же токен от провайдера), currency и цены.
4. Обязательно обрабатывайте pre_checkout_query и отвечайте на него положительно (answerPreCheckoutQuery / answer_pre_checkout_query). Без этого оплата не пройдёт.
5. Обрабатывайте успешную оплату через update.message.successful_payment (или соответствующий хэндлер).
Важные примечания
- Оплаты обычно поддерживаются только в приватных чатах с ботом.
- Суммы передаются в минимальных единицах валюты (для RUB — копейки). LabeledPrice.amount — целое число. Например, 1 рубль = 100.
- payload — ваша уникальная строка для идентификации заказа/сессии.
- Убедитесь, что валюта поддерживается провайдером и вашим аккаунтом у провайдера.
- Для тестирования используйте тестовый провайдер/режим в BotFather или тестовые ключи провайдера (например, Stripe тестовые ключи).
Пример на python-telegram-bot (Upater style, v12–v13). Подставьте свои токены и данные:
```python
from telegram import LabeledPrice, Bot
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
BOT_TOKEN = "ВАШ_BOT_TOKEN"
PROVIDER_TOKEN = "ВАШ_PROVIDER_TOKEN" # токен, который вы зарегистрировали у провайдера и добавили в BotFather
def start(update, context):
update.message.reply_text("Привет! Напиши /buy чтобы купить звёзды.")
def buy(update, context):
chat_id = update.effective_chat.id
title = "Набор звёзд"
description = "Пакет из 10 звёзд"
payload = "order_12345" # ваша уникальная строка
currency = "RUB"
# Цена: 10.00 RUB = 1000 копеек
prices = [LabeledPrice("10 звёзд", 1000)]
context.bot.send_invoice(
chat_id,
title=title,
description=description,
payload=payload,
provider_token=PROVIDER_TOKEN,
start_parameter="buy-stars",
currency=currency,
prices=prices,
)
def precheckout_callback(update, context):
query = update.pre_checkout_query
# можно дополнительно проверить payload и т.д.
if query.invoice_payload != "order_12345":
# отклонить
context.bot.answer_pre_checkout_query(query.id, ok=False, error_message="Неверный payload")
else:
context.bot.answer_pre_checkout_query(query.id, ok=True)
def successful_payment_callback(update, context):
payment = update.message.successful_payment
# payment содержит информацию о платеже: total_amount, currency, provider_payment_charge_id и т.д.
update.message.reply_text("Спасибо! Платёж получен. Вы купили звёзды.")
# здесь даём пользователю звёзды по payload / id заказа
def main():
updater = Updater(BOT_TOKEN, use_context=True)
dp = updater.dispatcher
dp.add_handler(CommandHandler("start", start))
dp.add_handler(CommandHandler("buy", buy))
dp.add_handler(MessageHandler(Filters.successful_payment, successful_payment_callback))
dp.add_handler(MessageHandler(Filters.pre_checkout_query, precheckout_callback)) # для старых версий: лучше использовать PreCheckoutQueryHandler
updater.start_polling()
updater.idle()
if __name__ == '__main__':
main()
```
Если вы используете aiogram или другую библиотеку — логика та же:
- send_invoice / sendInvoice,
- ответ на PreCheckoutQuery (answer_pre_checkout_query),
- обработка successful_payment.
Частые ошибки и как их диагностировать
- Не отвечает pre_checkout_query — пользователь видит ошибку оплаты. Решение: реализовать обработчик и вызывать answer_pre_checkout_query(query.id, ok=True).
- Неправильный provider_token или не зарегистрирован в BotFather — платежи отклоняются. Проверьте, что вы используете тот же токен, который ввели в BotFather, и что аккаунт провайдера активен.
- Суммы не в минимальных единицах / дробные суммы — LabeledPrice.amount должен быть целым.
- Попытка отправить счёт в группе/канале — оплата может не работать. Тестируйте в приватном чате.
- Webhook с неверным SSL — если вы используете webhooks, убедитесь в корректности HTTPS и валидности сертификата.
- Валюта или страна пользователя не поддерживается провайдером — проверьте ограничения провайдера.
Если не работает — что прислать мне, чтобы помочь дальше
- Лог ошибок (stack trace, ответы от API).
- Код, где вы отправляете invoice и где обрабатываете pre_checkout_query.
- Что именно происходит при попытке оплаты (какое сообщение об ошибке видит пользователь).
- Какой провайдер и используете ли вы тестовый режим.
Могу помочь разобрать конкретный код/логи — пришлите их, и я подскажу, где именно проблема.