Своё приложение магазина: защищённые каналы, чтобы клиент всегда мог связаться с магазином

Магазин, который продаёт через бота в мессенджере и сайт, зависит от того, доступны ли они каждому клиенту. Собственное приложение держит каталог, заказ и переписку с магазином в одном месте и само находит рабочую дорогу к магазину.

Своё приложение магазина: защищённые каналы, чтобы клиент всегда мог связаться с магазином - Чат с магазином

Задача

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

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

Каталог и заказ в приложении

Вкладка “Каталог” - это витрина самого магазина, та же, что на сайте и в мини-приложении, открытая внутри приложения. Поиск, фильтры, карточки товаров и корзина работают как на сайте, а новый товар не требует обновлять приложение.

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

Чат, который приходит в ту же панель

Вкладка “Чат” - нативный чат с магазином. Для магазина это второй канал рядом с Telegram: переписка появляется в той же панели с пометкой, что клиент пишет из приложения, и отвечают на неё тот же ИИ-ассистент и те же менеджеры.

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

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

Аккаунт без паролей

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

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

Приложение само находит рабочий канал

Клиент никогда не выбирает сервер. Перед первым запросом приложение ищет отвечающий путь всегда в одном порядке:

  1. точка входа, которая сработала в прошлый раз;
  2. точки, которые магазин выдал этому телефону;
  3. точки из последнего подписанного списка каналов;
  4. свежая копия этого списка с зеркал;
  5. резервный шлюз;
  6. код, который менеджер присылает другим путём и который вводится вручную в настройках.

Каждого кандидата приложение быстро проверяет и пользуется первым ответившим, пока тот работает. Если не ответил никто, приложение сразу сообщает, что связи нет, а не заставляет клиента ждать, и вскоре пробует снова. Данные идут зашифрованными от приложения до самого магазина: точка входа только передаёт их дальше, прочитать не может и ничего не хранит.

Сменяемые точки входа из админки

Точки входа - небольшие взаимозаменяемые серверы, которыми владелец управляет на странице сети в настройках админки. Они делятся на три пула: общие точки, которые знает каждая установка, личные (по три на телефон, выдаются после первого оплаченного заказа) и резервный шлюз, к которому приложение обращается в последнюю очередь. Полного списка не знает ни одна установка.

Добавить точку - значит завести строку в панели, а выведенная из работы точка сразу пропадает из всех списков. Панель умеет и сама поднять новую точку через API аккаунта на хостинге и держать каждый пул между минимумом и максимумом - не больше шести новых серверов в сутки. Любое изменение общих точек заново публикует список каналов.

Подписанный список каналов на нескольких зеркалах

На случай, когда не отвечает ни один известный адрес, магазин публикует небольшой список каналов в нескольких независимых файловых хранилищах. Список подписан ключом магазина, а приложение сверяет подпись с ключом, встроенным в него: изменённый, просроченный или более старый, чем уже имеющийся, список отклоняется. Зеркало может отдавать список, но подменить его не может.

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

Доступность по каждой сети

Каждая установка сообщает магазину, какие точки входа у неё сработали, а какие нет, вместе с названием своей мобильной сети. Точка считается недоступной, только когда об этом за несколько часов сообщили несколько разных телефонов и подтвердивших её работу меньше, - так проблема в одной сети не выключает точку для всех. Кроме того, сервер раз в минуту сам проверяет каждую точку.

Обзор “Сеть” собирает всё на одном экране: карточку на каждую точку с числом телефонов на ней, счётчики установок в сети, в фоне и отвалившихся с графиками за 30 дней, схему того, какой телефон через какую точку ходит, и список установок с сетью, версией приложения и временем последней связи. Любая точка или установка открывается в боковой панели со всем, что о ней известно.

Технологии

- Приложение: Kotlin, Jetpack Compose (Material 3), Android 8.0+
- Сеть и фоновые задачи: OkHttp, WorkManager
- Безопасность: Android Keystore (подписи P-256), Tink (проверка Ed25519 для списка)
- Витрина: сайт на Astro во WebView с мостом для оформления заказа
- Сервер и админка: Laravel 13, React + Inertia
- Зеркала списка каналов: любое S3-совместимое хранилище

Результат

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

Статус: приложение и серверная часть готовы и проверены на эмуляторе с локальными тестовыми серверами, а на телефоне прошли инструментальные тесты; в рабочую среду их ещё не развернули, и клиентам приложение пока не опубликовано.

Похожие кейсы

Магазин в Telegram: ИИ-продавец, мини-приложение и оплата прямо в чате

Магазин в Telegram: ИИ-продавец, мини-приложение и оплата прямо в чате

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

Омниканальная CRM: WhatsApp, Telegram, почта, звонки и формы сайта в одном месте - и ни одна заявка не теряется

Омниканальная CRM: WhatsApp, Telegram, почта, звонки и формы сайта в одном месте - и ни одна заявка не теряется

Заявки приходят в WhatsApp, в Telegram, на почту, по телефону и с сайта, и у каждого канала своё приложение. CRM Yatoday сводит их в одну воронку, узнаёт клиентов, которые обращаются снова, и сообщает команде о новой заявке в ту же минуту.

Каталог, который наполняется сам: парсеры, прайсы поставщиков и импорт, который можно откатить

Каталог, который наполняется сам: парсеры, прайсы поставщиков и импорт, который можно откатить

Тысячи товаров из нескольких источников - это бесконечное копирование: новые модели, изменённые характеристики, новые фото, прайсы в разных форматах. Хаб за магазином Ezeden берёт эту работу на себя: сам читает источники, показывает, что изменится, и не даёт импорту испортить каталог.

Ezeden изнутри: цены, остатки и B2B, которые работают по правилам

Ezeden изнутри: цены, остатки и B2B, которые работают по правилам

Магазин с тысячами товаров от нескольких поставщиков невозможно вести вручную, а одна ошибочная цифра в прайсе поставщика может отправить товар в продажу в убыток. Хаб Ezeden превращает цены, остатки, аксессуары и условия для компаний в правила, которые менеджер задаёт один раз и проверяет до того, как они сработают.