Реализация сканирования банковских карт через камеру мобильного приложения
Ручной ввод номера карты из 16 цифр — источник опечаток и брошенных сессий оплаты. Сканирование через камеру решает это за 1–2 секунды. Вопрос только в том, какой инструмент использовать: готовая библиотека OCR для карт или общий ML-фреймворк.
Инструменты и их реальные ограничения
Card.io (PayPal) — исторически популярная библиотека. Проблема: с 2018 года не обновляется, на iOS 16+ периодически вылетает при первом запуске из-за изменений в AVCaptureSession. Не рекомендуем для новых проектов.
Stripe CardScan / Bouncer — Stripe купил Bouncer и открыл card-scan-android / card-scan-ios под Apache 2.0. Это нейросетевое решение на базе TFLite/CoreML, работает офлайн. Точность распознавания номера — выше 95% на картах стандартного формата в нормальных условиях освещения. На iOS подключается через SPM: https://github.com/stripe/stripe-ios, на Android — через Gradle: com.stripe:stripecardscan.
Vision framework (iOS) + ML Kit (Android) — нативные OCR без сторонних зависимостей. VNRecognizeTextRequest (Vision, iOS 13+) распознаёт текст на изображении в реальном времени. Фильтруем результаты по паттерну \b\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}\b. ML Kit Text Recognition v2 на Android работает аналогично через TextRecognizer.
Минус нативного OCR: нужно самостоятельно писать логику определения зоны карты, фильтрации ложных срабатываний (случайные 16-значные числа), стабилизации результата (confirmation через 3–5 последовательных одинаковых результата). Готовая библиотека типа Bouncer делает это из коробки.
Что распознаём
Номер карты — основная цель. Срок действия (MM/YY) — Vision и ML Kit справляются. Имя держателя — OCR справляется хуже из-за вариативности шрифтов и тиснения. Рекомендуем: номер + срок сканируем автоматически, имя — предлагаем заполнить вручную как необязательное поле.
Никогда не распознаём и не сохраняем CVV/CVC — он на обороте, и хранить его даже временно нарушает PCI DSS. Сканирование фронтальной стороны: номер + срок + опционально имя.
Реализация на Flutter
card_scanner pub.dev пакет работает через Platform Channels к нативным SDK. Альтернатива — google_mlkit_text_recognition + собственный парсер. Для production-приложения предпочтительнее Bouncer SDK через FFI-интеграцию — точнее и надёжнее в нестандартных условиях.
Разрешения и приватность
iOS: NSCameraUsageDescription в Info.plist с понятным объяснением — «для сканирования карты при оплате». Android: uses-permission android:name="android.permission.CAMERA" + runtime request через ActivityResultContracts.RequestPermission. Фреймы с камеры обрабатываем только в памяти — не сохраняем на диск, не отправляем на сервер. Privacy-важная деталь для прохождения App Store Review.
Ориентиры по срокам
Интеграция Bouncer/CardScan с базовым UI (превью камеры, рамка карты, анимация сканирования): 1–2 дня. Кастомный UI + нативный Vision/ML Kit с собственной логикой стабилизации: 2–3 дня.







