Интеграция Google Wallet для билетов на мероприятия в мобильном приложении
Google Wallet позволяет добавить билет на концерт, спортивное событие или фестиваль прямо в кошелёк Android — без необходимости открывать приложение при входе. Пользователь предъявляет QR-код или штрихкод прямо с экрана блокировки. Интеграция требует серверной части: Google Wallet API работает с JWT, подписанными сервисным аккаунтом Google.
Как это работает: EventTicketObject
Google Wallet для мероприятий использует класс EventTicketClass (шаблон) и EventTicketObject (конкретный билет). Класс создаётся один раз для события, объекты — для каждого билета.
Процесс:
- Создаёте
EventTicketClassчерез Google Wallet API (REST) — описание события, логотип, цветовая схема - Для каждого билета создаёте
EventTicketObjectсо штрихкодом и данными места - Генерируете JWT с объектом, передаёте в приложение
- Приложение вызывает кнопку «Добавить в Google Wallet»
Серверная часть: JWT и Google Wallet API
Нужен сервисный аккаунт в Google Cloud Console с ролью Wallet Object Issuer.
import jwt
from google.oauth2 import service_account
import json
def create_event_ticket_jwt(event_id: str, ticket_id: str, holder_name: str, seat: str) -> str:
credentials = service_account.Credentials.from_service_account_file(
'service-account.json',
scopes=['https://www.googleapis.com/auth/wallet_object.issuer']
)
issuer_id = "YOUR_ISSUER_ID" # из Google Pay & Wallet Console
class_suffix = f"event_{event_id}"
object_suffix = f"ticket_{ticket_id}"
ticket_object = {
"id": f"{issuer_id}.{object_suffix}",
"classId": f"{issuer_id}.{class_suffix}",
"state": "ACTIVE",
"barcode": {
"type": "QR_CODE",
"value": ticket_id,
"alternateText": ticket_id[:8]
},
"ticketHolderName": holder_name,
"seatInfo": {
"seat": {"defaultValue": {"language": "ru", "value": seat}},
"row": {"defaultValue": {"language": "ru", "value": "A"}},
},
"reservationInfo": {
"confirmationCode": ticket_id[:8].upper()
},
"heroImage": {
"sourceUri": {"uri": "https://yourapp.com/event-banner.jpg"}
}
}
payload = {
"iss": credentials.service_account_email,
"aud": "google",
"typ": "savetowallet",
"iat": int(time.time()),
"origins": ["https://yourapp.com"],
"payload": {
"eventTicketObjects": [ticket_object]
}
}
token = jwt.encode(payload, credentials._private_key_pkcs8_pem, algorithm="RS256")
return token
JWT передаётся в мобильное приложение как строка. Срок действия — 1 час с момента генерации.
Android: кнопка «Добавить в Google Wallet»
// build.gradle
implementation("com.google.android.gms:play-services-wallet:19.3.0")
class TicketActivity : AppCompatActivity() {
private val walletClient by lazy {
Wallet.getWalletClient(
this,
WalletOptions.Builder()
.setEnvironment(WalletConstants.ENVIRONMENT_PRODUCTION)
.build()
)
}
private val addToWalletLauncher = registerForActivityResult(
ActivityResultContracts.StartIntentSenderForResult()
) { result ->
when (result.resultCode) {
RESULT_OK -> showSuccess()
RESULT_CANCELED -> { /* пользователь отменил */ }
else -> showError()
}
}
fun addTicketToWallet(jwt: String) {
val request = SavePassesRequest.newBuilder()
.setJwt(jwt)
.build()
walletClient.savePassesViaIntent(request) { apiResult ->
apiResult.intentSender?.let { intentSender ->
addToWalletLauncher.launch(
IntentSenderRequest.Builder(intentSender).build()
)
}
}
}
}
Кнопка по гайдлайнам Google
Google строго регулирует внешний вид кнопки. Нельзя использовать произвольный текст или цвет. Правильный способ — загрузить официальный вектор из Material Design Icons или использовать готовый компонент:
<com.google.android.gms.wallet.button.PayButton
android:id="@+id/addToWalletButton"
android:layout_width="match_parent"
android:layout_height="48dp"
app:allowedAuthMethods="PAN_ONLY|CRYPTOGRAM_3DS"
app:buttonType="addToGoogleWallet" />
Проверка доступности Wallet
Перед показом кнопки нужно проверить, доступен ли Google Wallet на устройстве:
walletClient.getPayApiAvailabilityStatus(
PayApiAvailabilityStatusRequest.newBuilder()
.setRequestType(PayApiAvailabilityStatusRequest.RequestType.SAVE_PASSES)
.build()
).addOnSuccessListener { status ->
if (status.isAvailable) {
addToWalletButton.isVisible = true
}
}
Wallet недоступен на устройствах без Google Play Services и в ряде регионов.
Обновление билета после выдачи
Если нужно обновить QR-код или статус билета (например, «использован») — вызываете PATCH-запрос к Google Wallet API с objectId. Изменения применяются к уже добавленным пассам в реальном времени.
from googleapiclient.discovery import build
service = build('walletobjects', 'v1', credentials=credentials)
service.eventticketobject().patch(
resourceId=f"{issuer_id}.{object_suffix}",
body={"state": "COMPLETED"} # билет использован
).execute()
Сроки
2–3 дня. Создание класса события, генерация JWT, интеграция кнопки — 1,5 дня. Обновление статуса через API + тестирование — 0,5–1 день. Стоимость рассчитывается индивидуально.







