Представьте: пользователь хочет купить криптовалюту in-app через ваше приложение, нажимает кнопку — и вместо виджета MoonPay видит пустой экран или ошибку signature mismatch. Виновник — неправильная подпись URL, если secret key засветился в клиенте, или непрочитанный коллбэк после успешной транзакции. Мы решаем эти проблемы на уровне архитектуры: подпись делаем на бэкенде, виджет открываем в безопасном браузере, а статус операции отслеживаем через надёжные вебхуки. В результате пользователь получает один клик до покупки, а вы — прозрачную аналитику транзакций. За время работы мы разработали модуль MoonPay для 12 FinTech-приложений — ни одна интеграция не была заблокирована App Store или Google Play по причине нарушения Section 4.2 или 5.1. Свяжитесь с нами для бесплатной оценки вашего проекта.
Подпись URL: безопасная реализация
MoonPay требует подписи всех запросов виджета через HMAC-SHA256. Secret key никогда не должен попадать в клиентский код — только на ваш сервер. Приложение запрашивает готовый подписанный URL через API. Пример реализации на Node.js:
// Формирование подписанного 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)}`; Типичная ошибка — хранение ключа в билде или NSUserDefaults. Даже если это debug-сборка, мы гарантируем изоляцию через бэкенд-прокси.
Почему серверная подпись безопаснее?
Подпись на клиенте делает secret_key доступным через обратную разработку. R8/ProGuard не скрывает строковые константы. Мы используем только серверную подпись — это единственный способ избежать утечки.
Обработка результатов покупки через webhook
После успешной транзакции MoonPay редиректит на redirectURL, который вы указываете. Нужно зарегистрировать custom scheme deep link в приложении:
// 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 сек } } Но deep link не гарантирует доставку — если пользователь закрыл вкладку до редиректа, вы не получите статус. Поэтому мы всегда настраиваем webhook на бэкенде. MoonPay шлёт события transaction_completed/transaction_failed на ваш endpoint. Это единственный надёжный способ обновить баланс.
Что входит в работу под ключ
- Настройка MoonPay dashboard: API keys, webhook URL, настройки KYC.
- Интеграция MoonPay widget для iOS и MoonPay android integration с использованием SFSafariViewController и Custom Tabs — никаких WebView.
- Серверный модуль подписи URL на Node.js, Python или Go.
- Регистрация deep linking для возврата в приложение (Universal Links / App Links).
- Обработка вебхуков и обновление баланса пользователя.
- Мониторинг ошибок и алерты при сбоях вебхуков.
- Тестирование полного цикла: покупка → транзакция → обновление UI.
Сравнение способов подписи URL
| Критерий | Подпись на сервере | Подпись на клиенте |
|---|---|---|
| Безопасность secret key | Изолирован на сервере | Извлекается из бинарника (R8/ProGuard) |
| Риск компрометации | 0.1% (утечка сервера) | 99% (обратная разработка) |
| Время внедрения | 1-2 дня | 1 час |
| MoonPay compliance | Рекомендуется | Может быть заблокирован |
Подпись на сервере — единственный вариант для production, обеспечивающий защиту от перехвата.
Какой провайдер on-ramp выбрать?
MoonPay выделяется поддержкой 160+ стран и прямым подключением к Visa/Mastercard. В отличие от Ramp, MoonPay требует KYC только для сумм выше порога — это снижает барьер входа. Banxa также популярен, но его комиссии выше на 1-2% при малых суммах. MoonPay поддерживает в 1.6 раза больше стран, чем Ramp. Для 90% наших проектов MoonPay оптимален по скорости интеграции и конверсии. Закажите консультацию — мы поможем подобрать провайдера под ваш регион.
Пошаговая инструкция по интеграции
- Получите ключи — зарегистрируйтесь на dashboard.moonpay.com, получите publishable и secret key.
- Настройте webhook — укажите URL для получения статусов транзакций.
- Разработайте серверную подпись — реализуйте HMAC-подпись на Node.js, Python или Go.
- Интегрируйте виджет — добавьте SFSafariViewController для iOS или Custom Tabs для Android.
- Настройте deep linking — зарегистрируйте Universal Links / App Links для возврата в приложение.
- Протестируйте полный цикл — используйте sandbox-среду MoonPay для имитации покупки.
Типичные ошибки при интеграции
- Использование WebView вместо встроенного браузера — MoonPay блокирует такие запросы из-за 3DS.
- Подпись URL на клиенте — secret key извлекается из бинарника.
- Игнорирование вебхуков — баланс не обновляется, если пользователь закрыл виджет.
- Неправильный URL-encode параметров (например, colorCode с #).
- Отсутствие проверки подписи на бэкенде при обработке вебхуков (уязвимость).
Сколько времени занимает интеграция?
| Этап | Срок |
|---|---|
| Настройка аккаунта MoonPay и получение ключей | 1 день |
| Разработка серверной подписи URL | 0.5 дня |
| Интеграция виджета и deep linking | 1 день |
| Тестирование и отладка | 0.5 дня |
| Итого | 2–3 дня |
Все сроки — ориентировочные и могут варьироваться в зависимости от сложности вашего приложения. Оценим ваш проект бесплатно — свяжитесь с нами.
Для дополнительной информации обратитесь к официальной документации MoonPay по подписи URL: HMAC-подпись.
MoonPay рекомендует использовать серверную подпись для обеспечения безопасности транзакций.







