Интеграция платежного шлюза Robokassa в мобильное приложение
При интеграции Robokassa в мобильное приложение мы часто сталкиваемся с отсутствием нативного SDK — это норма. Наш опыт показывает, что есть два рабочих подхода: через WebView или через серверный API с кастомным UI на клиенте. Первый быстрее внедрить (2–3 дня), второй даёт полный контроль над UX и конверсией — средняя конверсия в оплату при кастомном UI достигает 97%. Оба варианта мы реализовали в более чем 100 проектах — расскажем о подводных камнях.
Но сначала — о главной боли: неправильная обработка уведомлений. Более 30% наших проектов на старте имели ошибки в ResultURL, что приводило к потерям платежей. Один из клиентов, интернет-магазин с 10 000 заказов в месяц, потерял 3% выручки за квартал из-за того, что SuccessURL обрабатывался без серверной верификации. Мы исправили интеграцию за 2 дня, и конверсия в оплату выросла на 5%. Мы гарантируем, что ваша интеграция будет защищена от таких сценариев — средняя экономия на комиссиях составляет до 3% от оборота. Правильно настроенная интеграция не только предотвращает потери, но и увеличивает конверсию за счёт быстрого редиректа и поддержки Apple Pay/Google Pay через WebView.
Какой способ интеграции выбрать: WebView или API?
WebView: быстро и надёжно
Сервер генерирует URL платёжной формы Robokassa, клиент открывает его в WebView или CustomTabs. Пример ссылки:
https://auth.robokassa.ru/Merchant/Index.aspx?MerchantLogin=your_login&OutSum=1500.00&InvId=1234&Description=Заказ%20№1234&SignatureValue=md5_signature&IsTest=0
Подпись SignatureValue = MD5(MerchantLogin:OutSum:InvId:Password1). После оплаты пользователь переходит на SuccessURL — редирект в приложение через deep link.
// Android: CustomTabs для плавного перехода 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 — его настраивают в личном кабинете → Уведомления. Это единственный надёжный источник правды.
API: полный контроль над UI
Для мерчантов, прошедших сертификацию PCI DSS, 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.
| Критерий | WebView | API с кастомным UI |
|---|---|---|
| Время внедрения | 2–3 дня | 3–4 дня |
| Контроль над UX | Низкий (форма Robokassa) | Полный |
| Безопасность | Встроенная (HTTPS) | Требуется PCI DSS |
| Поддержка 3DS | Автоматически | Через WebView |
| Конверсия в оплату | ~90% | ~97% |
Результат платежа: ResultURL vs SuccessURL
Robokassa различает два типа уведомлений:
- ResultURL — серверный POST-запрос с результатом транзакции. Вызывается всегда, независимо от действий пользователя. Это основной способ узнать реальный статус платежа.
- SuccessURL — редирект пользователя после успешной оплаты. Ненадёжен: пользователь мог закрыть браузер до редиректа.
| Тип уведомления | Направление | Надёжность | Использование |
|---|---|---|---|
| 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) } } Почему верификация подписи критична?
Без проверки подписи злоумышленник может имитировать успешный платёж, отправив GET-запрос на ваш ResultURL. Это приведёт к списанию товара без реальной оплаты. В коммерческой эксплуатации такие атаки — не редкость. Мы гарантируем, что наша реализация закрывает эту уязвимость.
Как проверить подпись Robokassa на сервере?
Обязательно верифицируем подпись входящего ResultURL: SignatureValue_входящий == MD5(OutSum:InvId:Password2)
Password2 — второй пароль Robokassa, отличается от первого. Если проверку не делать — любой может имитировать успешный платёж GET-запросом на ResultURL. Пошаговый процесс:
- Получить параметры из POST-запроса: OutSum, InvId, SignatureValue.
- Вычислить MD5-хеш от строки
OutSum:InvId:Password2. - Сравнить с полученным SignatureValue. При несовпадении вернуть 403.
Детальный пример проверки на PHP
$outSum = $_POST['OutSum']; $invId = $_POST['InvId']; $signatureValue = $_POST['SignatureValue']; $password2 = 'your_password2'; $expected = md5($outSum.':'.$invId.':'.$password2); if (strcasecmp($signatureValue, $expected) !== 0) { header('HTTP/1.0 403 Forbidden'); exit; } Типичные ошибки и как их избежать
| Ошибка | Последствия | Решение |
|---|---|---|
| Использование только SuccessURL | Потеря платежей при закрытии браузера | Всегда используйте ResultURL |
| Пропуск верификации подписи | Подделка платежей злоумышленниками | Обязательно проверяйте SignatureValue |
| Неверный формат подписи | Отклонение транзакций | Используйте MD5 с правильным порядком параметров |
Что входит в работу
- Серверная генерация платёжной ссылки с подписью
- Реализация WebView или CustomTabs/SFSafariViewController
- Настройка deeplink для обработки SuccessURL / FailURL
- Серверный обработчик ResultURL с верификацией подписи
- Тестирование в тестовом режиме Robokassa (среднее время теста — 2 дня)
- Консультация по настройке личного кабинета
Наша команда имеет 7 лет опыта интеграции платёжных шлюзов и более 100 успешных проектов с Robokassa, обработано свыше 50 000 транзакций. Свяжитесь с нами для бесплатной консультации по выбору подхода — мы поможем избежать типичных ошибок. Закажите интеграцию Robokassa в ваше мобильное приложение и получите надёжный платёжный шлюз за 2–4 дня. Получите стабильную обработку платежей с первого дня — обратитесь к нам.







