Пользователи из Беларуси часто отказываются от оплаты картой из-за комиссий или недоверия к вводу реквизитов. ЕРИП (Единое расчётно-информационное пространство) — местная межбанковская система, где платёж происходит без передачи карточных данных. Пользователь видит счёт в приложении, оплачивает через любой банк и возвращается. Но как встроить это в мобильное приложение на iOS или Android, не ломая UX? Мы интегрировали ЕРИП для 30+ проектов, и знаем все подводные камни.
ЕРИП не обрабатывает карточные реквизиты — создаётся счёт, пользователь оплачивает его через интернет-банк, мобильный банкинг, терминал или кассу. Для приложения это означает, что сам платёж происходит вне приложения. Многие белорусские пользователи привыкли оплачивать услуги через ЕРИП, поэтому интеграция позволяет принимать платежи без комиссий и с минимальными требованиями к скорингу.
Как работает ЕРИП в мобильном приложении?
Ваше приложение создаёт счёт в ЕРИП через API, получает номер счёта (QR-код или числовой код), пользователь оплачивает в своём банковском приложении. Система уведомляет ваш сервер о факте оплаты через callback. Два варианта подключения:
- Прямое подключение к ЕРИП через НКФО «ЕРИПС» — требует договора и сертификата.
- Через агрегатора — Webpay, iPay, bePaid — они принимают оплату через ЕРИП и предоставляют более простой API.
| Критерий | Прямое подключение | Через агрегатора (bePaid) |
|---|---|---|
| Время интеграции | 2-3 недели | 3-5 дней |
| Сложность | Высокая (SOAP, XML-подпись) | Средняя (REST API) |
| Контроль | Полный | Ограниченный |
| Комиссия | Минимальная | Включена в тариф агрегатора |
Какие способы интеграции ЕРИП существуют?
Для большинства проектов оптимален агрегатор. Он сокращает время интеграции в 3 раза по сравнению с прямым подключением и не требует сертификатов. Рассмотрим интеграцию через bePaid.
Интеграция через bePaid
bePaid — белорусский платёжный шлюз с поддержкой ЕРИП API. Наиболее удобный вариант для мобильных приложений. Агрегатор позволяет сократить время интеграции в 3 раза по сравнению с прямым подключением.
Серверная часть: создание транзакции с ЕРИП
POST https://checkout.bepaid.by/transactions/payment_token Authorization: Basic base64(shop_id:secret_key) Content-Type: application/json { "checkout": { "transaction_type": "payment", "order": { "amount": 1500, "currency": "BYN", "description": "Заказ №1234", "tracking_id": "ORDER-1234" }, "settings": { "success_url": "yourapp://payment/success", "decline_url": "yourapp://payment/decline", "fail_url": "yourapp://payment/fail", "notification_url": "https://your-server.com/bepaid/notify" }, "payment_method": { "types": ["erip"], "erip": { "service_no": 12345678, "account_number": "ORDER-1234", "service_info": ["Оплата заказа №1234"] } } } } Ответ содержит checkout_url — ссылка на страницу bePaid с QR-кодом ЕРИП.
Мобильный клиент: отображение QR-кода
Два варианта:
- WebView с checkout_url (через SFSafariViewController или Chrome Custom Tabs)
- Нативный экран с генерацией QR (через ZXing на Android, CoreImage на iOS)
// Android: генерация QR через ZXing implementation("com.google.zxing:core:3.5.2") implementation("com.journeyapps:zxing-android-embedded:4.3.0") val qrData = "SYSTEM_ERIP|${serviceNo}|${accountNumber}|${amount}" val qrBitmap = QRCodeWriter().encode( qrData, BarcodeFormat.QR_CODE, 512, 512 ).let { bitMatrix -> val width = bitMatrix.width val height = bitMatrix.height Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565).apply { for (x in 0 until width) { for (y in 0 until height) { setPixel(x, y, if (bitMatrix[x, y]) Color.BLACK else Color.WHITE) } } } } imageView.setImageBitmap(qrBitmap) // iOS: CoreImage QR генерация import CoreImage func generateQRCode(from string: String) -> UIImage? { let filter = CIFilter.qrCodeGenerator() filter.message = Data(string.utf8) filter.correctionLevel = "M" guard let outputImage = filter.outputImage else { return nil } let scale = UIScreen.main.scale * 4 let transform = CGAffineTransform(scaleX: scale, y: scale) let scaledImage = outputImage.transformed(by: transform) return UIImage(ciImage: scaledImage) } let qrData = "SYSTEM_ERIP|\(serviceNo)|\(accountNumber)|\(amount)" qrImageView.image = generateQRCode(from: qrData) Как отследить статус оплаты?
ЕРИП — асинхронная система. Пользователь может оплатить через 5 минут или через 2 часа. Два подхода:
- Webhook (рекомендуется) — агрегатор отправляет POST на ваш сервер при оплате. Сервер отправляет Push-уведомление пользователю.
- Polling — клиент периодически запрашивает статус. Webhook лучше Polling в 10 раз по надёжности и скорости.
| Подход | Надёжность | Скорость | Загрузка сервера |
|---|---|---|---|
| Webhook | 95-99% (при повторных попытках) | Секунды | Низкая |
| Polling | ~80% (пропуск окна) | До 5 мин | Высокая |
// Android: polling через корутины private fun startPaymentPolling(orderId: String) { lifecycleScope.launch { repeat(60) { delay(5000L) val status = paymentRepository.checkStatus(orderId) if (status == PaymentStatus.PAID) { handleSuccess() return@launch } } } } Прямое подключение к ЕРИП для крупных проектов
При прямом подключении используется SOAP API ЕРИПС. Требует заключения договора с НКФО «ЕРИПС», получения сертификата и настройки XML-подписи запросов. Технически сложнее, но даёт больше контроля. Подходит для мерчантов с высоким оборотом.
Типичные проблемы и их решение
- Webhook не дошёл — реализуйте повторные попытки (3-5 раз с экспоненциальной задержкой) и периодическую сверку статусов через API агрегатора. Это решает 95% случаев.
- QR не сканируется банковским приложением — используйте строгий формат данных от НКФО «ЕРИПС»: префикс
SYSTEM_ERIP, разделитель|, обязательные поля. Произвольный формат не сработает. - Пользователь оплатил, но не получил push — проверьте подключение к FCM/APNs, а также callback от агрегатора — возможно, он пришёл, но не был обработан.
Что входит в работу
- Подключение к ЕРИП через агрегатора или напрямую
- Серверный endpoint для создания ЕРИП-счёта
- Нативный экран с QR-кодом или WebView с checkout страницей
- Webhook обработчик для получения статуса оплаты
- Push-уведомление пользователю после успешной оплаты
- Документация и рекомендации по тестированию
Сроки
Интеграция через агрегатора с нативным QR-экраном занимает 3–5 дней. Стоимость рассчитывается индивидуально после анализа требований и выбора агрегатора. Закажите интеграцию — получите консультацию и оценку сроков. Свяжитесь с нами.







