Фон
Функция защищенных приватных изображений позволяет определять изображения для пропусков, которые не обязательно должны быть доступны по общедоступному URL-адресу (что необходимо для корректного отображения обычных изображений на пропусках). Вы используете API Wallet для загрузки изображения и получаете идентификатор, который можно использовать для ссылки на это изображение в объекте пропуска Wallet.
Поддерживаются следующие типы пропусков;
- Билет на мероприятие
- Посадочный талон
- Проездной билет
- Карта предложений
- Подарочная карта
- абонемент лояльности
- Обычный пропуск
Пример функциональности
![]() |
| Членская карта с использованием защищенного личного изображения |
Варианты использования
Защищенные частные изображения позволяют использовать изображения, которые не обязательно должны быть общедоступными, и, следовательно, могут использоваться, например, в качестве фотографии профиля. Это открывает возможности для таких сценариев использования, как, например, следующие:
- Годовой абонемент
- Визитная карточка
- Проездной билет
Примечание: Защищенные личные изображения не предназначены для использования в качестве удостоверений личности, выданных государственными органами, а также в соответствии с дополнительными правилами, изложенными в политике допустимого использования.
Некоторые моменты, которые следует учитывать при использовании функции «Защищенные частные изображения».
- Не может использоваться с обычными частными пропусками.
- Может быть добавлен только для передачи объектов (не классов).
- Может использоваться только с одним объектом.
- Может использоваться только с
ImageModuleData(приватные изображения нельзя назначать другим полям изображений, таким какheroImage,logoилиwideLogo). - В пропусках, использующих защищенные приватные изображения в
ImageModuleData, по-прежнему можно одновременно отображать стандартные изображения заголовка и логотипа (размещенные по общедоступным URL-адресам). Добавление приватного изображения не ограничивает и не блокирует отображение стандартных изображений заголовка или логотипа в пропуске.
Функции находятся в разработке.
- Веб-поддержка
- Поддержка использования приватных изображений в поле
heroImage(использованиеprivateImageIdв качестве изображения для заголовка).
Этапы интеграции
- Загрузите своё личное изображение с помощью API Google Wallet, чтобы получить
privateImageId. - Добавьте изображение в объект pass (например,
ImageModuleData). Вместо установки поляsourceUriдля изображения, вы установите полеprivateImageIdзначением, полученным на предыдущем шаге.
Диаграмма последовательности
![]() |
| Защищенная частная последовательность изображений |
Пример кода
Загрузите изображение
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();
Используйте приватное изображение в объекте пароля.
// 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();
Обновите пароль, чтобы изображение отображалось на лицевой стороне.
Вы можете использовать защищенное приватное изображение в любом поле imageModulesDatafield. Ниже приведен пример использования поля imageModulesData для размещения изображения на лицевой стороне карточки с помощью переопределения шаблона. Вот пример вставки класса с переопределением шаблона:
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))));
}Обработка исключений
При неправильном использовании API Google Wallet могут возникать потенциальные ошибки, в том числе:
| Сообщение | Причина |
|---|---|
| Изображение не может одновременно содержать source_uri и private_image_id. | Эмитент попытался установить source_uri и private_image_id для одного изображения, что недопустимо. |
| Не удалось найти приватное изображение с идентификатором %s для эмитента %s. | Установка несуществующего приватного идентификатора изображения для объекта. |
| Не удалось добавить приватное изображение с идентификатором %s для эмитента %s к объекту %s, поскольку оно уже используется с объектом %s. Приватное изображение может использоваться только с одним объектом. | Попытка использовать одно и то же приватное изображение для нескольких объектов. Чтобы использовать одно и то же приватное изображение с несколькими объектами, его необходимо загрузить заново, и вы получите новый идентификатор приватного изображения, который можно использовать со вторым объектом. |

