Інтеграція платіжного шлюзу 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 потік через WebView.
Отримання результату: ResultURL проти 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 дні. Вартість розраховується індивідуально.







