Чтобы посмотреть примеры использования, выберите категорию.
В этом разделе содержатся фрагменты кода для билетов на мероприятия. Они касаются следующих классов и объектов:
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), к которому добавляется подпись. Это можно сделать двумя способами, описанными в статье:
-
В примере ниже классы и объекты билетов указаны заранее и принадлежат к одной группе, а отправляться будут только идентификаторы объектов. Обратите внимание, что свойство
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" } ] } }
-
В этом примере указывается класс и различные объекты, которые ссылаются на него. Класс и объекты добавляются, когда пользователь сохраняет билеты.
{ "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", } ] } }