Интеграция платежного шлюза Robokassa в мобильное приложение
Robokassa не предоставляет нативный мобильный SDK — интеграция строится через WebView или через серверный API с кастомным UI на клиенте. Это не минус, а особенность: подход через WebView быстрее в реализации, подход через API даёт полный контроль над UX.
Вариант 1: WebView с платёжной формой Robokassa
Самый быстрый способ. Сервер генерирует URL платёжной формы, клиент открывает его в WebView:
https://auth.robokassa.ru/Merchant/Index.aspx
?MerchantLogin=your_login
&OutSum=1500.00
&InvId=1234
&Description=Заказ №1234
&SignatureValue=md5_signature
&IsTest=0
Подпись SignatureValue = MD5(MerchantLogin:OutSum:InvId:Password1).
// Android: открываем в CustomTabs для лучшего UX
val customTabsIntent = CustomTabsIntent.Builder()
.setShowTitle(false)
.build()
customTabsIntent.launchUrl(context, Uri.parse(paymentUrl))
// iOS: SFSafariViewController
let safariVC = SFSafariViewController(url: URL(string: paymentUrl)!)
present(safariVC, animated: true)
Для отслеживания завершения платежа Robokassa вызывает ResultURL — серверный callback. Настроить его нужно в личном кабинете Robokassa → Настройки → Уведомления.
Вариант 2: API-интеграция с кастомным UI
Robokassa поддерживает прямую передачу карточных данных через API (только для зарегистрированных мерчантов с выполненными требованиями безопасности):
POST https://auth.robokassa.ru/Merchant/Payment/CreateV2
{
"MerchantLogin": "your_login",
"OutSum": "1500.00",
"InvId": "1234",
"Description": "Заказ",
"SignatureValue": "...",
"PaymentMethod": "BankCard",
"CardNumber": "4111111111111111",
"CardExpiryDate": "1225",
"CardCvv": "123"
}
Если банк требует 3DS, API вернёт PaymentUrl для редиректа на ACS-страницу банка. Дальше — стандартный 3DS flow через WebView.
Получение результата: ResultURL vs SuccessURL
Robokassa различает два типа уведомлений:
- ResultURL — серверный POST-запрос с результатом транзакции. Вызывается независимо от действий пользователя. Это основной способ узнать реальный статус платежа.
- SuccessURL — редирект пользователя после успешной оплаты. Ненадёжен: пользователь мог закрыть браузер до редиректа.
В мобильном приложении для перехвата SuccessURL используется deeplink:
// SuccessURL при создании платежа: yourapp://payment/success?InvId={InvId}&OutSum={OutSum}
// В Activity с intent-filter для yourapp://
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
val uri = intent?.data ?: return
if (uri.host == "payment" && uri.path == "/success") {
val invId = uri.getQueryParameter("InvId")
// Проверяем статус на сервере, не доверяем только deeplink
verifyPaymentOnServer(invId)
}
}
Проверка подписи на сервере
Обязательно верифицировать подпись входящего ResultURL:
SignatureValue_входящий == MD5(OutSum:InvId:Password2)
Password2 — второй пароль Robokassa, отличается от первого. Если проверку не делать — любой может имитировать успешный платёж GET-запросом на ResultURL.
Что входит в работу
- Серверная генерация платёжной ссылки с подписью
- Реализация WebView или CustomTabs/SFSafariViewController
- Настройка deeplink для обработки SuccessURL / FailURL
- Серверный обработчик ResultURL с верификацией подписи
- Тестирование в тестовом режиме Robokassa
Сроки
2–3 дня для WebView-интеграции. API с кастомным UI — 3–4 дня. Стоимость рассчитывается индивидуально.







