Zabezpieczanie obrazów prywatnych

Tło

Funkcja bezpiecznych prywatnych obrazów 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ć obrazy i otrzymywać identyfikator, który umożliwia odwoływanie 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ą korzystanie z obrazów, które nie muszą być publicznie dostępne, a więc mogą być używane np. jako zdjęcie profilowe. Umożliwia to m.in. te zastosowania:

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

Uwaga: bezpieczne obrazy prywatne nie są przeznaczone do reprezentowania dokumentów tożsamości wydanych przez organ administracji państwowej. Obowiązują dodatkowe wytyczne określone w zasadach dopuszczalnego użytkowania.

Kwestie, które warto wziąć pod uwagę podczas korzystania z bezpiecznych obrazów prywatnych

  • 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 polem ImageModuleData (obrazów prywatnych nie można przypisywać do innych pól obrazów, takich jak heroImage, logo czy wideLogo).
  • Karty korzystające z bezpiecznych prywatnych obrazów w ImageModuleData mogą nadal wyświetlać jednocześnie standardowe obrazy główne i logo (hostowane pod publicznie dostępnymi adresami URL). Dodanie prywatnego obrazu nie ogranicza ani nie blokuje wyświetlania standardowych obrazów logo lub obrazów w nagłówku na karcie.

Funkcje w trakcie opracowywania

  • Pomoc internetowa
  • Obsługa prywatnych obrazów w polu heroImage (z użyciem privateImageId jako baneru powitalnego)

Kroki integracji

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

Schemat sekwencji

Schemat sekwencji bezpiecznego obrazu
Zabezpieczanie prywatnej sekwencji 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 dokumentu

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

Aktualizacja karty, 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

Nieprawidłowe użycie Google Wallet API może powodować potencjalne 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 w przypadku jednego obrazu, 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.