Безопасные приватные изображения

Фон

Функция защищенных приватных изображений позволяет определять изображения для пропусков, которые не обязательно должны быть доступны по общедоступному URL-адресу (что необходимо для корректного отображения обычных изображений на пропусках). Вы используете API Wallet для загрузки изображения и получаете идентификатор, который можно использовать для ссылки на это изображение в объекте пропуска Wallet.

Поддерживаются следующие типы пропусков;

  • Билет на мероприятие
  • Посадочный талон
  • Проездной билет
  • Карта предложений
  • Подарочная карта
  • абонемент лояльности
  • Обычный пропуск

Пример функциональности

Пример защищенного личного изображения
Членская карта с использованием защищенного личного изображения

Варианты использования

Защищенные частные изображения позволяют использовать изображения, которые не обязательно должны быть общедоступными, и, следовательно, могут использоваться, например, в качестве фотографии профиля. Это открывает возможности для таких сценариев использования, как, например, следующие:

  • Годовой абонемент
  • Визитная карточка
  • Проездной билет

Примечание: Защищенные личные изображения не предназначены для использования в качестве удостоверений личности, выданных государственными органами, а также в соответствии с дополнительными правилами, изложенными в политике допустимого использования.

Некоторые моменты, которые следует учитывать при использовании функции «Защищенные частные изображения».

  • Не может использоваться с обычными частными пропусками.
  • Может быть добавлен только для передачи объектов (не классов).
  • Может использоваться только с одним объектом.
  • Может использоваться только с ImageModuleData (приватные изображения нельзя назначать другим полям изображений, таким как heroImage , logo или wideLogo ).
  • В пропусках, использующих защищенные приватные изображения в ImageModuleData , по-прежнему можно одновременно отображать стандартные изображения заголовка и логотипа (размещенные по общедоступным URL-адресам). Добавление приватного изображения не ограничивает и не блокирует отображение стандартных изображений заголовка или логотипа в пропуске.

Функции находятся в разработке.

  • Веб-поддержка
  • Поддержка использования приватных изображений в поле heroImage (использование privateImageId в качестве изображения для заголовка).

Этапы интеграции

  1. Загрузите своё личное изображение с помощью API Google Wallet, чтобы получить privateImageId .
  2. Добавьте изображение в объект 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. Приватное изображение может использоваться только с одним объектом. Попытка использовать одно и то же приватное изображение для нескольких объектов. Чтобы использовать одно и то же приватное изображение с несколькими объектами, его необходимо загрузить заново, и вы получите новый идентификатор приватного изображения, который можно использовать со вторым объектом.