В статье разберём, как устроен бот-магазин в Telegram: каталог, корзина, оплата по ссылке и связь с платёжкой. Все примеры можно адаптировать под ЮKassa, Stripe или другую систему.
Что умеет бот-магазин
Каталог товаров (карточки с фото и ценой), корзина, оформление заказа и оплата. Оплату подключают через ЮKassa, Stripe, криптоплатежи. После оплаты бот обновляет статус заказа и может выдать доступ (ссылку на курс, ключ) или отправить чек.
Пошаговая логика
- Пользователь открывает каталог — бот показывает товары с кнопками «В корзину» или «Купить».
- При нажатии можно добавить товар в корзину (хранить в БД или FSM) или сразу перейти к оплате одного товара.
- Бот создаёт платёж в платёжной системе и получает
confirmation_url. Пользователю отправляется сообщение с кнопкой «Перейти к оплате». - После оплаты платёжная система шлёт webhook на ваш сервер — вы проверяете подпись, обновляете заказ в БД и пишете пользователю в Telegram.
Каталог и кнопка «Оплатить»
Пример: каталог из словаря, кнопка по товару ведёт к созданию платежа и ссылке ЮKassa. callback_data для inline-кнопок — до 64 байт, формат cart:1 подходит.
from aiogram import Bot, Dispatcher, types, F
from aiogram.filters import Command
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
import uuid
# Каталог: id -> (название, цена в копейках)
CATALOG = {1: ("Курс Python", 299000), 2: ("Консультация", 500000)}
@dp.message(Command("catalog"))
async def catalog(message: types.Message):
kb = InlineKeyboardMarkup(inline_keyboard=[
[InlineKeyboardButton(text=f"{name} — {price//100} ₽", callback_data=f"cart:{id_}")]
for id_, (name, price) in CATALOG.items()
])
await message.answer("Каталог:", reply_markup=kb)
@dp.callback_query(F.data.startswith("cart:"))
async def add_and_pay(callback: types.CallbackQuery):
product_id = int(callback.data.split(":")[1])
name, price = CATALOG[product_id]
order_id = str(uuid.uuid4()) # или id из БД после INSERT заказа
payment_url = create_yookassa_payment(
amount=price, order_id=order_id, user_id=callback.from_user.id
)
await callback.message.answer(
f"Оплатить {name}:",
reply_markup=InlineKeyboardMarkup(inline_keyboard=[
[InlineKeyboardButton(text="Перейти к оплате", url=payment_url)]
]),
)
await callback.answer()
create_yookassa_payment — ваша функция: запрос к API ЮKassa (создание платежа), в ответе берёте confirmation.confirmation_url. В метаданных платежа сохраняйте order_id и user_id, чтобы в webhook понять, какому пользователю отправить сообщение.
Webhook оплаты
На HTTPS-эндпоинт приходит POST от ЮKassa при смене статуса платежа. Нужно: проверить подпись (секрет в личном кабинете), убедиться, что event == "payment.succeeded", по payment.metadata взять user_id, обновить заказ в БД и отправить bot.send_message(user_id, "Оплата прошла! Доступ: ...").
Корзина (несколько товаров)
Если нужна корзина: храните в БД таблицу cart (user_id, product_id, quantity) или во временном хранилище (Redis, FSM). По команде «Оформить заказ» считайте сумму, создайте один платёж на всю сумму и в метаданных сохраните состав заказа (например JSON с product_id и quantity).
Связь с 1С и CRM
Для магазинов с большим ассортиментом и складом бота часто подключают к 1С или CRM: товары и остатки подтягиваются из внешней системы, заказы уходят туда же. Альтернативы ЮKassa для приёма оплаты: Stripe, Robokassa.
Итоги
Бот-магазин в Telegram даёт каталог, корзину и оплату в одном месте. Важно продумать оплату, уведомления о заказах и при необходимости интеграцию с вашей учётной системой.