Фрагменты кода

На этой странице содержатся фрагменты кода для следующих классов и объектов:

JSON EventTicketClass

Когда вы определите переменные класса EventTicketClass, добавьте его, отправив запрос POST на следующий URI архитектуры REST:

https://walletobjects.googleapis.com/walletobjects/v1/eventTicketClass

Добавьте параметр strict=true в URI архитектуры REST, чтобы включить строгий анализ и найти такие дополнительные ошибки, как повторяющиеся поля идентификаторов:

https://walletobjects.googleapis.com/walletobjects/v1/eventTicketClass?strict=true

Ниже указан пример ресурса JSON, представляющего собой класс EventTicketClass. Данные JSON необходимо передавать в запросе POST. В следующих образцах кода показано, как можно сформировать и добавить класс EventTicketClass.

Ресурс

{
    "kind": "walletobjects#eventTicketClass",
     "id": string,
    "reviewStatus": string,
    "issuerName": string,
     "eventName": {
        "kind": "walletobjects#localizedString",
          "translatedValues": [   {
            "kind": "walletobjects#translatedString",
                "language": string,
                "value": string
        }  ],
          "defaultValue": {
            "kind": "walletobjects#translatedString",
               "language": string,
               "value": string
        }
    },
    "venue": {
        "kind": "walletobjects#eventVenue",
          "name": {
            "kind": "walletobjects#localizedString",
               "translatedValues": [    {
                "kind": "walletobjects#translatedString",
                     "language": string,
                     "value": string
            }   ],
               "defaultValue": {
                "kind": "walletobjects#translatedString",
                    "language": string,
                    "value": string
            }
        },
          "address": {
            "kind": "walletobjects#localizedString",
               "translatedValues": [    {
                "kind": "walletobjects#translatedString",
                     "language": string,
                     "value": string
            }   ],
               "defaultValue": {
                "kind": "walletobjects#translatedString",
                    "language": string,
                    "value": string
            }
        }
    },
     "dateTime": {
        "kind": "walletobjects#eventDateTime",
          "doorsOpenLabel": string,
          "customDoorsOpenLabel": {
            "kind": "walletobjects#localizedString",
               "translatedValues": [    {
                "kind": "walletobjects#translatedString",
                     "language": string,
                     "value": string
            }   ],
               "defaultValue": {
                "kind": "walletobjects#translatedString",
                    "language": string,
                    "value": string
            }
        },
          "doorsOpen": string,
          "start": string,
          "end": string
    },
}

Java

// Define the Image Module Data
List<ImageModuleData> imageModuleData = new ArrayList<ImageModuleData>();

ImageModuleData image = new ImageModuleData().setMainImage(
    new Image().setSourceUri(
        new ImageUri().setUri("http://farm4.staticflickr.com/3738/12440799783_3dc3c20606_b.jpg")));

imageModuleData.add(image);

// Define Links Module Data
List<Uri> uris = new ArrayList<Uri>();
Uri uri1 = new Uri().setDescription("Nearby Locations").setUri("http://maps.google.com/?q=google");
Uri uri2 = new Uri().setDescription("Call Customer Service").setUri("tel:6505555555");

uris.add(uri1);
uris.add(uri2);

LinksModuleData linksModuleData = new LinksModuleData().setUris(uris);

// Define Text Areas
List<TextModuleData> textModulesData = new ArrayList<TextModuleData>();

TextModuleData details = new TextModuleData().setHeader("Custom EventTicket Details").setBody(
    "Baconrista events have pushed the limits since its founding.");

textModulesData.add(details);

// Define Geofence locations
List<LatLongPoint> locations = new ArrayList<LatLongPoint>();
locations.add(new LatLongPoint().setLatitude(37.422601).setLongitude(
    -122.085286));
locations.add(new LatLongPoint().setLatitude(37.424354).setLongitude(
    -122.09508869999999));
locations.add(new LatLongPoint().setLatitude(40.7406578).setLongitude(
    -74.00208940000002));

