다음과 같은 경우 사용자의 Google 월렛 계정에 여러 개의 패스를 추가할 수 있습니다. 'Google 월렛에 추가' 버튼을 클릭합니다. 추가되는 각 패스는 다른 통과 유형 (백신 카드 및 검사 기록 제외) 대상 이벤트 티켓과 혜택은 다음과 같이 지정된 JWT 내에 추가할 수 있습니다. 확인할 수 있습니다.
{ "aud": "google", "iat": “YOUR_ISSUER_ID”, "iss": "YOUR_SERVICE_ACCOUNT", "typ": "savetogooglepay", "payload": { "offerObjects": [ { "classId": "YOUR_ISSUER_ID.offClassId", "id": "YOUR_ISSUER_ID.offer" } ], "eventTicketObjects": [ { "classId": "YOUR_ISSUER_ID.evClassId", "id": "YOUR_ISSUER_ID.event" } ] }, "origins": [] }
사용자가 링크를 클릭하면 저장된 패스 수가 표시됩니다. 기기에 패스를 추가할 수도 있습니다. 패스를 추가한 후 찾을 수 있습니다.
다음 코드 샘플은 지정할 수 있습니다자바
Java에서 통합을 시작하려면 전체 <ph type="x-smartling-placeholder"></ph> 코드 샘플을 확인하세요.
/** * Generate a signed JWT that references an existing pass object. * * <p>When the user opens the "Add to Google Wallet" URL and saves the pass to their wallet, the * pass objects defined in the JWT are added to the user's Google Wallet app. This allows the user * to save multiple pass objects in one API call. * * <p>The objects to add must follow the below format: * * <p>{ 'id': 'ISSUER_ID.OBJECT_SUFFIX', 'classId': 'ISSUER_ID.CLASS_SUFFIX' } * * @param issuerId The issuer ID being used for this request. * @return An "Add to Google Wallet" link. */ public String createJWTExistingObjects(String issuerId) { // Multiple pass types can be added at the same time // At least one type must be specified in the JWT claims // Note: Make sure to replace the placeholder class and object suffixes HashMap<String, Object> objectsToAdd = new HashMap<String, Object>(); // Event tickets objectsToAdd.put( "eventTicketObjects", List.of( new EventTicketObject() .setId(String.format("%s.%s", issuerId, "EVENT_OBJECT_SUFFIX")) .setClassId(String.format("%s.%s", issuerId, "EVENT_CLASS_SUFFIX")))); // Boarding passes objectsToAdd.put( "flightObjects", List.of( new FlightObject() .setId(String.format("%s.%s", issuerId, "FLIGHT_OBJECT_SUFFIX")) .setClassId(String.format("%s.%s", issuerId, "FLIGHT_CLASS_SUFFIX")))); // Generic passes objectsToAdd.put( "genericObjects", List.of( new GenericObject() .setId(String.format("%s.%s", issuerId, "GENERIC_OBJECT_SUFFIX")) .setClassId(String.format("%s.%s", issuerId, "GENERIC_CLASS_SUFFIX")))); // Gift cards objectsToAdd.put( "giftCardObjects", List.of( new GiftCardObject() .setId(String.format("%s.%s", issuerId, "GIFT_CARD_OBJECT_SUFFIX")) .setClassId(String.format("%s.%s", issuerId, "GIFT_CARD_CLASS_SUFFIX")))); // Loyalty cards objectsToAdd.put( "loyaltyObjects", List.of( new LoyaltyObject() .setId(String.format("%s.%s", issuerId, "LOYALTY_OBJECT_SUFFIX")) .setClassId(String.format("%s.%s", issuerId, "LOYALTY_CLASS_SUFFIX")))); // Offers objectsToAdd.put( "offerObjects", List.of( new OfferObject() .setId(String.format("%s.%s", issuerId, "OFFER_OBJECT_SUFFIX")) .setClassId(String.format("%s.%s", issuerId, "OFFER_CLASS_SUFFIX")))); // Transit passes objectsToAdd.put( "transitObjects", List.of( new TransitObject() .setId(String.format("%s.%s", issuerId, "TRANSIT_OBJECT_SUFFIX")) .setClassId(String.format("%s.%s", issuerId, "TRANSIT_CLASS_SUFFIX")))); // Create the JWT as a HashMap object HashMap<String, Object> claims = new HashMap<String, Object>(); claims.put("iss", ((ServiceAccountCredentials) credentials).getClientEmail()); claims.put("aud", "google"); claims.put("origins", List.of("www.example.com")); claims.put("typ", "savetowallet"); claims.put("payload", objectsToAdd); // The service account credentials are used to sign the JWT Algorithm algorithm = Algorithm.RSA256( null, (RSAPrivateKey) ((ServiceAccountCredentials) credentials).getPrivateKey()); String token = JWT.create().withPayload(claims).sign(algorithm); System.out.println("Add to Google Wallet link"); System.out.printf("https://pay.google.com/gp/v/save/%s%n", token); return String.format("https://pay.google.com/gp/v/save/%s", token); }
PHP
PHP에서 통합을 시작하려면 전체 <ph type="x-smartling-placeholder"></ph> 코드 샘플을 확인하세요.
/** * Generate a signed JWT that references an existing pass object. * * When the user opens the "Add to Google Wallet" URL and saves the pass to * their wallet, the pass objects defined in the JWT are added to the * user's Google Wallet app. This allows the user to save multiple pass * objects in one API call. * * The objects to add must follow the below format: * * { * 'id': 'ISSUER_ID.OBJECT_SUFFIX', * 'classId': 'ISSUER_ID.CLASS_SUFFIX' * } * * @param string $issuerId The issuer ID being used for this request. * * @return string An "Add to Google Wallet" link. */ public function createJwtExistingObjects(string $issuerId) { // Multiple pass types can be added at the same time // At least one type must be specified in the JWT claims // Note: Make sure to replace the placeholder class and object suffixes $objectsToAdd = [ // Event tickets 'eventTicketObjects' => [ [ 'id' => "{$issuerId}.EVENT_OBJECT_SUFFIX", 'classId' => "{$issuerId}.EVENT_CLASS_SUFFIX" ] ], // Boarding passes 'flightObjects' => [ [ 'id' => "{$issuerId}.FLIGHT_OBJECT_SUFFIX", 'classId' => "{$issuerId}.FLIGHT_CLASS_SUFFIX" ] ], // Generic passes 'genericObjects' => [ [ 'id' => "{$issuerId}.GENERIC_OBJECT_SUFFIX", 'classId' => "{$issuerId}.GENERIC_CLASS_SUFFIX" ] ], // Gift cards 'giftCardObjects' => [ [ 'id' => "{$issuerId}.GIFT_CARD_OBJECT_SUFFIX", 'classId' => "{$issuerId}.GIFT_CARD_CLASS_SUFFIX" ] ], // Loyalty cards 'loyaltyObjects' => [ [ 'id' => "{$issuerId}.LOYALTY_OBJECT_SUFFIX", 'classId' => "{$issuerId}.LOYALTY_CLASS_SUFFIX" ] ], // Offers 'offerObjects' => [ [ 'id' => "{$issuerId}.OFFER_OBJECT_SUFFIX", 'classId' => "{$issuerId}.OFFER_CLASS_SUFFIX" ] ], // Tranist passes 'transitObjects' => [ [ 'id' => "{$issuerId}.TRANSIT_OBJECT_SUFFIX", 'classId' => "{$issuerId}.TRANSIT_CLASS_SUFFIX" ] ] ]; // The service account credentials are used to sign the JWT $serviceAccount = json_decode(file_get_contents($this->keyFilePath), true); // Create the JWT as an array of key/value pairs $claims = [ 'iss' => $serviceAccount['client_email'], 'aud' => 'google', 'origins' => ['www.example.com'], 'typ' => 'savetowallet', 'payload' => $objectsToAdd ]; $token = JWT::encode( $claims, $serviceAccount['private_key'], 'RS256' ); print "Add to Google Wallet link\n"; print "https://pay.google.com/gp/v/save/{$token}"; return "https://pay.google.com/gp/v/save/{$token}"; }
Python
Python에서 통합을 시작하려면 전체 <ph type="x-smartling-placeholder"></ph> 코드 샘플을 확인하세요.
def create_jwt_existing_objects(self, issuer_id: str) -> str: """Generate a signed JWT that references an existing pass object. When the user opens the "Add to Google Wallet" URL and saves the pass to their wallet, the pass objects defined in the JWT are added to the user's Google Wallet app. This allows the user to save multiple pass objects in one API call. The objects to add must follow the below format: { 'id': 'ISSUER_ID.OBJECT_SUFFIX', 'classId': 'ISSUER_ID.CLASS_SUFFIX' } Args: issuer_id (str): The issuer ID being used for this request. Returns: An "Add to Google Wallet" link """ # Multiple pass types can be added at the same time # At least one type must be specified in the JWT claims # Note: Make sure to replace the placeholder class and object suffixes objects_to_add = { # Event tickets 'eventTicketObjects': [{ 'id': f'{issuer_id}.EVENT_OBJECT_SUFFIX', 'classId': f'{issuer_id}.EVENT_CLASS_SUFFIX' }], # Boarding passes 'flightObjects': [{ 'id': f'{issuer_id}.FLIGHT_OBJECT_SUFFIX', 'classId': f'{issuer_id}.FLIGHT_CLASS_SUFFIX' }], # Generic passes 'genericObjects': [{ 'id': f'{issuer_id}.GENERIC_OBJECT_SUFFIX', 'classId': f'{issuer_id}.GENERIC_CLASS_SUFFIX' }], # Gift cards 'giftCardObjects': [{ 'id': f'{issuer_id}.GIFT_CARD_OBJECT_SUFFIX', 'classId': f'{issuer_id}.GIFT_CARD_CLASS_SUFFIX' }], # Loyalty cards 'loyaltyObjects': [{ 'id': f'{issuer_id}.LOYALTY_OBJECT_SUFFIX', 'classId': f'{issuer_id}.LOYALTY_CLASS_SUFFIX' }], # Offers 'offerObjects': [{ 'id': f'{issuer_id}.OFFER_OBJECT_SUFFIX', 'classId': f'{issuer_id}.OFFER_CLASS_SUFFIX' }], # Transit passes 'transitObjects': [{ 'id': f'{issuer_id}.TRANSIT_OBJECT_SUFFIX', 'classId': f'{issuer_id}.TRANSIT_CLASS_SUFFIX' }] } # Create the JWT claims claims = { 'iss': self.credentials.service_account_email, 'aud': 'google', 'origins': ['www.example.com'], 'typ': 'savetowallet', 'payload': objects_to_add } # The service account credentials are used to sign the JWT signer = crypt.RSASigner.from_service_account_file(self.key_file_path) token = jwt.encode(signer, claims).decode('utf-8') print('Add to Google Wallet link') print(f'https://pay.google.com/gp/v/save/{token}') return f'https://pay.google.com/gp/v/save/{token}'
C#
C#에서 통합을 시작하려면 전체 <ph type="x-smartling-placeholder"></ph> 코드 샘플을 확인하세요.
/// <summary> /// Generate a signed JWT that references an existing pass object. /// <para /> /// When the user opens the "Add to Google Wallet" URL and saves the pass to /// their wallet, the pass objects defined in the JWT are added to the user's /// Google Wallet app. This allows the user to save multiple pass objects in /// one API call. /// <para /> /// The objects to add must follow the below format: /// <para /> /// { 'id': 'ISSUER_ID.OBJECT_SUFFIX', 'classId': 'ISSUER_ID.CLASS_SUFFIX' } /// <para /> /// The Google Wallet C# library uses Newtonsoft.Json.JsonPropertyAttribute /// to specify the property names when converting objects to JSON. The /// Newtonsoft.Json.JsonConvert.SerializeObject method will automatically /// serialize the object with the right property names. /// </summary> /// <param name="issuerId">The issuer ID being used for this request.</param> /// <returns>An "Add to Google Wallet" link.</returns> public string CreateJWTExistingObjects(string issuerId) { // Ignore null values when serializing to/from JSON JsonSerializerSettings excludeNulls = new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore }; // Multiple pass types can be added at the same time // At least one type must be specified in the JWT claims // Note: Make sure to replace the placeholder class and object suffixes Dictionary<string, Object> objectsToAdd = new Dictionary<string, Object>(); // Event tickets objectsToAdd.Add("eventTicketObjects", new List<EventTicketObject> { new EventTicketObject { Id = $"{issuerId}.EVENT_OBJECT_SUFFIX", ClassId = $"{issuerId}.EVENT_CLASS_SUFFIX" } }); // Boarding passes objectsToAdd.Add("flightObjects", new List<FlightObject> { new FlightObject { Id = $"{issuerId}.FLIGHT_OBJECT_SUFFIX", ClassId = $"{issuerId}.FLIGHT_CLASS_SUFFIX" } }); // Generic passes objectsToAdd.Add("genericObjects", new List<GenericObject> { new GenericObject { Id = $"{issuerId}.GENERIC_OBJECT_SUFFIX", ClassId = $"{issuerId}.GENERIC_CLASS_SUFFIX" } }); // Gift cards objectsToAdd.Add("giftCardObjects", new List<GiftCardObject> { new GiftCardObject { Id = $"{issuerId}.GIFT_CARD_OBJECT_SUFFIX", ClassId = $"{issuerId}.GIFT_CARD_CLASS_SUFFIX" } }); // Loyalty cards objectsToAdd.Add("loyaltyObjects", new List<LoyaltyObject> { new LoyaltyObject { Id = $"{issuerId}.LOYALTY_OBJECT_SUFFIX", ClassId = $"{issuerId}.LOYALTY_CLASS_SUFFIX" } }); // Offers objectsToAdd.Add("offerObjects", new List<OfferObject> { new OfferObject { Id = $"{issuerId}.OFFER_OBJECT_SUFFIX", ClassId = $"{issuerId}.OFFER_CLASS_SUFFIX" } }); // Transit passes objectsToAdd.Add("transitObjects", new List<TransitObject> { new TransitObject { Id = $"{issuerId}.TRANSIT_OBJECT_SUFFIX", ClassId = $"{issuerId}.TRANSIT_CLASS_SUFFIX" } }); // Create a JSON representation of the payload JObject serializedPayload = JObject.Parse( JsonConvert.SerializeObject(objectsToAdd, excludeNulls)); // Create the JWT as a JSON object JObject jwtPayload = JObject.Parse(JsonConvert.SerializeObject(new { iss = credentials.Id, aud = "google", origins = new string[] { "www.example.com" }, typ = "savetowallet", payload = serializedPayload })); // Deserialize into a JwtPayload JwtPayload claims = JwtPayload.Deserialize(jwtPayload.ToString()); // The service account credentials are used to sign the JWT RsaSecurityKey key = new RsaSecurityKey(credentials.Key); SigningCredentials signingCredentials = new SigningCredentials( key, SecurityAlgorithms.RsaSha256); JwtSecurityToken jwt = new JwtSecurityToken( new JwtHeader(signingCredentials), claims); string token = new JwtSecurityTokenHandler().WriteToken(jwt); Console.WriteLine("Add to Google Wallet link"); Console.WriteLine($"https://pay.google.com/gp/v/save/{token}"); return $"https://pay.google.com/gp/v/save/{token}"; }
Node.js
노드에서 통합을 시작하려면 전체 <ph type="x-smartling-placeholder"></ph> 코드 샘플을 확인하세요.
/** * Generate a signed JWT that references an existing pass object. * * When the user opens the "Add to Google Wallet" URL and saves the pass to * their wallet, the pass objects defined in the JWT are added to the * user's Google Wallet app. This allows the user to save multiple pass * objects in one API call. * * The objects to add must follow the below format: * * { * 'id': 'ISSUER_ID.OBJECT_SUFFIX', * 'classId': 'ISSUER_ID.CLASS_SUFFIX' * } * * @param {string} issuerId The issuer ID being used for this request. * * @returns {string} An "Add to Google Wallet" link. */ createJwtExistingObjects(issuerId) { // Multiple pass types can be added at the same time // At least one type must be specified in the JWT claims // Note: Make sure to replace the placeholder class and object suffixes let objectsToAdd = { // Event tickets 'eventTicketObjects': [{ 'id': `${issuerId}.EVENT_OBJECT_SUFFIX`, 'classId': `${issuerId}.EVENT_CLASS_SUFFIX` }], // Boarding passes 'flightObjects': [{ 'id': `${issuerId}.FLIGHT_OBJECT_SUFFIX`, 'classId': `${issuerId}.FLIGHT_CLASS_SUFFIX` }], // Generic passes 'genericObjects': [{ 'id': `${issuerId}.GENERIC_OBJECT_SUFFIX`, 'classId': `${issuerId}.GENERIC_CLASS_SUFFIX` }], // Gift cards 'giftCardObjects': [{ 'id': `${issuerId}.GIFT_CARD_OBJECT_SUFFIX`, 'classId': `${issuerId}.GIFT_CARD_CLASS_SUFFIX` }], // Loyalty cards 'loyaltyObjects': [{ 'id': `${issuerId}.LOYALTY_OBJECT_SUFFIX`, 'classId': `${issuerId}.LOYALTY_CLASS_SUFFIX` }], // Offers 'offerObjects': [{ 'id': `${issuerId}.OFFER_OBJECT_SUFFIX`, 'classId': `${issuerId}.OFFER_CLASS_SUFFIX` }], // Transit passes 'transitObjects': [{ 'id': `${issuerId}.TRANSIT_OBJECT_SUFFIX`, 'classId': `${issuerId}.TRANSIT_CLASS_SUFFIX` }] } // Create the JWT claims let claims = { iss: this.credentials.client_email, aud: 'google', origins: ['www.example.com'], typ: 'savetowallet', payload: objectsToAdd }; // The service account credentials are used to sign the JWT let token = jwt.sign(claims, this.credentials.private_key, { algorithm: 'RS256' }); console.log('Add to Google Wallet link'); console.log(`https://pay.google.com/gp/v/save/${token}`); return `https://pay.google.com/gp/v/save/${token}`; }
Go
Go에서 통합을 시작하려면 GitHub의 전체 코드 샘플을 참고하세요. <ph type="x-smartling-placeholder"></ph> 코드 샘플을 확인하세요.
// Generate a signed JWT that references an existing pass object. // When the user opens the "Add to Google Wallet" URL and saves the pass to // their wallet, the pass objects defined in the JWT are added to the // user's Google Wallet app. This allows the user to save multiple pass // objects in one API call. func (d *demoTransit) createJwtExistingObjects(issuerId string, classSuffix string, objectSuffix string) { var payload map[string]interface{} json.Unmarshal([]byte(fmt.Sprintf(` { "eventTicketObjects": [{ "id": "%s.EVENT_OBJECT_SUFFIX", "classId": "%s.EVENT_CLASS_SUFFIX" }], "flightObjects": [{ "id": "%s.FLIGHT_OBJECT_SUFFIX", "classId": "%s.FLIGHT_CLASS_SUFFIX" }], "genericObjects": [{ "id": "%s.GENERIC_OBJECT_SUFFIX", "classId": "%s.GENERIC_CLASS_SUFFIX" }], "giftCardObjects": [{ "id": "%s.GIFT_CARD_OBJECT_SUFFIX", "classId": "%s.GIFT_CARD_CLASS_SUFFIX" }], "loyaltyObjects": [{ "id": "%s.LOYALTY_OBJECT_SUFFIX", "classId": "%s.LOYALTY_CLASS_SUFFIX" }], "offerObjects": [{ "id": "%s.OFFER_OBJECT_SUFFIX", "classId": "%s.OFFER_CLASS_SUFFIX" }], "transitObjects": [{ "id": "%s.TRANSIT_OBJECT_SUFFIX", "classId": "%s.TRANSIT_CLASS_SUFFIX" }] } `, issuerId)), &payload) claims := jwt.MapClaims{ "iss": d.credentials.Email, "aud": "google", "origins": []string{"www.example.com"}, "typ": "savetowallet", "payload": payload, } // The service account credentials are used to sign the JWT key, _ := jwt.ParseRSAPrivateKeyFromPEM(d.credentials.PrivateKey) token, _ := jwt.NewWithClaims(jwt.SigningMethodRS256, claims).SignedString(key) fmt.Println("Add to Google Wallet link") fmt.Println("https://pay.google.com/gp/v/save/" + token) }