Все работы

Магазин цифровых товаров в Telegram

Разработал с нуля систему продажи цифровых товаров: покупатель выбирает товар, оформляет заказ и получает материалы в Telegram, а сотрудник управляет каталогом, остатками и обращениями в веб-панели.

Задача: связать покупку и управление магазином

В магазине цифровых товаров нужно связать не только каталог и оплату. Покупатель должен выбрать доступную позицию, оформить заказ и получить предназначенные ему материалы. Сотрудник — подготовить товар к продаже, следить за остатками и обрабатывать обращения.

Я объединил эти действия в одну систему. Бот и веб-панель работают с общими товарами, материалами и заказами: содержимое, которое сотрудник подготовил в карточке, участвует в покупке и выдаче. У покупателя и команды разные интерфейсы, но один связанный процесс.

Как покупатель получает товар

Пополнение баланса — отдельная операция. Покупатель указывает сумму и получает ссылку внешнего платёжного сервиса. Подтверждённое пополнение зачисляется на внутренний баланс; заказ оформляется отдельно.

  1. Выбирает товар. Открывает каталог, переходит по категориям или пользуется поиском. В боте предусмотрены русский и английский интерфейсы.
  2. Добавляет в корзину и оформляет заказ. За позицией закрепляется конкретная доступная единица выдачи. При оформлении выбранной позиции система рассчитывает текущую стоимость, сохраняет её вместе с материалами в заказе и списывает сумму с баланса. Резерв удерживает единицу, но не фиксирует цену.
  3. Получает материалы в Telegram. Бот отправляет текст и вложения. Если отправка сорвалась, покупатель может открыть свои покупки и повторить получение по существующему заказу — без нового списания.

Концептуальная схема

  1. Выбор товара

    Каталог и поиск в Telegram

  2. Оформление заказа

    Корзина резервирует единицу; при оформлении выбранной позиции сумма списывается с баланса

  3. Получение материалов

    Текст и вложения в Telegram

Баланс пополняется отдельно через внешний платёжный сервис. Пополнение само по себе не создаёт заказ.

Если отправка сорвалась, получение можно повторить по тому же заказу — без нового списания.

Покупка связывает выбор товара, оформление заказа и получение материалов. Пополнение баланса — отдельная операция, которая сама по себе не создаёт заказ. Повторное получение использует существующий заказ без нового списания.

Чем сотрудник управляет в веб-панели

Веб-панель — рабочее место сотрудника, связанное с каталогом и заказами бота. Здесь готовят содержимое для покупателя и управляют операциями магазина.

Каталог, материалы и остатки

В карточке товара сотрудник задаёт описание и цену, подготавливает текст и вложения для выдачи. Материалы редактируются в связанной форме, а не ведутся отдельным несвязанным справочником. Категории и порядок позиций помогают организовать каталог.

Для товаров можно задать порог остатка. Панель показывает позиции с низким или нулевым остатком и выделяет те, которым нужно внимание. Для удалённых карточек предусмотрены отдельная корзина и восстановление карточки.

Предзаказы и сообщения покупателям

Предзаказ приходит из бота как отдельная заявка. Сотрудник меняет её статус, оставляет внутренние комментарии и при необходимости отправляет покупателю сообщение. Это обращение для обработки, а не автоматически оплаченный и исполненный заказ.

Для покупателей предусмотрены подписки на появление позиции: добавление единицы через форму в панели запускает уведомление подписчиков. Сотрудник также управляет рассылками — от выбора адресатов до операций с отправленными сообщениями.

Доступ сотрудников и оформление бота

Я разделил разрешения на действия в панели и добавил дополнительные проверки отдельных операций. Система сохраняет отдельные изменения сотрудников и изменения баланса из админки: к этим записям можно обратиться при разборе операций.

Через панель сотрудник меняет предусмотренные тексты, медиа, кнопки и состав меню бота. Для таких изменений не нужно править код. Новые программные сценарии при этом требуют разработки: панель не заменяет её конструктором произвольной логики.

Какие решения я заложил в систему

Я самостоятельно разработал прикладную часть проекта: сценарии бота, хранение данных, внутренний баланс, корзину, заказы, выдачу и интеграции. Административную панель адаптировал на основе готовой библиотеки Flask-Admin — добавил связанные формы, действия и ограничения под работу магазина.

Основное внимание уделил связям между этапами:

  • Связал каталог с содержимым выдачи. Остаток определяется доступными единицами, а резерв закрепляет конкретную единицу за позицией корзины. При оформлении материалы сохраняются в заказе — у него есть собственное содержимое для дальнейшего получения, а не только ссылка на текущую карточку товара.
  • Разделил оформление и отправку материалов. Доступность материалов проверяется до создания заказа и списания. Если подготовить их не удаётся, оформление останавливается. Сбой отправки уже оформленного заказа обрабатывается иначе: покупатель повторяет получение, а не покупку. Так разные проблемы не сводятся к одному действию «попробовать купить ещё раз».
  • Добавил фоновые операции. Проверка статусов оплаты, предусмотренное освобождение незавершённых резервов и отложенные сообщения выполняются без отдельной команды покупателя на каждое действие.

Результат и дальнейшее развитие

Получилась система, в которой подготовка цифрового товара сотрудником связана с выбором, заказом и получением в Telegram. Покупатель оформляет заказ и возвращается к своим покупкам, а команда работает с каталогом, остатками, заявками и сообщениями через веб-панель.

Я выполнил настройку, запустил проект на сервере и передал заказчику. Система работает несколько лет; по мере необходимости я дорабатываю и модернизирую её под требования клиента. За это время состав возможностей развивался вместе с проектом.

Технологии: Python, python-telegram-bot, Flask / Flask-Admin, SQLAlchemy, PostgreSQL, Taskiq / NATS, Docker Compose. Интеграции с Telegram и внешними платёжными сервисами.

Обсудим вашу задачу?

Коротко опишите, что хотите изменить или создать. Готовое ТЗ не нужно.