// Define event name
LocalizedStringDefaultValue eventnameDefault = new LocalizedStringDefaultValue().setlanguage("en-us").setValue("Baconrista Event-o-rama");
LocalizedString eventName = new LocalizedString().setDefaultValue(eventnameDefault);

// Define Event logo
ImageModuleData logoImage = new ImageModuleData().setMainImage(
    new Image().setSourceUri(
        new ImageUri().setUri("https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png")));

// Define Event ticket venue details
LocalizedStringDefaultValue venueNameDefault = new LocalizedStringDefaultValue().setlanguage("en-us").setValue("Baconrista Stadium");
LocalizedString venueName = new LocalizedString().setDefaultValue(venueNameDefault);
LocalizedStringDefaultValue venueAddressDefault = new LocalizedStringDefaultValue().setlanguage("en-us").setValue("101 Baconrista Dr.");
LocalizedString venueAddress = new LocalizedString().setDefaultValue(venueAddressDefault);

Venue venue = new Venue().setName(venueName).setAddress(venueAddress);

// Define event start, end, and door opent datetimes.  DateTime should be String value in ISO 8601 extended format date/time, with or without an offset
VenueDateTime dateTime = new VenueDateTime()
    .setDoorsOpen("2020-04-12T10:20:50.52Z")
    .setStart("2020-04-12T11:20:50.52Z")
    .setEnd("2020-04-12T16:20:50.52Z");

EventTicketClass wobClass = new EventTicketClass()
    .setId('2945482443380251551.ExampleEventTicketClass1')
    .setIssuerName("Baconrista Stadium")
    .setReviewStatus("underReview")
    .setLocations(locations)
    .setLinksModuleData(linksModuleData)
    .setImageModulesData(imageModuleData)
    .setTextModulesData(textModulesData)
    .setEventName(eventName)
    .setLogo(logoImage)
    .setVenue(venue)
    .setDateTime(dateTime);

EventTicketClass response = client.EventTicketClass().insert(wobClass).execute();

PHP

// A list of locations at which the Wallet Class can be used.
$locations = array(
    array(
        'kind' => 'walletobjects#latLongPoint',
        'latitude' => 37.424015499999996,
        'longitude' => -122.09259560000001
    ),
    array(
        'kind' => 'walletobjects#latLongPoint',
        'latitude' => 37.424354,
        'longitude' => -122.09508869999999
    ),
    array(
        'kind' => 'walletobjects#latLongPoint',
        'latitude' => 37.7901435,
        'longitude' => -122.39026709999997
    ),
    array(
        'kind' => 'walletobjects#latLongPoint',
        'latitude' => 40.7406578,
        'longitude' => -74.00208940000002
    )
);
// Source uri of title image.
$uriTitleImageInstance = new Google_Service_Walletobjects_ImageUri();
$imageTitleImageInstance = new Google_Service_Walletobjects_Image();
$uriTitleImageInstance->setUri(
    'http://farm4.staticflickr.com/3723/11177041115_6e6a3b6f49_o.jpg'
);
$imageTitleImageInstance->setSourceUri($uriTitleImageInstance);
// Define text module data.
$textModulesData = array(
    array(
        'header' => 'Custom Details',
        'body' => 'Baconrista events have pushed the limits since its founding.'
    ),
);
// Define links module data.
$linksModuleData = new Google_Service_Walletobjects_LinksModuleData();
$uris = array (
    array(
        'uri' => 'http://maps.google.com/map?q=google',
        'kind' => 'walletobjecs#uri',
        'description' => 'Nearby Locations'
    ),
    array(
        'uri' => 'tel:6505555555',
        'kind' => 'walletobjecs#uri',
        'description' => 'Call Customer Service'
    )
);
$linksModuleData->setUris($uris);

$uriModuleImageInstance = new Google_Service_Walletobjects_ImageUri();
$uriModuleImageInstance->setUri(
    'http://farm8.staticflickr.com/7401/11177116434_d8e600bba6_o.jpg'
);
$uriModuleImageInstance->setDescription('Coffee beans');
$imageModuleImageInstance = new Google_Service_Walletobjects_Image();
$imageModuleImageInstance->setSourceUri($uriModuleImageInstance);
$imagesModuleData = new Google_Service_Walletobjects_ImageModuleData();
$imagesModuleData->setMainImage($imageModuleImageInstance);
$imagesModuleDataArr = array ($imagesModuleData);

