Задача: связать покупку и управление магазином
В магазине цифровых товаров нужно связать не только каталог и оплату. Покупатель должен выбрать доступную позицию, оформить заказ и получить предназначенные ему материалы. Сотрудник — подготовить товар к продаже, следить за остатками и обрабатывать обращения.
Я объединил эти действия в одну систему. Бот и веб-панель работают с общими товарами, материалами и заказами: содержимое, которое сотрудник подготовил в карточке, участвует в покупке и выдаче. У покупателя и команды разные интерфейсы, но один связанный процесс.
Как покупатель получает товар
Пополнение баланса — отдельная операция. Покупатель указывает сумму и получает ссылку внешнего платёжного сервиса. Подтверждённое пополнение зачисляется на внутренний баланс; заказ оформляется отдельно.
- Выбирает товар. Открывает каталог, переходит по категориям или пользуется поиском. В боте предусмотрены русский и английский интерфейсы.
- Добавляет в корзину и оформляет заказ. За позицией закрепляется конкретная доступная единица выдачи. При оформлении выбранной позиции система рассчитывает текущую стоимость, сохраняет её вместе с материалами в заказе и списывает сумму с баланса. Резерв удерживает единицу, но не фиксирует цену.
- Получает материалы в Telegram. Бот отправляет текст и вложения. Если отправка сорвалась, покупатель может открыть свои покупки и повторить получение по существующему заказу — без нового списания.
Концептуальная схема
- Выбор товара
Каталог и поиск в Telegram
- Оформление заказа
Корзина резервирует единицу; при оформлении выбранной позиции сумма списывается с баланса
- Получение материалов
Текст и вложения в Telegram
Баланс пополняется отдельно через внешний платёжный сервис. Пополнение само по себе не создаёт заказ.
Если отправка сорвалась, получение можно повторить по тому же заказу — без нового списания.
Чем сотрудник управляет в веб-панели
Веб-панель — рабочее место сотрудника, связанное с каталогом и заказами бота. Здесь готовят содержимое для покупателя и управляют операциями магазина.
Каталог, материалы и остатки
В карточке товара сотрудник задаёт описание и цену, подготавливает текст и вложения для выдачи. Материалы редактируются в связанной форме, а не ведутся отдельным несвязанным справочником. Категории и порядок позиций помогают организовать каталог.
Для товаров можно задать порог остатка. Панель показывает позиции с низким или нулевым остатком и выделяет те, которым нужно внимание. Для удалённых карточек предусмотрены отдельная корзина и восстановление карточки.
Предзаказы и сообщения покупателям
Предзаказ приходит из бота как отдельная заявка. Сотрудник меняет её статус, оставляет внутренние комментарии и при необходимости отправляет покупателю сообщение. Это обращение для обработки, а не автоматически оплаченный и исполненный заказ.
Для покупателей предусмотрены подписки на появление позиции: добавление единицы через форму в панели запускает уведомление подписчиков. Сотрудник также управляет рассылками — от выбора адресатов до операций с отправленными сообщениями.
Доступ сотрудников и оформление бота
Я разделил разрешения на действия в панели и добавил дополнительные проверки отдельных операций. Система сохраняет отдельные изменения сотрудников и изменения баланса из админки: к этим записям можно обратиться при разборе операций.
Через панель сотрудник меняет предусмотренные тексты, медиа, кнопки и состав меню бота. Для таких изменений не нужно править код. Новые программные сценарии при этом требуют разработки: панель не заменяет её конструктором произвольной логики.
Какие решения я заложил в систему
Я самостоятельно разработал прикладную часть проекта: сценарии бота, хранение данных, внутренний баланс, корзину, заказы, выдачу и интеграции. Административную панель адаптировал на основе готовой библиотеки Flask-Admin — добавил связанные формы, действия и ограничения под работу магазина.
Основное внимание уделил связям между этапами:
- Связал каталог с содержимым выдачи. Остаток определяется доступными единицами, а резерв закрепляет конкретную единицу за позицией корзины. При оформлении материалы сохраняются в заказе — у него есть собственное содержимое для дальнейшего получения, а не только ссылка на текущую карточку товара.
- Разделил оформление и отправку материалов. Доступность материалов проверяется до создания заказа и списания. Если подготовить их не удаётся, оформление останавливается. Сбой отправки уже оформленного заказа обрабатывается иначе: покупатель повторяет получение, а не покупку. Так разные проблемы не сводятся к одному действию «попробовать купить ещё раз».
- Добавил фоновые операции. Проверка статусов оплаты, предусмотренное освобождение незавершённых резервов и отложенные сообщения выполняются без отдельной команды покупателя на каждое действие.
Результат и дальнейшее развитие
Получилась система, в которой подготовка цифрового товара сотрудником связана с выбором, заказом и получением в Telegram. Покупатель оформляет заказ и возвращается к своим покупкам, а команда работает с каталогом, остатками, заявками и сообщениями через веб-панель.
Я выполнил настройку, запустил проект на сервере и передал заказчику. Система работает несколько лет; по мере необходимости я дорабатываю и модернизирую её под требования клиента. За это время состав возможностей развивался вместе с проектом.
Технологии: Python, python-telegram-bot, Flask / Flask-Admin, SQLAlchemy, PostgreSQL, Taskiq / NATS, Docker Compose. Интеграции с Telegram и внешними платёжными сервисами.