Реализация покупки криптовалюты за фиат (On-Ramp) в мобильном приложении
On-ramp — точка входа фиатных денег в криптоэкосистему. Пользователь платит картой или банковским переводом, получает криптовалюту на кошелёк. Мобильное приложение не обрабатывает платёж напрямую — это задача лицензированного провайдера. Задача разработчика — корректно встроить виджет или API.
Два подхода: виджет vs API
Виджет-подход — провайдер предоставляет WebView или нативный SDK. Минимальная интеграция: передать адрес кошелька, валюту, опционально сумму. Провайдер сам обрабатывает KYC и платёж.
API-подход — полный контроль над UI, но требует партнёрского соглашения и прохождения compliance-ревью со стороны провайдера. Не всем доступно.
Для большинства кошельков — виджет с deeplink или WebView. MoonPay, Transak, Mercuryo предоставляют оба варианта.
Выбор провайдера: ключевые параметры
| Провайдер | Комиссия | Методы оплаты | KYC порог | Охват |
|---|---|---|---|---|
| MoonPay | 1–4.5% | Карта, банк, Apple Pay | $150/мес без KYC | 160+ стран |
| Transak | 0.5–1% | Карта, банк | Зависит от страны | 130+ стран |
| Mercuryo | 1.5–3.9% | Карта | $100/мес без KYC | 100+ стран |
| Ramp Network | 0.49–2.9% | Карта, банк | $250 без KYC | 150+ стран |
Охват и доступные методы оплаты в конкретной стране проверять через API провайдера, а не по документации — данные меняются.
Интеграция через WebView
Базовый флоу: сформировать URL с параметрами, открыть в SFSafariViewController (iOS) или CustomTabsIntent (Android). Не используй WKWebView / WebView для платёжных форм — они не дают полного доступа к cookie и могут конфликтовать с 3DS.
// iOS — открытие MoonPay через SFSafariViewController
import SafariServices
let baseURL = "https://buy.moonpay.com"
var components = URLComponents(string: baseURL)!
components.queryItems = [
.init(name: "apiKey", value: moonPayPublicKey),
.init(name: "walletAddress", value: userWalletAddress),
.init(name: "currencyCode", value: "eth"),
.init(name: "colorCode", value: "%23FF6600"),
.init(name: "language", value: "ru")
]
// Подписать URL на бэкенде через HMAC-SHA256
let safariVC = SFSafariViewController(url: signedURL)
present(safariVC, animated: true)
URL должен быть подписан HMAC-SHA256 на вашем бэкенде с секретным ключом MoonPay — это обязательное требование безопасности, не опциональное.
Deeplink callback и отслеживание статуса
MoonPay поддерживает redirectURL — когда покупка завершена, провайдер редиректит на указанный URL. В мобильном приложении это кастомная URL-схема или Universal Link.
// Android — обработка deeplink по завершению on-ramp
// AndroidManifest.xml: intent-filter с data scheme="myapp" host="onramp-callback"
override fun onNewIntent(intent: Intent) {
val uri = intent.data ?: return
if (uri.host == "onramp-callback") {
val transactionId = uri.getQueryParameter("transactionId")
val status = uri.getQueryParameter("status") // completed, failed, pending
handleOnRampResult(transactionId, status)
}
}
Webhook на бэкенде — более надёжный способ получить финальный статус. Callback в deeplink может не сработать, если пользователь закрыл приложение во время покупки.
Агрегатор on-ramp провайдеров
Если хочется предложить лучший курс из нескольких провайдеров — использовать агрегатор: Onramper (onramper.com/api), Transak One или встроенный виджет Li.Fi. Пользователь видит сравнение курсов и выбирает провайдера. Это повышает конверсию.
Сроки: 5 дней на интеграцию одного провайдера через виджет с deeplink-коллбэком. Агрегатор нескольких провайдеров с UI выбора — 8–10 дней.







