Почему Telegram — мощный канал продаж цифровых товаров
Во многих рынках — России, Украине, Индии, Юго-Восточной Азии — Telegram является основной коммуникационной платформой. Пользователи доверяют ботам для покупок, особенно цифровых товаров, где физическая доставка не требуется. Хорошо построенный Telegram-магазин может превзойти традиционный сайт по конверсии, особенно для постоянных покупателей.
В этом руководстве показано, как создать production-ready Telegram-бота для продажи подарочных карт Google Play с мгновенной доставкой на основе оптового API FoxReload.
Архитектура
Пользователь → Telegram-бот (python-telegram-bot)
↓
Ваш бэкенд-сервер
↓
API FoxReload (оптовые поставки)
↓
Платёжный провайдер (Telegram Payments / Stripe / CryptoBot)
Шаг 1 — Создание бота и получение токена
- Откройте Telegram и напишите @BotFather
- Отправьте
/newbotи следуйте инструкциям - Сохраните токен бота:
1234567890:ABCDefGhIjklMnOPQrsTUVwxyz
Настройте переменные окружения:
export TELEGRAM_BOT_TOKEN="your_bot_token"
export FOXRELOAD_API_KEY="your_foxreload_key"
export PAYMENT_TOKEN="your_payment_provider_token"
Шаг 2 — Настройка фреймворка бота
from telegram.ext import (
Application, CommandHandler, CallbackQueryHandler,
PreCheckoutQueryHandler, MessageHandler, filters
)
app = Application.builder().token(os.environ["TELEGRAM_BOT_TOKEN"]).build()
app.add_handler(CommandHandler("start", start_handler))
app.add_handler(CommandHandler("catalog", catalog_handler))
app.add_handler(CallbackQueryHandler(button_handler))
app.add_handler(PreCheckoutQueryHandler(precheckout_handler))
app.add_handler(MessageHandler(filters.SUCCESSFUL_PAYMENT, payment_handler))
app.run_polling()
Шаг 3 — Создание меню каталога
Когда пользователь отправляет /catalog, отображаем номиналы Google Play в виде инлайн-кнопок:
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
import requests
async def catalog_handler(update, context):
products = get_google_play_products()
keyboard = []
for p in products:
label = f"Google Play ${p['face_value']} — ${p['retail_price']}"
keyboard.append([
InlineKeyboardButton(label, callback_data=f"buy:{p['id']}")
])
reply_markup = InlineKeyboardMarkup(keyboard)
await update.message.reply_text(
"🎮 Подарочные карты Google Play\nВыберите номинал:",
reply_markup=reply_markup
)
def get_google_play_products():
r = requests.get(
"https://api.foxreload.com/api/v1/catalog",
headers={"Authorization": f"Bearer {os.environ['FOXRELOAD_API_KEY']}"},
params={"category": "google-play", "in_stock": "true"}
)
products = r.json()["products"]
# Добавляем наценку 15%
for p in products:
p["retail_price"] = round(p["wholesale_price"] * 1.15, 2)
return products
Шаг 4 — Обработка кнопки «Купить»
Когда пользователь нажимает номинал, отправляем платёжный счёт:
async def button_handler(update, context):
query = update.callback_query
await query.answer()
if query.data.startswith("buy:"):
product_id = query.data.split(":")[1]
product = get_product_by_id(product_id)
await context.bot.send_invoice(
chat_id=query.message.chat_id,
title=product["name"],
description=f"Мгновенная доставка • Регион {product['region']}",
payload=f"order:{product_id}:{query.from_user.id}",
provider_token=os.environ["PAYMENT_TOKEN"],
currency="USD",
prices=[
LabeledPrice(
label=product["name"],
amount=int(product["retail_price"] * 100) # в центах
)
],
need_email=True,
send_email_to_provider=True
)
Шаг 5 — Валидация pre-checkout запроса
Telegram отправляет pre-checkout запрос перед списанием средств. Здесь проверяем наличие товара:
async def precheckout_handler(update, context):
query = update.pre_checkout_query
payload_parts = query.invoice_payload.split(":")
product_id = payload_parts[1]
# Проверяем наличие перед подтверждением оплаты
if is_in_stock(product_id):
await query.answer(ok=True)
else:
await query.answer(
ok=False,
error_message="Извините, этот товар только что закончился. Пожалуйста, выберите другой номинал."
)
Шаг 6 — Выполнение заказа после успешной оплаты
async def payment_handler(update, context):
payment = update.message.successful_payment
payload_parts = payment.invoice_payload.split(":")
product_id = payload_parts[1]
user_id = payload_parts[2]
charge_id = payment.provider_payment_charge_id
try:
# Размещение оптового заказа
order_response = requests.post(
"https://api.foxreload.com/api/v1/orders",
headers={
"Authorization": f"Bearer {os.environ['FOXRELOAD_API_KEY']}",
"Idempotency-Key": charge_id
},
json={
"product_id": product_id,
"quantity": 1,
"external_order_id": charge_id
}
)
order_data = order_response.json()
code = order_data["codes"][0]["code"]
# Доставка кода пользователю
await update.message.reply_text(
f"✅ *Оплата подтверждена!*\n\n"
f"Ваш код подарочной карты Google Play:\n\n"
f"`{code}`\n\n"
f"_(нажмите, чтобы скопировать)_\n\n"
f"*Как активировать:*\n"
f"1. Откройте Google Play\n"
f"2. Нажмите профиль → Платежи → Активировать подарочный код\n"
f"3. Введите код выше",
parse_mode="Markdown"
)
except Exception as e:
# Возврат средств при ошибке
await context.bot.refund_star_payment(user_id, charge_id)
await update.message.reply_text(
"Извините, произошла ошибка при выдаче кода. Оплата автоматически возвращена."
)
Шаг 7 — Команда истории заказов
async def orders_handler(update, context):
user_id = update.effective_user.id
orders = db.get_user_orders(user_id, limit=10)
if not orders:
await update.message.reply_text("У вас пока нет заказов.")
return
lines = ["*Ваши последние заказы:*\n"]
for o in orders:
lines.append(f"• {o['product_name']} — `{o['code']}` ({o['date']})")
await update.message.reply_text("\n".join(lines), parse_mode="Markdown")
Меню команд бота
Зарегистрируйте команды у BotFather для удобного UX:
/start - Приветственное сообщение и меню
/catalog - Каталог подарочных карт Google Play
/orders - История ваших заказов
/support - Связаться с поддержкой
/help - Как пользоваться ботом
Технические рекомендации для production
- Ограничение запросов: добавьте rate-limit на пользователя для защиты от злоупотреблений
- Определение языка: отвечайте на языке интерфейса Telegram пользователя
- Логирование: записывайте каждый заказ с
user_id,charge_idиfox_order_id - Мониторинг: оповещение при ошибках выполнения > 1% от заказов
- Токены оплаты: тестируйте с тестовыми токенами Stripe до перехода в боевой режим
Смотрите также
- Как настроить мгновенную доставку подарочных карт Google Play
- Как подключить подарочные карты Google Play к магазину через API
- Как настроить вебхуки для доставки цифровых кодов
Запустите Telegram-бот для продажи подарочных карт. Подключитесь к оптовым поставкам FoxReload и начните продавать подарочные карты Google Play прямо в Telegram — без веб-сайта.

