Пользователи из Беларуси часто отказываются от оплаты картой из-за комиссий или недоверия к вводу реквизитов. ЕРИП (Единое расчётно-информационное пространство) — местная межбанковская система, где платёж происходит без передачи карточных данных. Пользователь видит счёт в приложении, оплачивает через любой банк и возвращается. Но как встроить это в мобильное приложение на 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 дней. Стоимость рассчитывается индивидуально после анализа требований и выбора агрегатора. Закажите интеграцию — получите консультацию и оценку сроков. Свяжитесь с нами.







