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
|
| 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
- Prześlij prywatny obraz za pomocą Google Wallet API, aby otrzymać
privateImageId. - Dodaj obraz do obiektu karty (np.
ImageModuleData). Zamiast ustawiać polesourceUriw obrazie, ustaw poleprivateImageIdz wartością uzyskaną w poprzednim kroku.
Schemat sekwencji
|
| 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. |