// Define event name
$eventnameDefault = new LocalizedStringDefaultValue()->setlanguage("en-us")->setValue("Baconrista Event-o-rama");
$eventName = new LocalizedString()->setDefaultValue($eventnameDefault);

// Define Event logo
$uriLogoImageInstance = new Google_Service_Walletobjects_ImageUri();
$imageLogoImageInstance = new Google_Service_Walletobjects_Image();
$uriLogoImageInstance->setUri(
    'https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png'
);
$imageLogoImageInstance->setSourceUri($uriLogoImageInstance);
$logoImage = new Logo()->setMainImage($imageLogoImageInstance);

// Define Event ticket venue details
$venueNameDefault = new LocalizedStringDefaultValue()->setlanguage("en-us")->setValue("Baconrista Stadium");
$venueName = new LocalizedString()->setDefaultValue(venueNameDefault);
$venueAddressDefault = new LocalizedStringDefaultValue()->setlanguage("en-us")->setValue("101 Baconrista dr.");
$venueAddress = new LocalizedString()->setDefaultValue(venueAddressDefault);

$venue = new Venue().setName($venueName).setAddress($venueAddress);

// Define event start, end, and door opent datetimes.  DateTime should be String value in ISO 8601 extended format date/time, with or without an offset
$dateTime = new VenueDateTime();
$dateTime->setDoorsOpen("2020-04-12T10:20:50.52Z")
$dateTime->setStart("2020-04-12T11:20:50.52Z")
$dateTime->setEnd("2020-04-12T16:20:50.52Z");

// Create wallet class.
$wobClass = new Google_Service_Walletobjects_EventTicketClass();
$EventTicketClass->setId('2945482443380251551.EventTicketClass');
$wobClass->setIssuerName('Baconrista Stadium');
$wobClass->setReviewStatus('underReview');
$wobClass->setLocations($locations);
$wobClass->setEventName($eventName);
$wobClass->setLogo($logoImage);
$wobClass->setVenue($venue);
$wobClass->setDateTime($dateTime);

$service->EventTicketClass->insert($wobClass);

Python

api_object = generate_eventticket_class(
      '1234567', 'ExampleeventticketClass')
api_request = service.eventticketclass().insert(body=api_object)
api_response = api_request.execute()

def generate_eventticket_class(issuer_id, class_id):
  eventticket_class = {
      'kind': 'walletobjects#eventTicketClass',
      'id': '%s.%s' % (issuer_id, class_id),
      'issuerName': 'Baconrista Stadium',
      'eventName': {
            'defaultValue': {
             'language': 'en-US',
             'value': 'Bacon Coffee Fun Event'
            }
      },
      'locations': [{
          'kind': 'walletobjects#latLongPoint',
          'latitude': 37.424015499999996,
          'longitude': -122.09259560000001
      }, {
          'kind': 'walletobjects#latLongPoint',
          'latitude': 37.424354,
          'longitude': -122.09508869999999
      }, {
          'kind': 'walletobjects#latLongPoint',
          'latitude': 37.7901435,
          'longitude': -122.39026709999997
      }, {
          'kind': 'walletobjects#latLongPoint',
          'latitude': 40.7406578,
          'longitude': -74.00208940000002
      }],
      'reviewStatus': 'underReview',
      'review': {
          'comments': 'Real auto approval by system'
      },
      'textModulesData': [{
          'header': 'Custom Details',
          'body': 'Baconrista events have pushed the limits since its founding.'
      }],
      'linksModuleData': {
          'uris': [{
              'kind': 'walletobjects#uri',
              'uri': 'http://maps.google.com/map?q=google',
              'description': 'Nearby Locations'
          }, {
              'kind': 'walletobjects#uri',
              'uri': 'tel:6505555555',
              'description': 'Call Customer Service'
          }]
      },
      'imageModulesData': [{
          'mainImage': {
              'kind': 'walletobjects#image',
              'sourceUri': {
                  'kind': 'walletobjects#uri',
                  'uri': 'http://farm4.staticflickr.com/3738/12440799783_3dc3c20606_b.jpg',
                  'description': 'Coffee beans'
              }
          }
      }],
      "logo": {
          "kind": "walletobjects#image",
            "sourceUri": {
              "kind": "walletobjects#uri",
                 "uri": 'https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png',
                 "description": 'Baconrista stadium logo'
          }
      },
      "venue": {
          "kind": "walletobjects#eventVenue",
            "name": {
              "kind": "walletobjects#localizedString",
                    "defaultValue": {
                  "kind": "walletobjects#translatedString",
                      "language": 'en-us',
                      "value": 'Baconrista Stadium'
              }
          },
            "address": {
              "kind": "walletobjects#localizedString",
                    "defaultValue": {
                  "kind": "walletobjects#translatedString",
                      "language": 'en-us',
                      "value": '101 Baconrista Dr.'
              }
          }
      },
       "dateTime": {
          "kind": "walletobjects#eventDateTime",
            "doorsOpen": '2020-04-12T10:20:50.52Z',
            "start": '2020-04-12T11:20:50.52Z',
            "end": '2020-04-12T16:20:50.52Z'
      }
  }
  return eventticket_class

