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

