Реалізація покупки крипто за фіат (On-Ramp) в мобільному додатку
On-ramp — точка входу фіатних грошей в крипто-екосистему. Користувач платить картою або банківським переводом, отримує криптовалюту на гаманець. Мобільний додаток не обробляє платіж безпосередньо — це завдання ліцензованого провайдера. Завдання розробника — правильно інтегрувати віджет або API.
Два підходи: віджет vs API
Підхід із віджетом — провайдер надає WebView або нативний SDK. Мінімальна інтеграція: передати адресу гаманця, валюту, опціонально суму. Провайдер сам обробляє KYC та платіж.
Підхід із API — повний контроль над UI, але вимагає партнерської угоди та перевірки відповідності з боку провайдера. Доступно не всім.
Для більшості гаманців достатньо віджета з 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: "uk")
]
// Підписати 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-callback. Агрегатор кількох провайдерів з UI вибору — 8–10 днів.







