Zabezpieczanie obrazów prywatnych

Tło

Funkcja bezpiecznych obrazów prywatnych umożliwia określanie obrazów na kartach, które nie muszą być dostępne pod publicznym adresem URL (jest to wymagane w przypadku zwykłych obrazów, aby można je było prawidłowo renderować na kartach). Za pomocą interfejsu Wallet API możesz przesyłać obraz i otrzymywać identyfikator, który można wykorzystać do odwoływania się do tego obrazu w obiekcie karty w Portfelu.

Obsługiwane są te typy kart:

  • Bilet na wydarzenie
  • Karta pokładowa
  • Bilet
  • Karta oferty
  • Karta upominkowa
  • Karta lojalnościowa
  • Standardowa karta

Przykład funkcji

Przykład bezpiecznego obrazu prywatnego
Karta członkowska z bezpiecznym prywatnym obrazem

Przypadki użycia

Bezpieczne obrazy prywatne umożliwiają używanie obrazów, które nie muszą być publicznie dostępne, a więc mogą być wykorzystywane np. jako zdjęcie profilowe. Umożliwia to zastosowania takie jak m.in.:

  • Roczna karta członkowska
  • Wizytówka
  • Bilet na przejazd

Uwaga: bezpieczne prywatne obrazy nie są przeznaczone do przedstawiania dokumentów tożsamości wydanych przez organ państwowy ani do stosowania w innych przypadkach opisanych w zasadach dopuszczalnego użytkowania.

O czym warto pamiętać podczas korzystania z funkcji Portfela

  • Nie można używać z ogólnymi dokumentami prywatnymi
  • Można je dodawać tylko do obiektów kart (nie do klas).
  • Można jej używać tylko z jednym obiektem.
  • Można go używać tylko z elementem ImageModuleData (nie z innymi obrazami, np.logo i logo w nagłówku o dużej szerokości).

Funkcje w trakcie opracowywania

  • Pomoc internetowa
  • Obrazy prywatne na banerach powitalnych

Kroki integracji

  1. Prześlij prywatny obraz za pomocą Google Wallet API, aby otrzymaćprivateImageId.
  2. Dodaj obraz do obiektu karty (np. ImageModuleData). Zamiast ustawiać pole sourceUri w obrazie, ustaw pole privateImageId z wartością uzyskaną w poprzednim kroku.

Schemat sekwencji

Schemat sekwencji bezpiecznego obrazu
Zabezpieczona prywatna sekwencja obrazów

Przykładowy kod

Prześlij obraz

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();

Używanie obrazu prywatnego w obiekcie karty

// 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();

Zaktualizuj kartę, aby wyświetlać obraz na przedniej stronie

Bezpiecznego prywatnego obrazu możesz używać w dowolnym polu imageModulesData. Poniżej znajdziesz przykład użycia pola imageModulesData do umieszczenia obrazu na przedniej stronie karty za pomocą zastąpienia szablonu. Oto przykład wstawiania klasy z zastąpieniem szablonu:

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))));
}

Obsługa wyjątków

W przypadku nieprawidłowego użycia interfejsu Wallet FeatureAPI mogą wystąpić błędy, w tym:

Wiadomość Uzasadnienie
Obraz nie może mieć jednocześnie atrybutów source_uri i private_image_id Wydawca próbował ustawić source_uri i private_image_id na jednym obrazie, co jest niedozwolone.
Nie udało się znaleźć obrazu prywatnego o identyfikatorze %s dla wydawcy %s Ustawianie nieistniejącego identyfikatora obrazu prywatnego na obiekcie
Nie udało się dodać prywatnego obrazu o identyfikatorze %s dla wydawcy %s do obiektu %s, ponieważ jest on już używany w obiekcie %s. Obrazu prywatnego można używać tylko z jednym obiektem. Próba użycia tego samego prywatnego obrazu w więcej niż jednym obiekcie. Aby użyć tego samego obrazu prywatnego w przypadku więcej niż 1 obiektu, musisz go przesłać ponownie. Otrzymasz nowy identyfikator obrazu prywatnego, którego możesz użyć w przypadku drugiego obiektu.