Перейти к содержанию

Приложения экосистемы

Все клиентские приложения и панели OneWallet, их аудитория и способ подключения к платформе.

На какие вопросы отвечает

  • Какие приложения входят в OneWallet и для кого каждое из них?
  • Чем one_loop_app отличается от one_merchant_app?
  • Что такое appId и зачем он нужен (closeloop vs merchant)?
  • Где лежит документация конкретного приложения?
  • Что такое мини-аппы и как они запускаются внутри кошелька?

Карта приложений

Приложение Аудитория Назначение Подключение к платформе Документация
one_loop_app (Flutter, appId=closeloop, v1.4.2) Физлица (consumer) Кошелёк: P2P, QR-оплата, NFC-метки, мини-аппы, лента блога Auth Center (Serverpod RPC) → платежи через POST /intents (PM); статус через pub/sub intent.{id} projects/one_loop_app/CLAUDE.md
one_merchant_app (Flutter, appId=merchant, v1.4.3) Мерчанты, кассиры POS-приложение: приём оплаты по NFC и QR-инвойсу, лента «What's on» Auth Center (RPC) → POST /intents INVOICE_PAYMENT/NFC_CHARGE (PM) projects/one_merchant_app/CLAUDE.md
admin-panel (SvelteKit 2 + Svelte 5 + TS + Tailwind v4) Операторы, комплаенс Управление пользователями, KYC-ревью, мини-аппы, fee-rules, мониторинг HMAC к PM (/admin/*, fee-rules); TigerBeetle read-only; Auth Center API projects/admin-panel/docs/TECHNICAL.md
demo-miniapp (SvelteKit 2 + Svelte 5) Разработчики мини-аппов Шаблон/референс мини-приложения WebView внутри кошелька: LAUNCH_JWT (RS256) + window.OneWallet SDK projects/demo-miniapp/docs/SDK_REFERENCE.md
one_blog (SvelteKit + Drizzle, схема blog.*) Контент-редакторы CMS для контента/афиши; данные читаются приложениями через views в public Пишет в blog.*; кошелёк/мерчант читают v_blog_post/v_blog_category/v_blog_location projects/one_blog/CLAUDE.md

appId (closeloop / merchant) передаётся при логине и каталожных запросах — Auth Center фильтрует мини-аппы и контент блога по таргетингу приложения. Подробнее об идентификации клиентов — adr/0006-clients-and-appid.md.

Как клиенты подключаются к платформе

flowchart LR
  loop[one_loop_app] --> AC[Auth Center]
  merch[one_merchant_app] --> AC
  AC -->|POST /intents HMAC| PM[Payment Manager]
  AC -->|pub/sub intent.id| loop
  admin[admin-panel] -->|HMAC| PM
  admin -.read-only.-> TB[(TigerBeetle)]
  blog[one_blog] -->|blog.*| DB[(PostgreSQL)]
  DB -.views.-> AC

Flutter-клиенты никогда не вызывают Payment Manager напрямую: они идут через Auth Center, который подписывает запрос HMAC и шлёт POST /intents. Финальный статус внешних платежей приходит асинхронно по Redis pub/sub intent.{id} → Auth Center → Flutter.

Детали сервисов — dev/02-services.md; платёжный поток — dev/04-payments-and-ledger.md.

Мини-аппы

Мини-апп — это веб-приложение, открываемое в WebView (InAppWebView) внутри кошелька. Авторизация — без логина внутри мини-аппа: кошелёк получает короткоживущий LAUNCH_JWT от Auth Center и передаёт его в WebView.

Поток (по projects/demo-miniapp/docs/JWT_FLOW.md):

  1. Оператор создаёт мини-апп в admin-panel с actionType: LAUNCH_JWT.
  2. В кошельке пользователь нажимает запуск → Auth Center проверяет таргетинг и подписывает RS256 JWT (срок ~5 минут).
  3. Flutter открывает launchUrl в WebView, токен — в URL hash (#token=…).
  4. Мини-апп верифицирует токен через свой бэкенд (jose.jwtVerify, JWKS из Auth Center).
  5. Внутри WebView доступен мост window.OneWallet SDK (проверять через isSDKAvailable()).

Упрощённый пример JWT payload (только ключевые поля):

{
  "iss": "auth.onewallet",
  "sub": "42",
  "aud": ["miniapp:demo-miniapp"],
  "exp": 1715512300,
  "id": 42
}

Реальная структура содержит больше полей (iat, jti, auth_id, status, вложенный profile с name/phone_masked/kyc_tier и др.). Полную структуру см. в projects/demo-miniapp/docs/JWT_FLOW.md.

Справочник SDK и переменных окружения шаблона — в projects/demo-miniapp/CLAUDE.md и projects/demo-miniapp/docs/SDK_REFERENCE.md.

Смежные документы