Реализация продажи криптовалюты за фиат (Off-Ramp) в мобильном приложении
Мы сталкивались с этим десятки раз: клиент хочет вывести криптовалюту на карту, но провайдер требует отправить крипту первой, а деньги придут через пару банковских дней. Доверие — главный барьер, который решается интерфейсом и прозрачностью. В этой статье разберём, как мы интегрировали off-ramp от Transak и MoonPay — под ключ, включая KYC, SEPA и push-уведомления. Оценим проект — сроки от 5 до 12 дней в зависимости от сложности. Наш опыт — 5+ лет в мобильной разработке фиатных шлюзов, 30+ интеграций с платёжными провайдерами. За 5 лет работы мы запустили 15+ проектов с off-ramp для fintech-компаний.
Особенность off-ramp: крипта уходит первой
В отличие от on-ramp, где пользователь сначала видит, сколько крипты получит, в off-ramp нужно сначала отправить крипту на депозитный адрес провайдера. Это создаёт дополнительный барьер доверия. Интерфейс должен максимально снижать тревогу.
Порядок действий:
- Пользователь указывает сумму крипты и реквизиты банковского счёта.
- Провайдер выдаёт депозитный адрес и подтверждает курс (с временем жизни котировки, обычно 15–30 минут).
- Приложение отправляет крипту на депозитный адрес — обычно через встроенный экран отправки кошелька.
- Провайдер получает подтверждение, начинает фиатный перевод.
KYC и верификация банковского счёта
AML-требования к off-ramp строже. MoonPay и Transak требуют верификацию банковского счёта через микротранзакции (2 небольших списания для подтверждения) или через Open Banking (Plaid, TrueLayer).
Приложение должно явно информировать пользователя о сроках KYC — верификация может занять 1–3 рабочих дня при первом off-ramp. Повторные операции — мгновенно после одобрения.
// iOS — запуск Transak off-ramp виджета var components = URLComponents(string: "https://global.transak.com")! components.queryItems = [ .init(name: "apiKey", value: transakApiKey), .init(name: "walletAddress", value: userWalletAddress), .init(name: "defaultCryptoCurrency", value: "ETH"), .init(name: "productsAvailed", value: "SELL"), // только off-ramp .init(name: "redirectURL", value: "myapp://offramp-callback"), .init(name: "themeColor", value: "000000") ] let safariVC = SFSafariViewController(url: components.url!) present(safariVC, animated: true) Поддержка SEPA и wire transfer
Для европейских пользователей — SEPA Instant (зачисление за 10 секунд) и SEPA Credit Transfer (1–2 рабочих дня). Для международных — Wire (SWIFT, 2–5 дней). Провайдеры сами определяют доступные методы по стране пользователя.
Transak поддерживает SEPA для 30+ европейских стран. MoonPay — SEPA, банковский перевод для UK (Faster Payments).
Сравнение провайдеров off-ramp
| Характеристика | Transak | MoonPay |
|---|---|---|
| Поддержка SEPA Instant | Да (30+ стран) | Да (еврозона) |
| Верификация банк. счёта | Микротранзакции | Open Banking / микротранзакции |
| Время вывода (SEPA) | 1–2 дня | 1–2 дня |
| Комиссия для пользователя | 0.5–2% | 0.5–2% |
| Мобильный SDK | URL‑виджет | URL‑виджет + нативный SDK |
Почему off-ramp требует triple-check транзакций?
Из-за необратимости криптовалютных переводов каждая операция проверяется трижды: локально в приложении, на стороне провайдера и в блокчейне. Мы добавляем экран подтверждения с деталями (адрес, сумма, курс) и таймером. Если пользователь не подтверждает за минуту — котировка сгорает, курс пересчитывается. Это снижает риск ошибок и повышает доверие.
Как ускорить вывод через SEPA Instant?
SEPA Instant доступен не для всех стран и банков. Чтобы его использовать, провайдер должен поддерживать эту систему и иметь партнёрский банк в целевой зоне. Transak покрывает 30+ стран через партнёрство с британским банком. Мы рекомендуем использовать SEPA Instant как основной метод для Европы — скорость 10 секунд против 1–2 дней у обычного SEPA. В интерфейсе стоит подсвечивать этот вариант как рекомендуемый.
Статус и нотификации
Off-ramp транзакция проходит несколько статусов: crypto_received → processing → fiat_sent → completed. Каждый переход — push-уведомление. Пользователь не должен угадывать, на каком этапе его деньги.
// Android — webhook обработчик статусов (серверная часть, прокидывается в push) when (webhookEvent.status) { "AWAITING_PAYMENT_FROM_USER" -> sendPush("Ожидаем отправку $amount $currency") "PAYMENT_DONE_MARKED_BY_USER" -> sendPush("Крипта получена, идёт проверка") "ON_HOLD_PENDING_DELIVERY_FROM_TRANSAK" -> sendPush("Перевод инициирован") "COMPLETED" -> sendPush("$fiatAmount ${fiatCurrency} отправлены на счёт") "FAILED" -> sendPush("Операция отклонена: $reason") } Что входит в работу (deliverables)
- Интеграция одного провайдера off-ramp (Transak или MoonPay) — 5 дней.
- Мультипровайдерная конфигурация с переключением — 8–12 дней.
- Включает: UI‑экран ввода суммы, обработка редиректов через deeplink, получение статусов через webhook, настройка push‑уведомлений.
- Документация по flow и описание архитектуры.
- Поддержка при релизе в App Store / Google Play.
Сроки: 5 дней для одного провайдера, 8–12 для мультипровайдера. Свяжитесь с нами, чтобы оценить ваш проект — получите консультацию по выбору провайдера и архитектуре. Гарантируем прозрачность и соответствие SEPA и App Store Review Guidelines (раздел 5.1).







