Як додати картку лояльності в Google Wallet з Android-додатку?
Користувачі хочуть носити картки лояльності в телефоні. Google Wallet — природне місце на Android, встановлене на 1,5 млрд пристроїв. Але інтеграція складніша, ніж проста кнопка "Додати в Wallet": потрібно зареєструвати видавця, створити клас картки, генерувати JWT та реалізувати клієнтський API. Ми провели більше 10 інтеграцій з Google Wallet і знаємо всі підводні камені. Пропонуємо реалізацію під ключ — від консолі до коду, з гарантією проходження рев'ю Google за 1-3 дні.
Наприклад, для мережі кав'ярень CoffeeBoom ми реалізували інтеграцію Google Wallet з бонусною програмою, створивши LoyaltyClass з персоналізованим дизайном та автоматичною синхронізацією балів через CRM. Проєкт зайняв 3 дні на розробку і 2 дні на рев'ю від Google. Інтеграція Google Wallet дозволяє користувачам завжди мати картку лояльності під рукою, збільшує залученість на 25–40% і знижує витрати на випуск пластику на 60–80%. Однак для стабільної роботи потрібне грамотне налаштування JWT, обробка помилок та дотримання правил Google.
Офіційна документація: Google Wallet Loyalty API
Етапи інтеграції Google Wallet
Інтеграція проходить у кілька етапів:
- Створення облікового запису видавця в Google Pay & Wallet Console.
- Створення LoyaltyClass — шаблону картки з логотипом, кольорами та полями.
- Генерація LoyaltyObject для кожного користувача на сервері.
- Підготовка JWT для передачі на клієнт.
- Реалізація PayClient.savePasses в Android-додатку.
- Обробка результату додавання та оновлення даних.
Що потрібно підготувати перед інтеграцією?
Перед написанням коду — три кроки в консолі:
- Створити обліковий запис видавця (Issuer Account)
- Створити
LoyaltyClass— шаблон картки - Отримати service account credentials для серверних викликів
issuerId — числовий ідентифікатор видавця, наприклад 3388000000022142. classId формується як {issuerId}.{classPostfix}, наприклад 3388000000022142.loyalty_main.
Ось мінімальні поля для LoyaltyClass:
| Поле | Тип | Приклад |
|---|---|---|
| id | string | 3388000000022142.loyalty_main |
| issuerName | string | YourShop |
| programName | localized | Програма лояльності YourShop |
| programLogo | Image | https://yourshop.com/logo.png |
| hexBackgroundColor | string | #1E5AC8 |
| countryCode | string | UA |
Як згенерувати JWT для кожного користувача?
Кожен користувач — окремий LoyaltyObject. Ми створюємо його на сервері та пакуємо в JWT:
import jwt import time loyalty_object = { "id": f"3388000000022142.user_{user_id}", "classId": "3388000000022142.loyalty_main", "state": "ACTIVE", "loyaltyPoints": { "label": "Бали", "balance": { "int": user_points } }, "barcode": { "type": "QR_CODE", "value": f"USER-{user_id}", "alternateText": f"USER-{user_id}" }, "textModulesData": [ { "header": "Рівень", "body": user_tier, "id": "tier" } ] } # Створюємо об'єкт через API service.loyaltyobject().insert(body=loyalty_object).execute() # Генеруємо JWT для передачі на клієнт payload = { "iss": service_account_email, "aud": "google", "typ": "savetowallet", "iat": int(time.time()), "payload": { "loyaltyObjects": [{ "id": loyalty_object["id"] }] } } token = jwt.encode(payload, private_key, algorithm="RS256") JWT передається в мобільний додаток. Час життя JWT — максимум 1 година, тому генеруйте його безпосередньо перед відправкою.
Як додати картку в Android через PayClient?
import com.google.android.gms.pay.Pay import com.google.android.gms.pay.PayApiAvailabilityStatus import com.google.android.gms.pay.PayClient private lateinit var walletClient: PayClient override fun onCreate(savedInstanceState: Bundle?) { walletClient = Pay.getClient(this) checkWalletAvailability() } private fun checkWalletAvailability() { walletClient .getPayApiAvailabilityStatus(PayClient.RequestType.SAVE_PASSES) .addOnSuccessListener { status -> if (status == PayApiAvailabilityStatus.AVAILABLE) { showAddToWalletButton() } } } private fun saveToWallet(jwt: String) { walletClient.savePasses(jwt, this, ADD_TO_GOOGLE_WALLET_REQUEST_CODE) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (requestCode == ADD_TO_GOOGLE_WALLET_REQUEST_CODE) { when (resultCode) { RESULT_OK -> handleSuccess() RESULT_CANCELED -> handleCanceled() PayClient.SavePassesResult.SAVE_ERROR -> data?.let { handleError(it.getStringExtra(PayClient.EXTRA_API_ERROR_MESSAGE)) } } } } PayClient.RequestType.SAVE_PASSES перевіряє, що Google Wallet встановлений і працює. На пристроях без GMS (Huawei) Google Wallet недоступний — передбачте fallback.
Як оновити дані картки після видачі?
Змінити баланс балів — PATCH-запит на існуючий об'єкт:
patch_body = { "loyaltyPoints": { "balance": { "int": new_points_value } } } service.loyaltyobject().patch( resourceId=f"3388000000022142.user_{user_id}", body=patch_body ).execute() Google Wallet синхронізує зміни на пристрої протягом 2-5 хвилин. Push-повідомлень надсилати не потрібно — система сама оновлює картку.
Google Wallet чи PassKit: що обрати?
| Критерій | Google Wallet | PassKit (iOS) |
|---|---|---|
| Формат | REST API, JSON | PKPass Archive |
| Час розробки | 2-3 дні | 4-5 днів |
| Офлайн-робота | Потрібна мережа для синхронізації | Повна офлайн-підтримка |
| Оновлення даних | Автоматичне через API | Потрібне push-повідомлення |
Google Wallet не потребує файлового архіву — все через REST API. Це прискорює розробку в 2 рази і спрощує підтримку. Однак на iOS PassKit швидше працює офлайн.
Що входить у нашу роботу?
- Серверна частина: створення LoyaltyClass, генерація LoyaltyObject і JWT, API для оновлення даних
- Клієнтська частина: інтеграція PayClient в Android-додаток, обробка результату додавання
- Тестування: перевірка на пристроях з різними версіями Android, включаючи емуляцію Google Wallet
- Документація: опис усіх ендпоінтів та інструкція для розробника
- Підтримка після запуску: допомога у проходженні рев'ю Google, моніторинг помилок
Які помилки найчастіше допускають при інтеграції?
- Неправильний формат classId: має бути
{issuerId}.{postfix}, інакше Google відхиляє запит. - JWT з вичерпаним терміном дії: час життя не повинен перевищувати 1 годину, інакше клієнт отримає помилку.
- Відсутність service account: без коректних credentials API не авторизує запити.
- Ігнорування reviewStatus: поки клас у статусі UNDER_REVIEW, картки не можна додавати на реальні пристрої.
Упевніться, що всі поля заповнені, а серверний скрипт працює з правильним issuerId.
Терміни
2–3 дні: створення LoyaltyClass, серверна генерація об'єктів та JWT, інтеграція PayClient в Android-додаток. Плюс 1–3 дні на рев'ю класу від Google. Вартість розраховується індивідуально. Замовте інтеграцію під ключ — ми оцінимо ваш проєкт і назвемо терміни.
Наш досвід — 5+ років у мобільній розробці, понад 10 інтеграцій з Google Wallet, сотні успішно доданих карток. Гарантуємо правильне налаштування з першого разу і проходження рев'ю. Зв'яжіться з нами, і ми підберемо оптимальне рішення для вашого бізнесу.







