选择以下一种卡券类别可详细了解其使用方式。
此部分包含活动门票的代码段。它涵盖以下类和对象:
JSON EventTicketClass
定义了 EventTicketClass
后,您可以通过向以下 REST URI 发出 POST
请求来插入此类:
https://walletobjects.googleapis.com/walletobjects/v1/eventTicketClass
将 strict=true
参数添加到 REST URI 以启用严格的错误解析并捕获其他错误,例如重复的 ID 字段:
https://walletobjects.googleapis.com/walletobjects/v1/eventTicketClass?strict=true
以下示例展示了表示 EventTicketClass
的 JSON 资源。必须在 POST
请求的主体中发送 JSON。以下代码示例详细演示了如何定义和插入 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
有两种方法。
第一种方法是向以下 REST URI 发送 POST 请求(在请求正文中定义对象):
https://walletobjects.googleapis.com/walletobjects/v1/eventTicketObject
第二种方法是根据 EventTicketObject
定义创建 JSON 网络令牌 (JWT),并将 JWT 放入保存到 Google Pay 按钮。如需了解详情,请参阅在网页上添加按钮。
使用 Android API 添加 EventTicketObject
目前无法使用 Android API 来添加 EventTicketObjects。
如使用 JWT 链接和 Intent 方法中所述,您可以通过在 ACTION_VIEW
Intent 中调用 JWT 链接,在应用中使用 REST API。
保存多位参与者按钮
您可以使用一个保存到 Google Pay 按钮或网页链接保存多个卡券,这在一个用户购买一项活动的多张门票时非常有用。
为了保存多位参与者,请在要签名的 JSON 网络令牌 (JWT) 的数组中加入多个卡券。以下示例显示了如何执行此操作的两个变体(如创建一个按钮即可保存多个卡券中所述):
-
此示例使用预先插入的活动门票类和分类为同一组的对象,并且它仅发送每个对象的 ID。请注意,
classId
属性是可选的。这里是出于演示目的而显示此属性。在此示例中,使用的类 ID 是不同的。{ "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", } ] } }