JSON EventTicketObject

В приведенных ниже примерах показано, как можно сформировать объект EventTicketObject.

Ресурс

{
  "kind": "walletobjects#eventTicketObject",
  "id": string,
  "classId": string,
  "state": string,
  "barcode": {
    "kind": "walletobjects#barcode",
    "type": string,
    "value": string,
    "alternateText": string
  },
  "messages": [
    {
      "kind": "walletobjects#walletObjectMessage",
      "header": string,
      "localizedHeader": {
        "kind": "walletobjects#localizedString",
        "translatedValues": [
          {
            "kind": "walletobjects#translatedString",
            "language": string,
            "value": string
          }
        ],
        "defaultValue": {
          "kind": "walletobjects#translatedString",
          "language": string,
          "value": string
        }
      },
      "body": string,
      "localizedBody": {
        "kind": "walletobjects#localizedString",
        "translatedValues": [
          {
            "kind": "walletobjects#translatedString",
            "language": string,
            "value": string
          }
        ],
        "defaultValue": {
          "kind": "walletobjects#translatedString",
          "language": string,
          "value": string
        }
      },
      "displayInterval": {
        "kind": "walletobjects#timeInterval",
        "start": {
          "date": datetime
        },
        "end": {
          "date": datetime
        }
      },
      "id": string,
      "messageType": string
    }
  ],
  "validTimeInterval": {
    "kind": "walletobjects#timeInterval",
    "start": {
      "date": datetime
    },
    "end": {
      "date": datetime
    }
  },
  "locations": [
    {
      "kind": "walletobjects#latLongPoint",
      "latitude": double,
      "longitude": double
    }
  ],
  "hasUsers": boolean,
  "smartTapRedemptionValue": string,
  "hasLinkedDevice": boolean,
  "disableExpirationNotification": boolean,
  "infoModuleData": {
    "labelValueRows": [
      {
        "columns": [
          {
            "label": string,
            "localizedLabel": {
              "kind": "walletobjects#localizedString",
              "translatedValues": [
                {
                  "kind": "walletobjects#translatedString",
                  "language": string,
                  "value": string
                }
              ],
              "defaultValue": {
                "kind": "walletobjects#translatedString",
                "language": string,
                "value": string
              }
            },
            "value": string,
            "localizedValue": {
              "kind": "walletobjects#localizedString",
              "translatedValues": [
                {
                  "kind": "walletobjects#translatedString",
                  "language": string,
                  "value": string
                }
              ],
              "defaultValue": {
                "kind": "walletobjects#translatedString",
                "language": string,
                "value": string
              }
            }
          }
        ]
      }
    ],
    "showLastUpdateTime": boolean
  },
  "imageModulesData": [
    {
      "mainImage": {
        "kind": "walletobjects#image",
        "sourceUri": {
          "kind": "walletobjects#uri",
          "uri": string,
          "description": string,
          "localizedDescription": {
            "kind": "walletobjects#localizedString",
            "translatedValues": [
              {
                "kind": "walletobjects#translatedString",
                "language": string,
                "value": string
              }
            ],
            "defaultValue": {
              "kind": "walletobjects#translatedString",
              "language": string,
              "value": string
            }
          }
        }
      }
    }
  ],
  "textModulesData": [
    {
      "header": string,
      "body": string,
      "localizedHeader": {
        "kind": "walletobjects#localizedString",
        "translatedValues": [
          {
            "kind": "walletobjects#translatedString",
            "language": string,
            "value": string
          }
        ],
        "defaultValue": {
          "kind": "walletobjects#translatedString",
          "language": string,
          "value": string
        }
      },
      "localizedBody": {
        "kind": "walletobjects#localizedString",
        "translatedValues": [
          {
            "kind": "walletobjects#translatedString",
            "language": string,
            "value": string
          }
        ],
        "defaultValue": {
          "kind": "walletobjects#translatedString",
          "language": string,
          "value": string
        }
      }
    }
  ],
  "linksModuleData": {
    "uris": [
      {
        "kind": "walletobjects#uri",
        "uri": string,
        "description": string,
        "localizedDescription": {
          "kind": "walletobjects#localizedString",
          "translatedValues": [
            {
              "kind": "walletobjects#translatedString",
              "language": string,
              "value": string
            }
          ],
          "defaultValue": {
            "kind": "walletobjects#translatedString",
            "language": string,
            "value": string
          }
        }
      }
    ]
  },
  "classReference": eventticketclass Resource,
  "seatInfo": {
    "kind": "walletobjects#eventSeat",
    "seat": {
      "kind": "walletobjects#localizedString",
      "translatedValues": [
        {
          "kind": "walletobjects#translatedString",
          "language": string,
          "value": string
        }
      ],
      "defaultValue": {
        "kind": "walletobjects#translatedString",
        "language": string,
        "value": string
      }
    },
    "row": {
      "kind": "walletobjects#localizedString",
      "translatedValues": [
        {
          "kind": "walletobjects#translatedString",
          "language": string,
          "value": string
        }
      ],
      "defaultValue": {
        "kind": "walletobjects#translatedString",
        "language": string,
        "value": string
      }
    },
    "section": {
      "kind": "walletobjects#localizedString",
      "translatedValues": [
        {
          "kind": "walletobjects#translatedString",
          "language": string,
          "value": string
        }
      ],
      "defaultValue": {
        "kind": "walletobjects#translatedString",
        "language": string,
        "value": string
      }
    },
    "gate": {
      "kind": "walletobjects#localizedString",
      "translatedValues": [
        {
          "kind": "walletobjects#translatedString",
          "language": string,
          "value": string
        }
      ],
      "defaultValue": {
        "kind": "walletobjects#translatedString",
        "language": string,
        "value": string
      }
    }
  },
  "reservationInfo": {
    "kind": "walletobjects#eventReservationInfo",
    "confirmationCode": string
  },
  "ticketHolderName": string,
  "ticketNumber": string,
  "ticketType": {
    "kind": "walletobjects#localizedString",
    "translatedValues": [
      {
        "kind": "walletobjects#translatedString",
        "language": string,
        "value": string
      }
    ],
    "defaultValue": {
      "kind": "walletobjects#translatedString",
      "language": string,
      "value": string
    }
  },
  "faceValue": {
    "kind": "walletobjects#money",
    "micros": long,
    "currencyCode": string
  }
}

