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