Демо-магазин внутри Telegram, собранный как шаблон для реальных заказов: каталог с поиском и категориями, карточка товара с выбором объёма и помола, корзина с пересчётом и бесплатной доставкой от 1500 рублей, оформление заказа и отдельная админка со сводкой по заказам, выручке, среднему чеку и остаткам.
Задача была не «нарисовать красиво», а собрать работающий каркас: чтобы владелец видел заказы в чате, сам менял товары и цены, а покупатель проходил путь от каталога до подтверждения без единого перехода на сторонний сайт.
Стек: чистый HTML/CSS/JS без сборки, Python на стандартной библиотеке и SQLite. Ни одной внешней зависимости — приложение разворачивается на любом сервере и не ломается от обновления пакетов.
Что важно в реализации:
— Сумма заказа считается на сервере по ценам из базы. Цену с клиента не принимаем, иначе её можно подделать через консоль браузера. Порог бесплатной доставки тоже серверный.
— Подпись initData от Telegram проверяется по алгоритму HMAC с ключом WebAppData. Без валидной подписи заказ не привязывается к пользователю.
— Уведомление о заказе уходит владельцу в чат через Bot API, получателя бот запоминает сам при первом сообщении.
— Кнопка Mini App выставляется в боте через API, BotFather не нужен. Аватар боту тоже ставится через API методом setMyProfilePhoto.
Отдельно проверял сквозной путь кликами, а не только эндпоинты: именно так нашёлся баг, при котором кнопка «Оплатить» ничего не делала, потому что нижняя панель переиспользовалась между экранами и меняла подпись, но не обработчик.
Приложение работает и открыто для проверки: витрина https://vvs35.ru , админка https://vvs35.ru/admin , бот @demo5app_bot Домен, SSL и автозапуск настроены, сервис поднят под systemd за nginx.
Это не картинка в презентации, а рабочий каркас: под конкретного заказчика меняются каталог, поля карточки и логика доставки, а серверная часть, проверка подписи и админка остаются теми же. За счёт этого запуск магазина занимает дни, а не недели.