Как добавить карту лояльности в 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 | RU |
Как сгенерировать 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, сотни успешно добавленных карт. Гарантируем правильную настройку с первого раза и прохождение ревью. Свяжитесь с нами, и мы подберём оптимальное решение для вашего бизнеса.







