Інтеграція MoonPay для покупки крипто в мобільному додатку
MoonPay — один із найпоширеніших on-ramp провайдерів. Підтримує 160+ країн, карти Visa/Mastercard/Amex, Apple Pay, Google Pay, банківські переводи. Інтеграція через віджет займає день, але правильно підписаний URL та обробка коллбеків — окрема історія.
Отримання API ключів та підпис URL
На dashboard.moonpay.com — створити акаунт, отримати publishable key (публічний, у додатку) та secret key (тільки на сервері). Без secret key неможливо підписати URL, без підпису MoonPay блокує віджет.
Підпис — HMAC-SHA256 від строки запиту URL:
// Формування підписаного URL — виконується на бекенді, не в додатку
// Серверна сторона (приклад Node.js):
const crypto = require('crypto');
const queryString = new URL(widgetUrl).search; // "?apiKey=...&walletAddress=..."
const signature = crypto
.createHmac('sha256', process.env.MOONPAY_SECRET_KEY)
.update(queryString)
.digest('base64');
const signedUrl = `${widgetUrl}&signature=${encodeURIComponent(signature)}`;
Додаток запитує підписаний URL зі свого бекенду, ніколи не зберігає secret key локально.
Відкриття віджета на iOS та Android
// iOS — SFSafariViewController (рекомендується MoonPay)
import SafariServices
let vc = SFSafariViewController(url: URL(string: signedUrl)!)
vc.preferredBarTintColor = UIColor(named: "AppBackground")
vc.preferredControlTintColor = UIColor(named: "AppTint")
present(vc, animated: true)
// Android — Chrome Custom Tabs
val customTabsIntent = CustomTabsIntent.Builder()
.setToolbarColor(ContextCompat.getColor(context, R.color.app_background))
.setShowTitle(true)
.build()
customTabsIntent.launchUrl(context, Uri.parse(signedUrl))
Не відкривайте віджет у звичайному WebView — MoonPay явно це не рекомендує з міркувань безпеки 3DS.
Параметри кастомізації
Ключові query параметри віджета:
-
walletAddress— адреса для отримання крипти -
currencyCode—eth,btc,sol,usdc_ethereumтощо -
baseCurrencyAmount— передзаповнена сума у фіаті -
baseCurrencyCode—usd,eur,gbp -
colorCode— колір акцентів (URL-encoded hex,%23FF6600) -
language—en,ru,deтощо -
email— передзаповнити email для KYC (якщо відомий) -
redirectURL— URL для повернення в додаток після покупки
Обробка результату через deeplink
Після успішної покупки MoonPay редиректить на redirectURL. Зареєструйте custom URL scheme у додатку:
// Android: AndroidManifest.xml
// <intent-filter>
// <data android:scheme="myapp" android:host="moonpay-success"/>
// </intent-filter>
override fun onNewIntent(intent: Intent) {
val uri = intent.data ?: return
if (uri.host == "moonpay-success") {
val txId = uri.getQueryParameter("transactionId")
// Показати екран успіху, оновити баланс через 30 сек
}
}
Крім того, використовуйте webhook на бекенді для надійного отримання статусу (transaction_completed, transaction_failed). MoonPay відправляє події на webhookUrl з налаштувань dashboard.
Часовий графік: 2–3 дні: серверна підпис URL, інтеграція віджета через SFSafariViewController/CustomTabs, deeplink callback, оновлення баланса після успішної покупки.







