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

Фон

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

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

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

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

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

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

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

  • Годовой абонемент
  • Визитная карточка
  • Транзитный проездной

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

Некоторые соображения по использованию функции кошелька

  • Нельзя использовать с общими частными пропусками.
  • Можно добавлять только объекты для передачи (не классы).
  • Может использоваться только с одним объектом.
  • Можно использовать только с ImageModuleData (не с другими изображениями, например, логотипом и широким заголовком)

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

  • Веб-поддержка
  • Частные изображения на главных изображениях

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

  1. Загрузите свое личное изображение с помощью API Google Wallet, чтобы получить 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))));
}

Обработка исключений

При неправильном использовании Wallet FeatureAPI могут возникнуть потенциальные ошибки, в том числе:

Сообщение Причина
Изображение не может иметь одновременно source_uri и private_image_id Эмитент попытался установить source_uri и private_image_id для одного изображения, что не разрешено.
Не удалось найти приватное изображение с идентификатором %s для эмитента %s Установка несуществующего частного идентификатора изображения для объекта
Не удалось добавить приватное изображение с идентификатором %s для эмитента %s к объекту %s, так как оно уже используется с объектом %s. Приватное изображение можно использовать только с одним объектом. Попытка использовать одно и то же приватное изображение для нескольких объектов. Чтобы использовать одно и то же приватное изображение для нескольких объектов, его необходимо загрузить повторно. После этого вы получите новый идентификатор приватного изображения, который можно использовать для второго объекта.