Реалізація NFC-оплати (HCE) через Android-приложення
Host-based Card Emulation — технологія, яка дозволяє Android-приложенню прикидатися бесконтактною карткою без фізичного SE (Secure Element). Звучить просто. На справі — це реалізація ISO/IEC 7816-4 поверх NFC з APDU-командами, керування життєвим циклом сервісу, реєстрація AID та прходження сертифікації платіжної системи. Більшість команд типу SELECT AID та GET PROCESSING OPTIONS потрібно реалізовувати вручну.
Головна сложність: APDU-діалог з терміналом
Коли терміналом POS «бачить» телефон, він відправляє серію APDU-команд. Стандартний сценарій EMV Contactless починається з:
00 A4 04 00 07 A0 00 00 00 03 10 10 — SELECT PPSE
Приложення повинне відповісти коректним FCI з ім'ям AID. Далі терміналом вибирає конкретне приложення (SELECT AID), запитує параметри трансакції через GET PROCESSING OPTIONS, читає записи через READ RECORD. Кожний відповідь — суворо по EMV Book 3 та Book C-2.
Помилка в одному байті TLV-структури — терміналом видає «Картка не прийнята» без яких-будь подробиць у логах приложення. Відлаговуватиі потрібно через NFC-снифер (наприклад, ACR122U + libnfc + Wireshark) або апаратний аналізатор протоколу.
Реєстрація AID та конфлікти
Кожне HCE-приложення реєструє AID в AndroidManifest.xml через <host-apdu-service>. Якщо на пристрої кілька приложень з одним AID — Android показує disambiguation dialog. Для проприетарних AID це керовано. Для стандартних (Visa: A0000000031010, Mastercard: A0000000041010) виникає конфлік з банківськими приложеннями — користувачу доведеться вибирати кожного разу.
Рішення — реєструвати власний проприетарний AID у діапазоні F0xx..., узгоджувати його з процесором та налаштовувати терміналіну сторону на приймання. Або використовувати HCE_PAYMENT категорію з попередньоустановленим AID та коректно обробляти конфлікти через CardEmulation.setPreferredService().
Архітектура HCE-сервісу
HostApduService — це Service, який Android запускає при появленні NFC-поля. Головний метод — processCommandApdu(), який викликається в основному потоці. Блокувати його неможна: якщо відповідь не прийде за ~500 мс, терміналом розриває з'єднання.
Типова структура:
class PaymentHceService : HostApduService() {
private val apduProcessor = ApduProcessor()
override fun processCommandApdu(commandApdu: ByteArray, extras: Bundle?): ByteArray {
return apduProcessor.process(commandApdu)
}
override fun onDeactivated(reason: Int) {
apduProcessor.reset()
// reason: DEACTIVATION_LINK_LOSS або DEACTIVATION_DESELECTED
}
}
ApduProcessor — кінцевий автомат, який тримає стан поточної трансакції: виділений ли PPSE, виділений ли AID, у якому стані GPO. Стан скидається в onDeactivated. Це критично: якщо не скинути після DEACTIVATION_LINK_LOSS, наступна трансакція почнеться з неправильного стану.
Безпека токенів
Реальні PAN-дані зберігати в приложенні неможна. Сучасна схема — динамічні токени: сервер видає single-use cryptogram для кожної трансакції. Приложення запитує токен заздалегідь (при відкритті платіжного екрана), зберігає в зашифрованому виді в EncryptedSharedPreferences або Android Keystore, передає терміналу у відповіді на READ RECORD.
Термін життя токена — зазвичай 30–60 хвилин або одна трансакція. При isterphannya — приложення запитує новий до початку наступної трансакції, а не у момент processCommandApdu (там немає часу на мережевий запит).
Тестування без реального POS-терміналу
Для розробки та CI використовуємо:
- ACR122U + PC/SC — USB NFC-рідер, емулює терміналом на ПК, можна скриптувати APDU-послідовності
- Mastercard PayPass Test Tool — офіційний інструмент для валідації EMV-відповідей
- EMV-Co contactless test cases — набір сценаріїв для сертифікації
Без прохождення тест-кейсів EMV-Co отримати допуск до реальних терміналів Visa/Mastercard не отримаємо. Це окремий етап проекту.
Процес та терміни
Робота розбивається на кілька фаз: проектування APDU-діалогу під конкретний процесор → реалізація HCE-сервісу → інтеграція з бекендом токенізації → тестування на реальних терміналах → підготовка документації для сертифікації.
Мінімальний PoC з кастомним AID — 2–3 тижні. Повнофункціональна інтеграція з EMV-сертифікацією — від 2 місяців. Точні терміни після вивчення вимог процесора та схеми токенізації.







