Владелец сервиса или интернет-магазина часто выбирает между двумя крайностями: собрать весь процесс в сообщениях бота или сразу разрабатывать отдельный интерфейс. Полезнее начать не с технологии, а с действий пользователя. Один короткий вопрос удобно задать в диалоге. Сравнение дат, фильтрация каталога, выбор нескольких позиций и проверка состава заявки требуют структурированного экрана.
Telegram Mini Apps для бизнеса дают такой экран внутри Telegram, но не отменяют бота и сервер. Бот ведёт диалог, WebApp показывает форму, а backend выполняет доверенные проверки. Эта статья помогает выбрать архитектуру интерфейса. Оплата остаётся отдельным техническим вопросом и в сравнение не входит.
Какую задачу решает этот процесс
Представим владельца сервиса аренды. Клиенту нужно объяснить цель обращения, выбрать даты, найти позиции в каталоге, указать количество и отправить заявку. Если перенести всё в сообщения, человек будет много раз нажимать кнопки и возвращаться к предыдущим ответам. Если открыть Mini App для одного вопроса, отдельный экран только усложнит путь.
Практическое правило такое:
- короткий линейный диалог с последовательными вопросами оставляют в боте;
- сравнение и редактирование нескольких связанных значений переносят в структурированный интерфейс;
- проверку личности, срока данных, наличия и повторов выполняют на backend независимо от выбранного UX.
Результат процесса — не решение «бот или Mini App навсегда», а граница между их ролями в одном пользовательском сценарии. У сервиса может остаться бот для входа, уведомлений и простых вопросов, а Mini App — для формы или каталога. Если нужно сначала сравнить типы диалоговых решений шире, поможет руководство по выбору чат-бота.
Какие данные и правила подготовить
До проектирования экрана опишите действия пользователя, данные и владельцев правил. Иначе команда будет обсуждать цвета и кнопки, не зная, откуда берётся каталог и кто решает, сколько живёт сессия.
Разделите сведения на три группы:
- обязательные — без них нельзя определить основной путь;
- условные — нужны только для выбранной архитектуры;
- неизвестные — требуют проверки до разработки и приёмки.
Ниже — заполненный синтетический образец. Это не клиентские данные и не результат внедрения.
| Поле | Значение | Обязательность | Источник | Ответственный |
|---|---|---|---|---|
| Действие пользователя | Оформить заявку на аренду | Обязательное | Владелец процесса | Менеджер продукта |
| Один вопрос бота | Для какого события нужна аренда? | Обязательное | Сценарий | Редактор процесса |
| Объём формы | Даты, позиции и количество | Обязательное | Пользовательский сценарий | Менеджер продукта |
| Каталог | Две условные позиции | Условное | Backend каталога | Владелец API |
| Telegram user ID | Условный 100000001 из проверенного initData | Условное | Telegram | Backend-разработчик |
| Срок сессии | Условные 900 секунд | Условное проектное правило | Политика сервиса | Специалист по безопасности |
| Требования устройств | Не определены до проверки целевых устройств | Неизвестное | Данные заказчика и проверка | Заказчик и разработчик |
| Сервер API и права доступа | Не определены до обследования | Неизвестное | Документация и настройки сервиса | Владелец API |
Если таблица не помещается, прокрутите её вправо. С клавиатуры используйте стрелки.
Дополнительно зафиксируйте источник времени на сервере, правило допустимого рассогласования часов, формат request_key для защиты от дублей и действие сотрудника при ошибке. Telegram user ID нельзя просто взять из объекта браузера и считать подтверждённой личностью: сначала backend должен проверить переданные Telegram данные.
Когда достаточно обычного Telegram-бота
Обычного бота достаточно, если пользователь движется по короткому маршруту и редко возвращается к предыдущему выбору. Например, бот спрашивает тип события, получает один ответ и передаёт следующий шаг. Кнопки хорошо работают, когда вариантов немного и каждый новый вопрос зависит от одного предыдущего ответа.
Mini App стоит рассмотреть, когда человеку нужно видеть несколько значений одновременно:
| Действие | Бот | Структурированный интерфейс |
|---|---|---|
| Ответить на один вопрос | Один шаг в диалоге | Отдельный экран обычно избыточен |
| Заполнить длинную форму | Много сообщений, трудно проверить всё перед отправкой | Поля видны вместе, ошибки можно показать рядом с ними |
| Отфильтровать каталог | Потребуется серия сообщений и кнопок | Фильтры и результаты находятся на одном экране |
| Собрать корзину или список позиций | Состав приходится пересказывать текстом | Количество и выбранные строки можно редактировать вместе |
| Просмотреть таблицу | Ограниченный текстовый формат | Строки и столбцы можно представить структурированно |
Если таблица не помещается, прокрутите её вправо. С клавиатуры используйте стрелки.
Это критерии выбора, а не требование внедрять Mini App любому бизнесу. Если сценарий укладывается в несколько ясных шагов, бот будет проще для пользователя и команды. Даже при длинном процессе стоит проверить, можно ли сократить саму форму, прежде чем добавлять новый интерфейс.
Как устроены интерфейс и сервер Mini App
В выбранной архитектуре участвуют три разных компонента.
- Бот начинает диалог, задаёт короткий вопрос, открывает WebApp и после завершения сообщает статус.
- WebApp показывает форму, даты, каталог и состав заявки. Он передаёт введённые значения и исходные данные Telegram на backend.
- Backend проверяет подпись и срок initData, заново проверяет наличие, применяет правила валидации и не создаёт второй результат при повторной отправке.
Официальная документация Telegram Mini Apps описывает веб-интерфейс внутри клиента Telegram и серверную проверку переданных данных. Документированная последовательность проверки initData выглядит так:
- Backend разбирает полученные поля и исключает поле
hashиз набора для расчёта. - Оставшиеся пары сортирует по имени поля.
- Из строк
key=value, соединённых переводом строки, собираетdata_check_string. - Вычисляет секретный ключ через HMAC-SHA256: ключ — строка
WebAppData, сообщение — токен бота. - Вычисляет HMAC-SHA256 для
data_check_string, используя полученный секретный ключ. - Сравнивает рассчитанное значение с полученным
hashбезопасным сравнением.
Токен бота остаётся на сервере. В статье намеренно нет вымышленного токена, подписи или заявления о живом тесте. Перед реализацией разработчик должен сверить точный порядок операций с актуальной официальной документацией Telegram Mini Apps и применяемым способом проверки.
Отдельно backend проверяет свежесть данных. Можно задать правило age = server_now − auth_date и принимать запрос, только когда возраст не отрицателен и не превышает session_TTL, с отдельно согласованным допуском на рассогласование часов.
В синтетическом примере auth_date = 1800000000, server_now = 1800000600, поэтому age = 600 секунд. При условном session_TTL = 900 секунд проверка срока проходит: 0 ≤ 600 ≤ 900. Этот расчёт подтверждает только свежесть учебных данных. Подпись проходит лишь тогда, когда серверный расчёт действительно совпал с полученным hash.
initDataUnsafe удобно использовать для отображения, но нельзя считать доказательством личности: значения находятся на стороне клиента. Доверенное решение backend принимает по проверенному initData, сроку и собственным правилам доступа.
Как выбрать первый сценарий и проверить устройство
Для первого сценария возьмите минимальный экран, на котором пользователь:
- выбирает диапазон дат;
- видит две позиции каталога;
- указывает количество;
- проверяет состав и нажимает кнопку отправки.
После подтверждения backend WebApp возвращает пользователя в диалог, а бот показывает один номер заявки. Не добавляйте в первый экран оплату, личный кабинет и соседние операции: они требуют отдельных решений и проверок.
До запуска разберите мобильные состояния:
- Узкий viewport. Поля и кнопка отправки не должны выходить за безопасную область или требовать горизонтальной прокрутки. Конкретные устройства и версии клиента определяет заказчик до приёмки.
- Кнопка «Назад». Пользователь возвращается к предыдущему состоянию без случайной отправки. Если есть несохранённые изменения, интерфейс действует по заранее согласованному правилу.
- Потеря сети до подтверждения. Экран не сообщает об успехе, пока backend не вернул номер. Введённые значения по возможности остаются доступными для повтора.
- Неопределённый результат отправки. Клиент повторяет запрос с тем же
request_key, а не создаёт новую заявку. Backend возвращает ранее созданный результат либо безопасно завершает первую операцию. - Mini App недоступен. Бот предлагает резервный линейный выбор дат и позиций кнопками или передаёт обращение человеку по правилам сервиса.
Стоимость и срок разработки зависят от сценариев, API, прав, устройств и правил эксплуатации. Без этих данных численная оценка была бы выдуманной.
Учебный пример: путь от входных данных до результата
Ниже — синтетическая заявка на аренду. Она показывает логику выбора и проверок, но не является клиентским кейсом, файлом или результатом Switch On AI.
Исходные данные:
- бот задаёт один вопрос: «Для какого события нужна аренда?»;
- пользователь условно выбирает период 10–12 мая 2030 года;
- для позиции A запрошено 2 единицы, доступно 3;
- для позиции B запрошено 4 единицы, доступно 4;
request_key = DEMO-001;- условный Telegram user ID — 100000001;
session_TTL = 900секунд;- рассчитанный возраст initData — 600 секунд.
Промежуточное решение по интерфейсу:
| Критерий | Обычный бот | Mini App | Решение для примера |
|---|---|---|---|
| Один короткий вопрос | Удобно задать в диалоге | Задать можно, но отдельный экран не нужен | Оставить в боте |
| Диапазон дат | Потребуется несколько последовательных шагов | Единый элемент формы | Mini App |
| Выбор нескольких позиций | Громоздкая серия сообщений и кнопок | Каталог с количеством | Mini App |
| Обзор состава заявки | Ограниченный текстовый список | Структурированная форма | Mini App |
| Проверка подписи и наличия | Обязательна независимо от UX | Обязательна независимо от UX | Backend |
| Вариант без Mini App | Последовательный выбор дат и позиций кнопками | Не применяется | Сохранить как резервный путь |
Если таблица не помещается, прокрутите её вправо. С клавиатуры используйте стрелки.
После отправки backend заново проверяет данные. Для наличия условие выполняется по каждой строке: 2 ≤ 3 и 4 ≤ 4. Возраст initData также укладывается в условный TTL. Если серверная проверка подписи прошла и наличие не изменилось, backend создаёт условный номер RENT-DEMO-001.
Повтор с тем же ключом не должен создавать второй номер. Правило учебного примера: одному request_key = "DEMO-001" соответствует один номер заявки. Поэтому backend возвращает тот же RENT-DEMO-001. Практический результат архитектуры: бот отвечает за вход и один вопрос, Mini App — за даты и позиции, backend — за доверенные проверки и единственный номер заявки.

