Parcours de développement de cartes Google Wallet

L'API Google Wallet fournit un ensemble prédéfini de types de cartes optimisés pour des cas d'utilisation spécifiques, tels que des cartes cadeaux, des cartes d'embarquement, des billets pour des événements, etc. Il existe également un type de carte générique destiné aux cas d'utilisation où un type de carte spécifique n'est pas disponible.

Cet article vise à vous familiariser avec la procédure de base nécessaire pour créer et émettre une carte à l'aide de l'API Google Wallet. Il existe plusieurs façons d'effectuer certaines des étapes décrites ci-dessous, mais de manière générale, tous les types de cartes sont créés en suivant le même processus de développement de base.

Pour découvrir en détail comment créer une carte, consultez les guides pour le Web, les e-mails et les SMS ou les applications Android.

Utilisation

Une classe Cartes définit un ensemble de propriétés communes à plusieurs cartes, comme dans un modèle. Par exemple, si vous émettiez des billets pour un événement, la classe Cartes définirait des champs identiques pour tous les billets, tels que le nom, la date et l'heure de l'événement.

Chaque carte que vous émettez doit faire référence à une classe de carte. Vous devez également attribuer un identifiant unique à chaque classe de carte que vous créez. Il servira à y faire référence lors de la création de cartes.

Procédure

Une classe Cartes est définie au format JSON et peut être créée avec l'API REST Google Wallet, le SDK Android ou la Business Console de Google Wallet.

Afficher un exemple de classe de carte

{
  "id": "ISSUER_ID.EVENT_CLASS_ID",
  "issuerName": "[TEST ONLY] Heraldic Event",
  "localizedIssuerName": {
    "defaultValue": {
      "language": "en-US",
      "value": "[TEST ONLY] Heraldic Event"
    }
  },
  "logo": {
    "sourceUri": {
      "uri": "https://images.unsplash.com/photo-1475721027785-f74eccf877e2?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=660&h=660"
    },
    "contentDescription": {
      "defaultValue": {
        "language": "en-US",
        "value": "LOGO_IMAGE_DESCRIPTION"
      }
    }
  },
  "eventName": {
    "defaultValue": {
      "language": "en-US",
      "value": "Google Live"
    }
  },
  "venue": {
    "name": {
      "defaultValue": {
        "language": "en-US",
        "value": "Shoreline Amphitheater"
      }
    },
    "address": {
      "defaultValue": {
        "language": "en-US",
        "value": "ADDRESS_OF_THE_VENUE"
      }
    }
  },
  "dateTime": {
    "start": "2023-04-12T11:30"
  },
  "reviewStatus": "UNDER_REVIEW",
  "hexBackgroundColor": "#264750",
  "heroImage": {
    "sourceUri": {
      "uri": "https://images.unsplash.com/photo-1501281668745-f7f57925c3b4?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1032&h=336"
    },
    "contentDescription": {
      "defaultValue": {
        "language": "en-US",
        "value": "HERO_IMAGE_DESCRIPTION"
      }
    }
  }
}
    

Utilisation

Un objet Cartes définit les propriétés d'une carte unique qui sera délivrée à un utilisateur spécifique. Par exemple, l'objet Cartes d'un billet pour un événement définit des champs propres à un billet spécifique, tels que son numéro de siège ou son code QR.

Lorsqu'un objet Cartes est créé, l'API Google Wallet stocke une nouvelle carte et l'associe à votre compte d'émetteur. Cette carte stockée combine les propriétés uniques de l'objet Cartes et les propriétés de modèle de la classe Cartes associée.

Vous devez également attribuer à chaque objet Cartes un identifiant unique qui sera utilisé pour le référencer lors de l'émission d'une carte.

Procédure

Un objet Cartes est au format JSON défini. Vous pouvez le créer avec l'API REST Google Wallet ou le SDK Android.

Afficher l'exemple d'objet Cartes

{
  "id": "ISSUER_ID.OBJECT_ID",
  "classId": "ISSUER_ID.EVENT_CLASS_ID",
  "state": "ACTIVE",
  "seatInfo": {
    "seat": {
      "defaultValue": {
        "language": "en-us",
        "value": "5"
      }
    },
    "row": {
      "defaultValue": {
        "language": "en-us",
        "value": "G"
      }
    },
    "section": {
      "defaultValue": {
        "language": "en-us",
        "value": "40"
      }
    },
    "gate": {
      "defaultValue": {
        "language": "en-us",
        "value": "3A"
      }
    }
  },
  "barcode": {
    "type": "QR_CODE",
    "value": "BARCODE_VALUE",
    "alternateText": ""
  }
}
    

Utilisation

