Интеграция Google Wallet для билетов на мероприятия в мобильном приложении

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1735 услуг
Интеграция Google Wallet для билетов на мероприятия в мобильном приложении
Средний
~2-3 дня
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    495

Интеграция Google Wallet для билетов на мероприятия в мобильном приложении

Google Wallet позволяет добавить билет на концерт, спортивное событие или фестиваль прямо в кошелёк Android — без необходимости открывать приложение при входе. Пользователь предъявляет QR-код или штрихкод прямо с экрана блокировки. Интеграция требует серверной части: Google Wallet API работает с JWT, подписанными сервисным аккаунтом Google.

Как это работает: EventTicketObject

Google Wallet для мероприятий использует класс EventTicketClass (шаблон) и EventTicketObject (конкретный билет). Класс создаётся один раз для события, объекты — для каждого билета.

Процесс:

  1. Создаёте EventTicketClass через Google Wallet API (REST) — описание события, логотип, цветовая схема
  2. Для каждого билета создаёте EventTicketObject со штрихкодом и данными места
  3. Генерируете JWT с объектом, передаёте в приложение
  4. Приложение вызывает кнопку «Добавить в 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 день. Стоимость рассчитывается индивидуально.