Java

// Define Barcode
Barcode barcode = new Barcode().setType("upcA").setValue("123456789012")
    .setAlternateText("12345");

// Define Seat Info
LocalizedStringDefaultValue gateDefault = new LocalizedStringDefaultValue().setlanguage("en-us").setValue("A");
LocalizedString gate = new LocalizedString().setDefaultValue(gateDefault);

LocalizedStringDefaultValue sectionDefault = new LocalizedStringDefaultValue().setlanguage("en-us").setValue("5");
LocalizedString section = new LocalizedString().setDefaultValue(sectionDefault);

LocalizedStringDefaultValue rowDefault = new LocalizedStringDefaultValue().setlanguage("en-us").setValue("G3");
LocalizedString row = new LocalizedString().setDefaultValue(rowDefault);

LocalizedStringDefaultValue seatDefault = new LocalizedStringDefaultValue().setlanguage("en-us").setValue("42");
LocalizedString seat = new LocalizedString().setDefaultValue(seatDefault);

SeatInfo seatInfo = new SeatInfo()
  .setGate(gate)
  .setSection(section)
  .setRow(row)
  .setSeat(seat);

// Define Wallet Object
eventTicketObject object = new eventTicketObject()
  .setClassId('2945482443380251551.ExampleeventTicketClass1')
    .setId('2945482443380251551.ExampleeventTicketObject1')
    .setBarcode(barcode)
    .setState("active")
    .setSeatInfo(seatInfo)
    .setTicketHolderName("Sir Bacon IV")
    .setTicketNumber("123abc");

