Защита личных изображений

Фон

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

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

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

Пример функции

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

Примеры использования

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

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

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

Что нужно учитывать при использовании защищенных частных изображений

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

Функции в разработке

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

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

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