Задача

Создать Telegram-бота или mini-app для продажи цифровых товаров (например, лицензионных ключей или текстовой информации). Ключевое требование - все должно работать на serverless-инфраструктуре (Cloudflare Workers, AWS Lambda, Google Cloud Functions или аналоги), без аренды выделенного сервера или VPS. Используется официальный API платежного шлюза для приема оплат.

Технические требования

Архитектура и инфраструктура

  • Обязательное использование serverless-платформы (без администрирования VPS).
  • Прием и отправка сообщений через Telegram Webhook.

Интеграция с платежным шлюзом

  • Оплата через официальный Webhook.
  • Требуется проверка цифровой подписи и статуса платежа.
  • Успешным считаются статусы с текстом Approved или Success.
  • Реализовать защиту от выполнения повторной обработки одного и того же уведомления (Webhook).

Логика бизнеса

  • Пользователь запускает диалог командой /start.
  • Интерфейс включает кнопки: Купить, Мои покупки, Поддержка.
  • Выводится список доступных товаров с ценами.
  • После успешного проведения платежа бот отправляет уникальный цифровой товар (ключ/текст).
  • Каждый товар (ключ) должен быть выдан однократно.
  • При исчерпании запаса ключей заказ помечается как ожидает исполнения, а пользователь автоматически уведомляется. Администратор может выдать товар вручную позднее.

Инструменты администратора

  • Доступ к группе команд/меню с привязкой только к заданному Telegram User ID.
  • Возможность добавлять, редактировать товары.
  • Загрузка ключей списком (bulk-импорт).
  • Контроль за остатками ключей по каждому элементу.
  • Просмотр всей базы заказов (статусов оплаты/цифровых значений).
  • Функция ручной выдачи товаров в непредвиденных (исчерпано/Hold) обстоятельствах.

Хранение данных

  • Данные (пользователи; товары; ключи; заказы; история платежей) обязаны лежать в persistence-слое, хранилище бессерверного типа запущенное и пригодное для infinite horizontal scaling under cont? (NoSQL датирует: Cloudflare KV, D1/SupaB точковые/pac-pgbouncer compatible/not conflicting). Если название или характеристика указанные без бренда, задачник виноват - помещать server.