PHP

$barcode = new Google_Service_Walletobjects_Barcode();
$barcode->setType('upcA');
$barcode->setValue('123456789012');
$barcode->setAlternateText('12345');

// Define Seat Info
$gateDefault = new LocalizedStringDefaultValue()
$gateDefault->setlanguage("en-us")
$gateDefault->setValue("A");
$gate = new LocalizedString();
$gate->setDefaultValue($gateDefault);

$sectionDefault = new LocalizedStringDefaultValue()
$sectionDefault->setlanguage("en-us")
$sectionDefault->setValue("5");
$section = new LocalizedString();
$section->setDefaultValue($sectionDefault);

$rowDefault = new LocalizedStringDefaultValue()
$rowDefault->setlanguage("en-us")
$rowDefault->setValue("G3");
$row = new LocalizedString();
$row->setDefaultValue($rowDefault);

$seatDefault = new LocalizedStringDefaultValue()
$seatDefault->setlanguage("en-us")
$seatDefault->setValue("42");
$seat = new LocalizedString();
$seat->setDefaultValue($seatDefault);

$seatInfo = new SeatInfo();
$seatInfo->setGate(gate);
$seatInfo->setSection(section);
$seatInfo->setRow(row);
$seatInfo->setSeat(seat);

// Create wallet object.
$eventTicketObject = new Google_Service_Walletobjects_eventTicketObject();
$eventTicketObject->setClassId('2945482443380251551.eventTicketClass');
$eventTicketObject->setId('2945482443380251551.eventTicketObject');
$eventTicketObject->setState('active');
$eventTicketObject->setBarcode($barcode);
$eventTicketObject->setSeatInfo($seatInfo);
$eventTicketObject->setTicketHolderName("Sir Bacon IV");
$eventTicketObject->setTicketNumber("123abc");

Python

eventTicket_object = {
    'kind': 'walletobjects#eventTicketObject',
    'classId': '1234567.ExampleEventTicketClass',
    'id': '1234567.ExampleEventTicketObject',
    'state': 'active',
    'barcode': {
        'kind': 'walletobjects#barcode',
        'type': 'upcA',
        'value': '123456789012',
        'alternateText': '12345'
    },
    "seatInfo": {
        "kind": "walletobjects#eventSeat",
        "seat": {
            "kind": "walletobjects#localizedString",
            "defaultValue": {
                "kind": "walletobjects#translatedString",
                "language": 'en-us',
                "value": '42'
            }
        },
        "row": {
            "kind": "walletobjects#localizedString",
            "defaultValue": {
                "kind": "walletobjects#translatedString",
                "language": 'en-us',
                "value": 'G3'
            }
        },
        "section": {
            "kind": "walletobjects#localizedString",
            "defaultValue": {
                "kind": "walletobjects#translatedString",
                "language": 'en-us',
                "value": '5'
            }
        },
        "gate": {
            "kind": "walletobjects#localizedString",
            "defaultValue": {
                "kind": "walletobjects#translatedString",
                "language": 'en-us',
                "value": 'A'
            }
        }
    },
    "ticketHolderName": 'Sir Bacon IV',
    "ticketNumber": '123abc',

}

