Назад к статьям

Бот-магазин в Telegram: каталог и оплата

В статье разберём, как устроен бот-магазин в Telegram: каталог, корзина, оплата по ссылке и связь с платёжкой. Все примеры можно адаптировать под ЮKassa, Stripe или другую систему.

Что умеет бот-магазин

Каталог товаров (карточки с фото и ценой), корзина, оформление заказа и оплата. Оплату подключают через ЮKassa, Stripe, криптоплатежи. После оплаты бот обновляет статус заказа и может выдать доступ (ссылку на курс, ключ) или отправить чек.

Пошаговая логика

  1. Пользователь открывает каталог — бот показывает товары с кнопками «В корзину» или «Купить».
  2. При нажатии можно добавить товар в корзину (хранить в БД или FSM) или сразу перейти к оплате одного товара.
  3. Бот создаёт платёж в платёжной системе и получает confirmation_url. Пользователю отправляется сообщение с кнопкой «Перейти к оплате».
  4. После оплаты платёжная система шлёт 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 даёт каталог, корзину и оплату в одном месте. Важно продумать оплату, уведомления о заказах и при необходимости интеграцию с вашей учётной системой.