Интеграция Google Wallet для карт лояльности в мобильном приложении
Google Wallet API работает иначе, чем PassKit. Здесь нет файлового архива — карта создаётся через REST API Google, а на устройство передаётся JWT-токен с объектом. Для карт лояльности используется класс LoyaltyClass + объект LoyaltyObject. Пропустить создание LoyaltyClass — нельзя: объект без класса Google отклонит.
Настройка: Google Pay & Wallet Console
Перед кодом — три шага в console.wallet.google.com:
- Создать аккаунт издателя (Issuer Account)
- Создать
LoyaltyClass— шаблон карты с логотипом, цветами, полями - Получить service account credentials для серверных вызовов
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": "ru", "value": "Логотип YourShop" } }
},
"hexBackgroundColor": "#1E5AC8",
"countryCode": "RU",
"localizedIssuerName": {
"defaultValue": { "language": "ru", "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. Стоимость рассчитывается индивидуально.







