Клієнт — компанія зі 100+ співробітників, дві прохідні, три рівні доступу. Паперові перепустки губилися, підроблялися, аудит показав, що 30% співробітників мали доступ до серверних зон. Основна складність — інтеграція з існуючою системою управління доступом (ACS) і генерація об'єктів перепустки з урахуванням вимог безпеки. Ми вирішили її за 2 дні: налаштували зв'язку Active Directory → Google Wallet через JWT та REST API. Впровадили QR-код на телефоні, автоматичне сповіщення про закінчення, централізоване управління через API. Після пілоту клієнт скоротив витрати на друк перепусток на 80% і підвищив безпеку. Зараз перепустки оновлюються за секунди — достатньо змінити статус в AD. Перепустка працює офлайн — після збереження дані доступні без інтернету. Зв'яжіться з нами, щоб оцінити ваш проєкт — ми дамо попередню оцінку за день.
Які проблеми вирішуємо
Управління термінами дії перепусток
У Google Wallet кожна перепустка має validTimeInterval. Ми задаємо дати початку та закінчення, а Wallet сам сповіщає користувача за 3 дні до закінчення. Жодної серверної логіки — все в об'єкті.
Передача перепусток між пристроями
Обмеження ONE_USER_ONE_DEVICE забороняє копіювання перепустки на інші пристрої. Користувач не може передати перепустку колезі — безпека на висоті.
Інтеграція з системами управління доступом
Ми підключаємо Google Wallet до Active Directory або 1С. При зміні рівня доступу автоматично оновлюється header перепустки через PATCH-запит. Час реакції — хвилини.
Перепустка без інтернету
Після збереження перепустка повністю доступна офлайн: зображення, текст, штрих-код. Згідно з офіційною документацією Google Wallet API, локальне кешування гарантує роботу в автономному режимі. Сповіщення про закінчення вимагають з'єднання, але сама перепустка відкривається без мережі.
Як ми це робимо
Стек
- Google Wallet API (GenericObject, GenericClass)
- JWT-токени для передачі даних у Wallet
- Сервісний обліковий запис з правами issuer
- Android: Wallet SDK, Kotlin + Coroutines
- Сервер: Python (Flask/FastAPI) або Kotlin/Java
Ключові параметри GenericObject
| Поле | Опис | Приклад |
|---|---|---|
classId |
Посилання на клас перепустки | issuerId.classSuffix |
id |
Унікальний ідентифікатор об'єкта | issuerId.objectSuffix |
validTimeInterval |
Період дії | {"start":"2025-01-01T00:00Z","end":"2025-12-31T23:59Z"} |
barcode |
Штрих-код для сканування | {"type":"QR_CODE","value":"user123"} |
state |
Статус перепустки | ACTIVE / EXPIRED |
notifications |
Налаштування сповіщень | {"expiryNotification":{"enableNotification":true}} |
Створення класу
Клас потрібно створити один раз через REST API. JWT створює тільки об'єкт, не клас. Приклад:
def create_generic_class(class_suffix: str) -> dict: issuer_id = "YOUR_ISSUER_ID" return { "id": f"{issuer_id}.{class_suffix}", "issuerName": "Your Company", "reviewStatus": "UNDER_REVIEW", "enableSmartTap": False, "multipleDevicesAndHoldersAllowedStatus": "ONE_USER_ONE_DEVICE" } Генерація JWT
JWT містить payload з об'єктом перепустки. Ми підписуємо його сервісним обліковим записом. Android-додаток викликає Wallet API з цим токеном.
Додавання перепустки на пристрій
class PassActivity : AppCompatActivity() { private val walletClient by lazy { Wallet.getWalletClient(this, WalletOptions.Builder() .setEnvironment(WalletConstants.ENVIRONMENT_PRODUCTION) .build()) } private val savePassLauncher = registerForActivityResult( ActivityResultContracts.StartIntentSenderForResult() ) { result -> when (result.resultCode) { RESULT_OK -> { analytics.track("wallet_pass_added") binding.addToWalletBtn.text = "Уже в Wallet" binding.addToWalletBtn.isEnabled = false } RESULT_CANCELED -> Unit } } fun onAddToWalletClicked() { viewModel.generatePassJwt().observe(this) { jwt -> walletClient.savePassesViaIntent( SavePassesRequest.newBuilder().setJwt(jwt).build() ) { result -> result.intentSender?.let { savePassLauncher.launch(IntentSenderRequest.Builder(it).build()) } ?: run { binding.addToWalletBtn.isEnabled = false } } } } } Процес роботи
- Аналіз вимог: які дані відображати, який рівень доступу, чи потрібен QR-код.
- Проектування: створення класу та шаблону об'єкта.
- Реалізація: серверна генерація JWT, інтеграція в мобільний додаток.
- Тестування: перевірка на реальних пристроях, тестування сповіщень.
- Деплой: публікація оновлення додатку, моніторинг.
| Етап | Тривалість |
|---|---|
| Аналіз вимог | 0.5 дня |
| Створення класу та об'єкта | 1 день |
| Генерація JWT | 0.5 дня |
| Інтеграція в додаток | 1–2 дні |
| Тестування | 0.5 дня |
| Документація та навчання | 0.5 дня |
Терміни та вартість
Терміни залежать від складності:
- Базова перепустка з QR-кодом та сповіщеннями — від 3 днів.
- Інтеграція із зовнішніми системами (AD, 1С) — від 5 днів.
- Повний цикл з навчанням та документацією — до 8 днів.
Вартість розраховується індивідуально. Зв'яжіться з нами для оцінки вашого проєкту.
Що входить у роботу
- Аналіз та проектування схеми перепустки
- Створення класу та об'єкта в Google Wallet
- Серверна генерація JWT
- Інтеграція в Android-додаток (Kotlin/Java)
- Налаштування сповіщень про закінчення
- Документація та навчання команди
- Підтримка 2 тижні після здачі
Типові помилки
- Забути створити клас через API до першого JWT — інакше об'єкт не збережеться.
- Не налаштувати
enableSmartTap, якщо використовуються NFC-рідери — перепустка не спрацює. - Вказати MANY_DEVICES замість ONE_USER_ONE_DEVICE — ризик витоку перепустки.
Навіщо потрібен enableSmartTap?
enableSmartTap: True вмикає NFC-взаємодію. Якщо на прохідних встановлені NFC-рідери, без цього налаштування перепустка не спрацює. За замовчуванням — False, тому явно вмикайте.
Чому важливе обмеження ONE_USER_ONE_DEVICE?
Без нього перепустку можна зберегти на декількох пристроях одного облікового запису. Для корпоративних перепусток це порушення безпеки. Наше рішення використовує ONE_USER_ONE_DEVICE.
JWT-токени швидші за прямий REST-виклик у 6 разів: генерація на сервері займає <1 мс, а повний цикл додавання перепустки — менше секунди на пристрої.
Наші інженери мають сертифікацію Google та 5+ років досвіду в мобільній розробці. Ми гарантуємо стабільну роботу інтеграції. Замовте консультацію — ми оцінимо ваш проєкт за 1 день.
Для довідки: Google Wallet API







