Sécuriser les images privées

Arrière-plan

La fonctionnalité d'images privées sécurisées vous permet de définir des images sur les cartes qui n'ont pas besoin d'être accessibles à partir d'une URL publique (une exigence pour que les images normales s'affichent correctement sur les cartes). Vous utilisez l'API Wallet pour importer une image et recevoir un identifiant permettant de faire référence à cette image sur un objet de carte Wallet.

Les types de pass suivants sont acceptés :

  • Billet pour un événement
  • Carte d'embarquement
  • Titre de transport
  • Carte d'offre
  • Carte
  • Pass fidélité
  • Carte générique

Exemple de fonctionnalité

Exemple d'image privée sécurisée
Carte de membre utilisant une image privée sécurisée

Cas d'utilisation

Les images privées sécurisées permettent d'utiliser des images qui n'ont pas besoin d'être accessibles au public et qui peuvent donc être utilisées pour des éléments tels qu'une photo du profil. Cela permet des cas d'utilisation tels que les suivants :

  • Pass annuel
  • Carte de visite
  • Titre de transport

Remarque : Les images privées sécurisées ne sont pas destinées à représenter des pass comme des pièces d'identité officielles, conformément aux consignes supplémentaires définies dans le Règlement sur l'utilisation autorisée.

Éléments à prendre en compte lors de l'utilisation d'images privées sécurisées

  • Ne peut pas être utilisé avec des cartes privées génériques
  • Ne peut être ajouté qu'à des objets de pass (pas à des classes)
  • Ne peut être utilisé qu'avec un seul objet
  • Ne peut être utilisé qu'avec ImageModuleData (les images privées ne peuvent pas être attribuées à d'autres champs d'image, tels que heroImage, logo ou wideLogo)
  • Les pass utilisant des images privées sécurisées dans ImageModuleData peuvent toujours afficher simultanément des images de logo et de bannière standards (hébergées sur des URL accessibles publiquement). L'ajout d'une image privée n'empêche pas l'affichage d'images de bannière ou de logo standards sur la carte.

Fonctionnalités en cours de développement

  • Assistance Web
  • Compatibilité avec les images privées dans le champ heroImage (utilisation d'un privateImageId comme image principale)

Procédure d'intégration

  1. Importez votre image privée à l'aide de l'API Google Wallet pour recevoir un privateImageId.
  2. Ajoutez une image à l'objet pass (par exemple, ImageModuleData). Au lieu de définir le champ sourceUri sur l'image, vous définissez le champ privateImageId avec la valeur obtenue à l'étape précédente.

Diagramme de séquence

Diagramme de séquence d'image sécurisée
Sécuriser une séquence d'images privées

Exemple de code

Importez l'image.

String issuerId = "12345";
String keyFilePath = "/path/to/key.json";
GoogleCredential credential =
    GoogleCredential.fromStream(new FileInputStream(keyFilePath))
        .createScoped(Arrays.asList("https://www.googleapis.com/auth/wallet_object.issuer"));
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();

// Prepare request to upload image
String contentType = "image/jpeg";  // MIME type of image
String imageFilePath = "/path/to/image.jpg";
HttpContent content =
    new ByteArrayContent(
        contentType, ByteStreams.toByteArray(new FileInputStream(imageFilePath)));

String url =
    String.format(
        "https://walletobjects.googleapis.com/upload/walletobjects/v1/privateContent/%s/uploadPrivateImage",
        issuerId);

// Make request to upload image
HttpResponse response =
    httpTransport
        .createRequestFactory(credential)
        .buildPostRequest(new GenericUrl(url), content)
        .execute();

// Get privateImageId from response
Gson gson = new Gson();
JsonObject jsonObject = gson.fromJson(response.parseAsString(), JsonObject.class);
String privateImageId = jsonObject.get("privateImageId").getAsString();

Utiliser l'image privée sur l'objet pass

// Build GenericObject with privateImageId in ImageModuleData (also adding an optional TextModuleData)
Image image = new Image().setPrivateImageId(privateImageId);
ImageModuleData imageModuleData = new ImageModuleData().setId("imageId").setMainImage(image);
TextModuleData textModuleData =
    new TextModuleData().setId("textId").setHeader("Card holder").setBody("John Doe");
GenericObject genericObject =
    new GenericObject()
        .setId(issuerId + ".objectId")
        // class must be inserted before inserting object
        .setClassId(issuerId + ".classId")
        .setCardTitle("Business name")
        .setHeader("My membership card")
        .setImageModulesData(Arrays.asList(imageModuleData))
        .setTextModulesData(Arrays.asList(textModuleData));

// Insert GenericObject (or can use in JWT without inserting ahead of time)
Walletobjects service =
    new Walletobjects.Builder(httpTransport, GsonFactory.getDefaultInstance(), credential)
        .setApplicationName("My Application")
        .build();

service.genericobject().insert(genericObject).execute();

Mettre à jour la carte pour afficher l'image au recto

Vous pouvez utiliser l'image privée sécurisée sur n'importe quel champ imageModulesData. Voici un exemple d'utilisation d'un champ imageModulesData pour positionner l'image au recto de la carte à l'aide d'un remplacement de modèle. Voici un exemple d'insertion d'une classe avec un remplacement de modèle :

CardTemplateOverride cardTemplateOverride =
    new CardTemplateOverride()
        .setCardRowTemplateInfos(
            Arrays.asList(
                new CardRowTemplateInfo()
                    .setTwoItems(
                        new CardRowTwoItems()
                            // The ids chosen here must be set on the object's TextModuleData and ImageModuleData
                            .setStartItem(
                                createTemplateItem("object.textModulesData['textId']"))
                            .setEndItem(
                                createTemplateItem("object.imageModulesData['imageId']")))));
GenericClass genericClass =
    new GenericClass()
        .setId(issuerId + ".classId")
        .setClassTemplateInfo(
            new ClassTemplateInfo().setCardTemplateOverride(cardTemplateOverride));

service.genericclass().insert(genericClass);


...


private static TemplateItem createTemplateItem(String fieldPath) {
  return new TemplateItem()
      .setFirstValue(
          new FieldSelector()
              .setFields(Arrays.asList(new FieldReference().setFieldPath(fieldPath))));
}

Gestion des exceptions

Des erreurs potentielles peuvent se produire en cas d'utilisation incorrecte de l'API Google Wallet. En voici quelques exemples :

Message Motif
L'image ne peut pas avoir à la fois source_uri et private_image_id L'émetteur a essayé de définir un source_uri et un private_image_id sur une seule image, ce qui n'est pas autorisé.
Impossible de trouver l'image privée avec l'ID %s pour l'émetteur %s Définir un ID d'image privée inexistant sur un objet
Impossible d'ajouter l'image privée avec l'ID %s pour l'émetteur %s à l'objet %s, car elle est déjà utilisée avec l'objet %s. Une image privée ne peut être utilisée qu'avec un seul objet. Vous essayez d'utiliser la même image privée sur plusieurs objets. Pour utiliser la même image privée avec plusieurs objets, vous devez la réimporter. Vous obtiendrez alors un nouvel ID d'image privée, qui pourra être utilisé avec le deuxième objet.