Приложения экосистемы¶
Все клиентские приложения и панели OneWallet, их аудитория и способ подключения к платформе.
На какие вопросы отвечает¶
- Какие приложения входят в OneWallet и для кого каждое из них?
- Чем
one_loop_appотличается отone_merchant_app? - Что такое
appIdи зачем он нужен (closeloopvsmerchant)? - Где лежит документация конкретного приложения?
- Что такое мини-аппы и как они запускаются внутри кошелька?
Карта приложений¶
| Приложение | Аудитория | Назначение | Подключение к платформе | Документация |
|---|---|---|---|---|
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):
- Оператор создаёт мини-апп в admin-panel с
actionType: LAUNCH_JWT. - В кошельке пользователь нажимает запуск → Auth Center проверяет таргетинг и подписывает RS256 JWT (срок ~5 минут).
- Flutter открывает
launchUrlв WebView, токен — в URL hash (#token=…). - Мини-апп верифицирует токен через свой бэкенд (
jose.jwtVerify, JWKS из Auth Center). - Внутри WebView доступен мост
window.OneWalletSDK (проверять через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.
Смежные документы¶
- 02-actors-and-accounts.md — роли пользователей и счета
- 04-scenarios.md — пользовательские сценарии
- dev/05-security-and-auth.md — HMAC, JWT, step-up auth