Интеграция рассрочки Карта покупок в мобильное приложение
«Карта покупок» — белорусский продукт рассрочки, который подключают магазины для увеличения среднего чека. В отличие от российской Халвы, здесь нет отдельного мобильного приложения у эмитента — флоу полностью через WebView-форму и серверное API.
Как устроен флоу
Пользователь выбирает «Оплатить в рассрочку» → ваш сервер создаёт заявку через API Карты покупок, получает URL платёжной формы → мобильное приложение открывает URL в SFSafariViewController (iOS) / Custom Tabs (Android) → пользователь вводит данные карты покупок и подтверждает → редирект на successUrl/failUrl → webhook на ваш сервер о финальном статусе.
Нюанс: форма Карты покупок использует OTP-подтверждение через SMS. В SFSafariViewController SMS AutoFill (iOS 12+) работает штатно — Safari предлагает вставить код из сообщения. В обычном WKWebView это тоже работает при правильно выставленном contentType = .oneTimeCode в форме. Убеждаемся, что не блокируем JavaScript в WebView.
Расчёт и отображение условий
API предоставляет эндпоинт расчёта рассрочки: передаём сумму, получаем доступные периоды (3, 6, 12 месяцев) и ежемесячный платёж. Отображаем до открытия формы — пользователь должен видеть условия до того, как нажал кнопку.
Пример ответа: {"periods": [{"months": 6, "monthly": 83.33}, {"months": 12, "monthly": 41.67}]}. Показываем как горизонтальный список с чипами выбора периода — стандартный UX для BNPL-продуктов.
Обработка статусов
Карта покупок возвращает три финальных статуса: approved, rejected, cancelled. rejected — банк отказал в рассрочке — показываем сообщение с предложением оплатить картой. Не пишем «ошибка» — пишем «Банк не одобрил рассрочку. Вы можете оплатить картой». Разница в конверсии ощутимая.
Callback через returnUrl обрабатываем в AppDelegate/Application по URL scheme. Параллельно — webhook на сервер. Статус берём из webhook, не из query-параметров returnUrl (их можно подделать).
Типичные ошибки при реализации
Обычный WKWebView вместо SFSafariViewController. В WKWebView нет доступа к системным cookies Safari. Если Карта покупок использует cookie-based сессию на своей форме, пользователь каждый раз будет проходить авторизацию заново. SFSafariViewController решает это — он разделяет cookie-хранилище с Safari.
Не обрабатываем таймаут заявки. Заявка на рассрочку активна ограниченное время (обычно 15–30 минут). Если пользователь ушёл с экрана формы и вернулся через час — показываем «Время сессии истекло, попробуйте снова» вместо зависшего спиннера.
Нет retry при временной недоступности API. Создание заявки — критичный запрос. При 503/504 от сервера Карты покупок — Exponential Backoff с тремя попытками перед показом ошибки пользователю.
Процесс
Подключение партнёрского договора → тестовые credentials → серверный модуль (создание заявки, webhook) → мобильная часть (WebView флоу, deeplink-обработка) → тестирование с тестовыми данными карты → production.
Ориентиры по срокам
2–3 дня с момента получения API-ключей. Организационная часть (партнёрский договор) — вне оценки разработки.







