Добавление билетов в Google Wallet из Android приложения
Представьте: посетитель концерта подходит ко входу, достаёт телефон, и на экране блокировки уже отображается QR-код его билета. Никаких PDF-вложений, писем и очередей. Один из наших клиентов — организатор музыкальных фестивалей — столкнулся с проблемой: 20% посетителей не могли найти свои билеты в почте или мессенджерах. После внедрения Google Wallet количество обращений в поддержку сократилось на 40%. Мы поможем внедрить такую интеграцию для вашего мобильного приложения: сервер генерирует JWT, приложение сохраняет билет в кошелёк, а статус обновляется в реальном времени. За плечами более пяти лет опыта работы с платёжными сервисами — гарантируем качество.
Как работает Google Wallet для билетов?
Google Wallet использует два объекта: EventTicketClass (шаблон мероприятия) и EventTicketObject (конкретный билет). Сервер создаёт JWT-токен с данными билета, подписанный сервисным аккаунтом Google. Приложение передаёт этот токен в Wallet API, и пользователь видит кнопку «Добавить в Google Wallet». После сохранения билет отображается в кошельке даже офлайн.
Почему Google Wallet надёжнее PDF-билетов?
PDF-билеты легко потерять, подделать или забыть. Google Wallet хранит билеты в защищённом хранилище, доступном без интернета. Вы можете обновлять статус в реальном времени: отметить билет использованным после входа или изменить место. Это повышает безопасность и удобство — пользователь не ищет письмо среди спама. Согласно Google Wallet API documentation, все данные передаются по зашифрованному каналу.
Как добавить билет в Google Wallet: пошаговая инструкция
- Настройка сервера. Создайте сервисный аккаунт в Google Cloud Console с ролью
Wallet Object Issuer. Получите Issuer ID из Google Pay & Wallet Console. - Генерация JWT. Сервер формирует JWT-токен с данными билета, подписанный приватным ключом. Токен действителен один час.
- Передача токена приложению. Приложение получает JWT через API или в ответе на покупку.
- Проверка доступности Wallet. Используйте
PayApiAvailabilityStatusдля определения, установлен ли Google Wallet на устройстве. - Отображение кнопки. Если кошелёк доступен, покажите официальную кнопку «Добавить в Google Wallet».
- Сохранение билета. По нажатию вызывается
savePassesViaIntentс JWT. Пользователь подтверждает — билет появляется в кошельке.
Пример генерации JWT на Python
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 токен действителен один час и передаётся в приложение строкой.
Код для Android (Kotlin)
// 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 используйте официальный компонент:
<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:
walletClient.getPayApiAvailabilityStatus(
PayApiAvailabilityStatusRequest.newBuilder()
.setRequestType(PayApiAvailabilityStatusRequest.RequestType.SAVE_PASSES)
.build()
).addOnSuccessListener { status ->
if (status.isAvailable) {
addToWalletButton.isVisible = true
}
}
Что нужно для начала интеграции?
Для запуска потребуется:
- Доступ к Google Cloud Console для создания сервисного аккаунта.
- Идентификатор эмитента (Issuer ID) из Google Pay & Wallet Console.
- Сервер для генерации JWT (достаточно одного эндпоинта).
- Мобильное приложение с возможностью добавить кнопку.
Подробнее о настройке сервисного аккаунта
Сервисный аккаунт создаётся в разделе IAM Google Cloud Console. Ему присваивается роль `Wallet Object Issuer`. После создания скачивается JSON-ключ, который используется на сервере для подписи JWT. Убедитесь, что ключ хранится в безопасности и не попадает в репозиторий.Обновление билета после выдачи
Если нужно изменить QR-код или статус (например, «использован»), отправляется PATCH-запрос:
from googleapiclient.discovery import build
service = build('walletobjects', 'v1', credentials=credentials)
service.eventticketobject().patch(
resourceId=f"{issuer_id}.{object_suffix}",
body={"state": "COMPLETED"} # билет использован
).execute()
Изменения применяются в реальном времени на всех устройствах пользователей.
Сравнение: Google Wallet и PDF-билеты
| Характеристика | Google Wallet | PDF-билет |
|---|---|---|
| Доступность офлайн | Да | Нет (нужен файл) |
| Обновление статуса | В реальном времени | Невозможно |
| Защита от подделок | Криптографическая подпись | Легко подделать |
| Удобство для пользователя | Автоматически на телефоне | Требуется поиск в почте |
| Интеграция с push-уведомлениями | Да | Нет |
Сравнение: EventTicketClass и EventTicketObject
| Сущность | Назначение | Пример |
|---|---|---|
EventTicketClass |
Шаблон мероприятия: название, логотип, цвет, локация | Концерт «Рок-фестиваль» |
EventTicketObject |
Индивидуальный билет: место, имя владельца, QR-код | Билет №1234, ряд 5, место 10 |
Сроки и стоимость
Ориентировочный срок — 2–3 дня. Точная стоимость рассчитывается после аудита вашего проекта. Оценим проект в течение дня после обращения. Свяжитесь с нами для консультации.
Заключение
Интеграция Google Wallet — это не только удобство для пользователей, но и дополнительный канал коммуникации: вы можете обновлять билеты, менять места или полностью аннулировать их. Наш опыт гарантирует быструю и качественную реализацию. Если вы хотите улучшить пользовательский опыт и повысить безопасность — свяжитесь с нами. Мы проведём аудит вашего проекта и предложим оптимальное решение. Закажите интеграцию Google Wallet уже сегодня.







