Інтеграція Google Wallet для карток лояльності в мобільних додатках
API Google Wallet працює по-іншому, ніж PassKit. Немає файлового архіву — карта створюється через REST API Google, а на пристрій передається JWT-токен з об'єктом. Для карток лояльності використовуйте LoyaltyClass + LoyaltyObject. Пропустити створення LoyaltyClass неможливо: Google відхилить об'єкт без класу.
Налаштування: Google Pay & Wallet Console
Перед кодом — три кроки на console.wallet.google.com:
- Створити акаунт видавця (Issuer Account)
- Створити
LoyaltyClass— шаблон карти з логотипом, кольорами, полями - Отримати облікові дані service account для серверних викликів
issuerId — числовий ідентифікатор видавця, наприклад 3388000000022142. classId формується як {issuerId}.{classPostfix}, наприклад 3388000000022142.loyalty_2024.
Створення LoyaltyClass через API
from google.oauth2 import service_account
from googleapiclient.discovery import build
credentials = service_account.Credentials.from_service_account_file(
'service_account.json',
scopes=['https://www.googleapis.com/auth/wallet_object.issuer']
)
service = build('walletobjects', 'v1', credentials=credentials)
loyalty_class = {
"id": "3388000000022142.loyalty_2024",
"issuerName": "YourShop",
"reviewStatus": "UNDER_REVIEW",
"programName": "Програма лояльності YourShop",
"programLogo": {
"sourceUri": { "uri": "https://yourshop.com/logo.png" },
"contentDescription": { "defaultValue": { "language": "uk", "value": "Логотип YourShop" } }
},
"hexBackgroundColor": "#1E5AC8",
"countryCode": "UA",
"localizedIssuerName": {
"defaultValue": { "language": "uk", "value": "YourShop" }
}
}
service.loyaltyclass().insert(body=loyalty_class).execute()
reviewStatus: "UNDER_REVIEW" — обов'язковий початковий стан. Google перевіряє клас вручну (зазвичай 1–3 дні). До затвердження карти можна додавати лише в тестовому режимі.
Створення LoyaltyObject та JWT
Кожен користувач отримує окремий LoyaltyObject:
import jwt
import time
loyalty_object = {
"id": f"3388000000022142.user_{user_id}",
"classId": "3388000000022142.loyalty_2024",
"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: додавання карти через Google Wallet API
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 недоступний.
Оновлення даних карти
Змініть баланс балів — PATCH-запит до існуючого об'єкта:
patch_body = {
"loyaltyPoints": {
"balance": { "int": new_points_value }
}
}
service.loyaltyobject().patch(
resourceId=f"3388000000022142.user_{user_id}",
body=patch_body
).execute()
Google Wallet автоматично синхронізує зміни на пристрої протягом кількох хвилин. Push-сповіщення не потрібні.
Тривалість
2–3 дні: створення LoyaltyClass, генерація об'єктів на сервері та JWT, інтеграція PayClient в Android-додаток. Плюс 1–3 дні на ревью класу від Google. Вартість розраховується індивідуально.