Pour émettre une carte à un utilisateur, une classe Cartes et un objet Cartes doivent être encodés dans un jeton Web JSON (JWT). Le format JWT est une norme ouverte et courante permettant de représenter les revendications entre deux parties. Dans le cas de l'émission de cartes avec l'API Google Wallet, les jetons JWT permettent d'envoyer une déclaration selon laquelle l'utilisateur a le droit d'accéder à une carte spécifique associée à votre compte d'émetteur.

Lorsqu'un jeton JWT est envoyé à l'API Google Wallet, les données encodées sont utilisées pour identifier une carte spécifique et la transmettre à l'utilisateur. Si la carte a déjà été émise, ces données permettent également à l'API Google Wallet d'identifier la carte en double afin qu'elle ne soit pas ajoutée plusieurs fois au compte Google Wallet de l'utilisateur.

Procédure

Les jetons JWT sont définis au format JSON en fonction de la spécification JWT. Pour définir un jeton JWT afin d'émettre une carte avec l'API Google Wallet, vous devez fournir les informations sur la carte que vous souhaitez émettre dans la propriété payload du jeton JWT.

Afficher l'exemple de jeton JWT

{
  "iss": "issuer@example.com",
  "aud": "google",
  "typ": "savetowallet",
  "iat": 1696877738,
  "origins": [
    "www.example.com"
  ],
  "payload": {
    "eventTicketObjects": [
      {
        "id": "ISSUER_ID.LOYALTY_OBJECT_SUFFIX"
      }
    ]
  }
}
    

Utilisation

Tous les jetons JWT envoyés à l'API Google Wallet pour émettre une carte doivent être signés avec les identifiants que vous avez précédemment fournis dans la Business Console de Google Wallet. La signature utilise vos identifiants pour chiffrer le jeton JWT afin de sécuriser vos cartes, et pour permettre à l'API Google Wallet de s'authentifier que les informations de carte encodées sont valides et associées à votre compte d'émetteur.

Procédure

Les bibliothèques clientes Google Wallet et le SDK Android offrent des méthodes pratiques pour signer vos jetons JWT. De nombreuses bibliothèques Open Source sont également disponibles pour gérer la complexité de la signature de code.

Pour ceux qui utilisent l'API REST Google Wallet pour émettre des cartes, le JWT est signé avec une clé de compte de service Google Cloud. Si vous utilisez le SDK Google Wallet pour Android, le SDK gère automatiquement la signature du jeton JWT avec l'empreinte SHA-1 de votre certificat de signature d'application.

Pour protéger vos identifiants, les jetons JWT ne doivent être signés que sur votre serveur ou à l'aide du SDK Google Wallet pour Android dans votre application.

Afficher l'exemple de signature de code

Java

  // Create the JWT as a HashMap object
  HashMap claims = new HashMap();
  claims.put("iss", ((ServiceAccountCredentials) credentials).getClientEmail());
  claims.put("aud", "google");
  claims.put("origins", Arrays.asList("www.example.com"));
  claims.put("typ", "savetowallet");

  // Create the Google Wallet payload and add to the JWT
  HashMap payload = new HashMap();
  payload.put("eventTicketObjects", Arrays.asList(newObject));
  claims.put("payload", payload);

  // Google Cloud 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);
        

Node.JS

  // Create the JWT claims
  let claims = {
    iss: this.credentials.client_email,
    aud: 'google',
    origins: ['www.example.com'],
    typ: 'savetowallet',
    payload: {
      eventTicketObjects: [newObject]
    },
  };

  // The service account credentials are used to sign the JWT
  let token = jwt.sign(claims, this.credentials.private_key, { algorithm: 'RS256' });
        

Python

  # Create the JWT claims
  claims = {
      'iss': self.credentials.service_account_email,
      'aud': 'google',
      'origins': ['www.example.com'],
      'typ': 'savetowallet',
      'payload': {
          # The listed classes and objects will be created
          'eventTicketObjects': [new_object]
      }
  }

  # 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')
        

Utilisation

Une fois que vous avez créé un jeton JWT signé, vous pouvez envoyer votre carte à un utilisateur Google Wallet. Pour cela, le bouton "Ajouter à Google Wallet" est présenté à l'utilisateur. bouton ou lien. Lorsqu'un utilisateur clique sur le bouton ou le lien hypertexte, le jeton JWT signé est envoyé à l'API Google Wallet, qui le déchiffre à l'aide de vos identifiants enregistrés. Une fois la signature JWT authentifiée, la carte est envoyée à l'utilisateur pour l'enregistrer dans son compte Google Wallet.

Procédure

Créer un compte "Ajouter à Google Wallet" pour une application Android, utilisez le SDK Google Wallet pour Android, qui fournit des méthodes pour générer le bouton. Pour toutes les autres plates-formes, y compris le Web, les e-mails et les messages, créez un lien hypertexte au format https://pay.google.com/gp/v/save/<signed_jwt>. Dans la mesure du possible, il est préférable de fournir ce lien à l'utilisateur sous la forme d'un lien "Ajouter à Google Wallet". .