Как проверить результат перед запуском
Приёмка должна различать внешний UX и результат на backend. Красивое подтверждение на экране не доказывает, что заявка создана один раз, а Telegram user ID из браузерного объекта не подтверждает авторизацию.
| Сценарий | Ожидаемый результат | Сигнал ошибки | Действие человека |
|---|---|---|---|
Нормальная отправка и повтор с DEMO-001 | Один номер RENT-DEMO-001; повтор возвращает его же | Номер не получен или для одного ключа пришли разные номера | Остановить выпуск сценария и проверить журнал backend и правило идемпотентности |
| Наличие позиции B изменилось с 4 до 3 при запросе 4 | Отказ без номера и предложение изменить количество, потому что 4 ≤ 3 ложно | Номер создан вопреки нехватке | Проверить транзакцию повторной валидации наличия |
| Нажатие «Назад» до отправки | Возврат по согласованному правилу без заявки | Появился номер без подтверждения | Проверить обработчик навигации и журнал запросов |
| Сеть пропала после отправки, но до ответа | Повтор с тем же request_key возвращает прежний результат или безопасно завершает операцию | Создан дубль либо интерфейс показывает неподтверждённый успех | Сверить запросы, ключ и сохранённый результат на backend |
| Mini App недоступен | Бот предлагает резервный линейный сценарий или передачу человеку | Пользователь остаётся без следующего шага | Проверить резервную ветку и текст сообщения |
Если таблица не помещается, прокрутите её вправо. С клавиатуры используйте стрелки.
Также проверьте отклонение просроченного initData, отрицательный возраст за пределами разрешённого рассогласования часов, изменение данных после первой загрузки каталога и отсутствие обязательного количества. Для каждой ситуации заранее запишите вход, ожидаемый ответ пользователю и состояние backend.
Что согласовать для внедрения
Telegram предоставляет способы запуска Mini App, WebApp API и механизм передачи данных. Но каталог, правила доступности, API сервиса, срок сессии, защита от дублей, журнал ошибок и резервный путь относятся к собственной интеграции. Их нельзя считать готовыми только потому, что форма открылась внутри Telegram.
До разработки согласуйте:
- один пользовательский сценарий и границу между ботом и Mini App;
- поля формы, источники каталога и ответственных;
- серверную проверку initData и срок сессии;
- правило повторной отправки и единственного номера;
- целевые устройства, версии клиента Telegram и состояния без сети;
- права API, размещение, наблюдение за ошибками и передачу человеку;
- отдельное решение по оплате, если она входит в будущий проект.
Версия платформы, доступные API, тариф, права и совместимость с системами заказчика проверяются отдельно. Официальная документация не доказывает, что конкретное подключение уже работает у клиента.
Switch On AI может помочь сделать обоснованный выбор между кнопками бота и веб-интерфейсом внутри Telegram, а после проверки данных и API — разработать ИИ-помощника, бота или интеграцию для согласованной операции. На странице разработки чат-ботов описаны границы такой работы и проверка результата в целевой системе.
Следующий шаг — показать один пользовательский сценарий: что человек вводит, что выбирает и какой подтверждённый результат должен получить. Опишите операцию — разберём её и согласуем прототип архитектуры. Прототип помогает уточнить требования, но не равен полноценному внедрению и не обещает заранее эффект или срок.
Вопросы по этой задаче
Mini App заменяет бота?
Не обязательно. Бот может начинать и продолжать диалог, задавать короткие вопросы и сообщать результат, а Mini App — показывать форму, каталог или выбор дат. Границу определяют действия пользователя.
Нужен ли отдельный сервер?
Доверенный backend нужен, если сценарий должен проверять initData, срок данных, наличие позиций и повторные отправки. Сам интерфейс в браузере не должен принимать окончательное решение о личности пользователя или создании заявки.
Какие данные Telegram можно считать доверенными?
Только те, для которых backend проверил подпись и допустимый срок по актуальной документации Telegram, а затем применил собственные правила доступа. Telegram user ID из initDataUnsafe или другого браузерного объекта сам по себе недостаточен.