Объект EventTicketObject можно добавить двумя способами.

Первый – создать запрос POST, содержащий объект с определенными переменными, для следующего URI архитектуры REST:

https://walletobjects.googleapis.com/walletobjects/v1/eventTicketObject

Второй – создать веб-токен JSON (JWT) из объекта EventTicketObject и добавить его к кнопке Сохранить в Google Pay. Более подробную информацию можно найти в разделе Как добавить кнопку для сети.

Как добавить объект EventTicketObject, используя API Android

Объект EventTicketObject нельзя добавить, используя API Android.

Вы можете воспользоваться REST API из приложения, активировав ссылку на веб-токен JSON в намерении ACTION_VIEW. Этот способ описан в разделе Как использовать ссылку на веб-токен JSON и намерение.

Кнопка для добавления нескольких билетов

Вы можете настроить ссылку или кнопку Сохранить в Google Pay так, чтобы один пользователь мог купить билеты для целой группы людей.

Для этого добавьте данные о билетах в массив веб-токена JSON (JWT), к которому добавляется подпись. Это можно сделать двумя способами, описанными в статье:

  1. В примере ниже классы и объекты билетов указаны заранее и принадлежат к одной группе, а отправляться будут только идентификаторы объектов. Обратите внимание, что свойство classId не является обязательным, а просто приведено для наглядности. В этом примере используются разные идентификаторы класса.

    {
        "aud": "google",
        "origins": [
            "http://localhost:8080"
        ],
        "iss": "your_iam_account@appspot.gserviceaccount.com",
        "iat": 1536970285,
        "typ": "savetoandroidpay",
        "payload": {
            "eventTicketObjects": [
                {
                    "classId": "<my_issuer_id>.EventTicketClass_A",
                    "id": "<my_issuer_id>.EventTicketObject_A"
                },
                {
    	      //this is a different class, but has same class.eventId
                    "classId": "<my_issuer_id>.EventTicketClass_B",
                    "id": "<my_issuer_id>.EventTicketObject_B"
                }
            ]
        }
    }
        
  2. В этом примере указывается класс и различные объекты, которые ссылаются на него. Класс и объекты добавляются, когда пользователь сохраняет билеты.

    {
        "aud": "google",
        "origins": [
            "http://localhost:8080"
        ],
        "iss": "your_iam_account@appspot.gserviceaccount.com",
        "iat": 1536970285,
        "typ": "savetoandroidpay",
        "payload": {
            "eventTicketClasses": [
              {
               "id": "<my_issuer_id>.EventTicketClass",
               "issuerName": "Baconrista Events",
               "reviewStatus": "underReview",
               "eventName": {
                "defaultValue": {
                 "language": "en-US",
                 "value": "Bacon Coffee Fun Event"
                }
               },
               "venue": {
                "name": {
                 "defaultValue": {
                  "language": "En-US",
                  "value": "1600 Amphitheatre Pkwy, Mountain View, CA 94043"
                 }
                },
                "address": {
                 "defaultValue": {
                  "language": "En-US",
                  "value": "1600 Amphitheatre Pkwy, Mountain View, CA 94043"
                 }
                }
               },
               "dateTime": {
                "doorsOpenLabel": "doorsOpen",
                "doorsOpen": "2027-04-12T19:20",
                "start": "2027-04-12T20:00",
                "end": "2027-04-12T21:20"
               }
              }
          ],
          "eventTicketObjects": [ {
            "classId": "<my_issuer_id>.EventTicketClass",
            "id": "<my_issuer_id>.EventTicketObject_1",
            "state": "active",
            },
            {
              "classId": "<my_issuer_id>.EventTicketClass",
              "id": "<my_issuer_id>.EventTicketObject_1",
              "state": "active",
            }
          ]
        }
    }