En savoir plus sur l'utilisation de l'option "Ajouter à Google Wallet" , consultez les Consignes relatives à la marque de l'API Google Wallet

Afficher l'exemple de code

  https://pay.google.com/gp/v/save/<signed_jwt>
        

SDK Android

  private lateinit var walletClient: PayClient
  private val addToGoogleWalletRequestCode = 1000
  private lateinit var addToGoogleWalletButton: View

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    walletClient = Pay.getClient(this)
    addToGoogleWalletButton.setOnClickListener {
      walletClient.savePasses(newObjectJson, this, addToGoogleWalletRequestCode)
    }
  }
        

Une fois que l'utilisateur a enregistré la carte émise, celle-ci s'affiche dans l'application Google Wallet avec toutes les autres cartes qu'il a enregistrées.

Créer des objets de carte et des classes de cartes dans le JWT

Les classes et les objets Cartes peuvent être créés à l'avance à l'aide de l'API REST Google Wallet ou du SDK Android. Une fois créés, ils sont utilisés pour émettre des cartes en référençant leur pièce d'identité.

Vous pouvez également créer des classes et des objets Cartes "juste à temps" en intégrant leur JSON directement dans le JWT utilisé pour émettre la carte pour un utilisateur. Avec cette méthode, les classes de cartes et les objets Cartes sont créés par l'API Google Wallet lorsque le jeton JWT signé est envoyé à l'aide d'un bouton "Ajouter à Google Wallet". bouton ou lien.

L'exemple suivant montre un jeton JWT avec une nouvelle classe Cartes et un objet Cartes définis à l'aide des propriétés payload.eventTicketClasses et payload.eventTicketObjects. Notez que ces propriétés sont des tableaux et peuvent donc accepter une ou plusieurs classes ou objets Cartes. Vous pouvez également spécifier simplement un nouvel objet Cartes dans le JWT qui fait référence à une classe de carte existante par son ID.

Afficher l'exemple de jeton JWT

  {
    "iss": "issuer@example.com",
    "aud": "google",
    "typ": "savetowallet",
    "iat": 1696877738,
    "origins": [
      "www.example.com"
    ],
    "payload": {
      "eventTicketClasses": [{
        "id": "ISSUER_ID.EVENT_CLASS_ID",
        "issuerName": "[TEST ONLY] Heraldic Event",
        "localizedIssuerName": {
          "defaultValue": {
            "language": "en-US",
            "value": "[TEST ONLY] Heraldic Event"
          }
        },
        "logo": {
          "sourceUri": {
            "uri": "https://images.unsplash.com/photo-1475721027785-f74eccf877e2?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=660&h=660"
          },
          "contentDescription": {
            "defaultValue": {
              "language": "en-US",
              "value": "LOGO_IMAGE_DESCRIPTION"
            }
          }
        },
        "eventName": {
          "defaultValue": {
            "language": "en-US",
            "value": "Google Live"
          }
        },
        "venue": {
          "name": {
            "defaultValue": {
              "language": "en-US",
              "value": "Shoreline Amphitheater"
            }
          },
          "address": {
            "defaultValue": {
              "language": "en-US",
              "value": "ADDRESS_OF_THE_VENUE"
            }
          }
        },
        "dateTime": {
          "start": "2023-04-12T11:30"
        },
        "reviewStatus": "UNDER_REVIEW",
        "hexBackgroundColor": "#264750",
        "heroImage": {
          "sourceUri": {
            "uri": "https://images.unsplash.com/photo-1501281668745-f7f57925c3b4?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1032&h=336"
          },
          "contentDescription": {
            "defaultValue": {
              "language": "en-US",
              "value": "HERO_IMAGE_DESCRIPTION"
            }
          }
        }
      }],
      "eventTicketObjects": [{
        "id": "ISSUER_ID.OBJECT_ID",
        "classId": "ISSUER_ID.EVENT_CLASS_ID",
        "state": "ACTIVE",
        "seatInfo": {
          "seat": {
            "defaultValue": {
              "language": "en-us",
              "value": "5"
            }
          },
          "row": {
            "defaultValue": {
              "language": "en-us",
              "value": "G"
            }
          },
          "section": {
            "defaultValue": {
              "language": "en-us",
              "value": "40"
            }
          },
          "gate": {
            "defaultValue": {
              "language": "en-us",
              "value": "3A"
            }
          }
        },
        "barcode": {
          "type": "QR_CODE",
          "value": "BARCODE_VALUE",
          "alternateText": ""
        }
      }]
    }
  }