Документация по Google Pay API for Passes для сетевых ресурсов

С помощью инструмента Google Pay API for Passes пользователи могут сохранять карты и другие объекты в приложение Google Pay напрямую с вашего сайта.

Ниже мы расскажем об элементе HTML g:savetoandroidpay, с помощью которого можно отобразить кнопку Google Pay API for Passes, а также о веб-токене JSON, содержащем информацию о вашем веб-сервисе.

Google Pay API for Passes для JavaScript

Чтобы активировать автоматический анализ HTML-тегов g:savetoandroidpay при загрузке, добавьте на страницу стандартный JavaScript.

<script src="https://apis.google.com/js/platform.js" type="text/javascript"></script>

Для приложений AJAX и пользовательского рендеринга кнопок Google Pay API for Passes добавьте параметр "parsetags": "explicit".

<script src="https://apis.google.com/js/platform.js" type="text/javascript">
  {"parsetags": "explicit"}
</script>

HTML-тег g:savetoandroidpay

Тег пространства имен g:savetoandroidpay определяет место размещения и разные атрибуты кнопки "Сохранить в Google Pay". Если вы обрабатываете HTML и JWT на сервере, воспользуйтесь этим тегом:

<g:savetoandroidpay jwt="JWT" onsuccess="successHandler" onfailure="failureHandler" />
Поле Тип Обязательное поле Описание
height Строка Нет Высота отображаемой кнопки. Возможные значения: small (30 пикс.) и standard (38 пикс.). Значение height по умолчанию: small. Посмотреть примеры кнопки с различными значениями height можно здесь.
jwt Строка Да JWT для Google Pay API for Passes.
onsuccess Строка Нет Название строки для функции успешного обратного вызова при сохранении.
onfailure Строка Нет Название строки для функции неудачного обратного вызова при сохранении. Эта функция принимает объект ошибки с errorCode и errorMessage.
onprovidejwt Строка Нет Название строки для функции создания обработчика JWT. Эта функция нужна, чтобы перехватывать и, возможно, изменять данные в JWT перед сохранением объекта в Google Pay. Функция не принимает параметры и должна возвращать JWT в виде строки. При внедрении обработчика событий исходные данные JWT можно получить в поле this.getOpenParams().renderData.userParams.jwt.
size Строка Нет Ширина отображаемой кнопки. Вы можете выбрать значение matchparent для size, чтобы ширина этого и родительского элементов совпадала. Параметр size можно не изменять. В этом случае ширина элемента будет выставлена согласно настройкам text. Посмотреть примеры кнопки с различными значениями size можно здесь.
text Строка Нет Неиспользуемое поле.
textsize Строка Нет При настройке textsize=large размер текста и кнопки значительно увеличивается, что может пригодиться на мобильных устройствах или в случае особенных требований к пользовательскому интерфейсу.
theme Строка Нет Тема отображаемой кнопки. Допустимые значения: dark и light. Значение по умолчанию: dark. Посмотреть примеры кнопки с различными значениями theme можно здесь.

JWT для Google Pay API for Passes

JWT для Google Pay API for Passes определяет, какие объекты и классы можно сохранять.

Протокол

{
  "iss": "example_service_account@developer.gserviceaccount.com",
  "aud": "google",
  "typ": "savetoandroidpay",
  "iat": 1368029586,
  "payload": {
    "eventTicketClasses": [{
      ... //Event ticket Class JSON
    }],
    "eventTicketObjects": [{
      ... //Event ticket Object JSON
    }],
    "flightClasses": [{
      ... //Flight Class JSON
    }],
    "flightObjects": [{
      ... //Flight Object JSON
    }],
    "giftCardClasses": [{
      ... //Gift card Class JSON
    }],
    "giftCardObjects": [{
      ... //Gift card Object JSON
    }],
    "loyaltyClasses": [{
      ... //Loyalty Class JSON
    }],
    "loyaltyObjects": [{
      ... //Loyalty Object JSON
    }],
    "offerClasses": [{
      ... //Offer Class JSON
    }],
    "offerObjects": [{
      ... //Offer Object JSON
    }],
    "transitClasses": [{
      ... //Transit Class JSON
    }],
    "transitObjects": [{
      ... //Transit Object JSON
    }]
  },
  "origins": ["http://baconrista.com", "https://baconrista.com"]
}

Java

WobCredentials credentials = null;
WobUtils utils = null;

// Instantiate the WobUtils class which contains handy functions
// Wob utils can be found in the quickstart sample
try {
  credentials = new WobCredentials(
    ServiceAccountEmailAddress,
    ServiceAccountPrivateKeyPath,
    ApplicationName,
    IssuerId);
  utils = new WobUtils(credentials);
} catch (GeneralSecurityException e) {
  e.printStackTrace();
} catch (IOException e) {
  e.printStackTrace();
}

// Add valid domains for the Save to Wallet button
List<String> origins = new ArrayList<String>();
origins.add("http://baconrista.com");
origins.add("https://baconrista.com");
origins.add(req.getScheme() + "://" + req.getServerName() + ":" + req.getLocalPort());

//Generate Objects and Classes here
//........

WobPayload payload = new WobPayload();
payload.addObject({WalletObject/WalletClass});

// Convert the object into a Save to Android Pay Jwt
String jwt = null;
try {
  jwt = utils.generateSaveJwt(payload, origins);
} catch (SignatureException e) {
  e.printStackTrace();
}

PHP

$requestBody = [
  "iss"=> SERVICE_ACCOUNT_EMAIL_ADDRESS,
  "aud" => "google",
  "typ" => "savetoandroidpay",
  "iat"=> time(),
  "payload" => {
    "eventTicketClasses" => [ ], # Event ticket classes
    "eventTicketObjects" => [ ], # Event ticket objects
    "flightClasses" => [ ],      # Flight classes
    "flightObjects" => [ ],      # Flight objects
    "giftCardClasses" => [ ],    # Gift card classes
    "giftCardObjects" => [ ],    # Gift card objects
    "loyaltyClasses" => [ ],     # Loyalty classes
    "loyaltyObjects" => [ ],     # Loyalty objects
    "offerClasses" => [ ],       # Offer classes
    "offerObjects" => [ ],       # Offer objects
    "transitClasses" => [ ],     # Transit classes
    "transitObjects" => [ ]      # Transit objects
  },
  "origins" => ["http://baconrista.com", "https://baconrista.com"]
]
// Generate the Save to Android Pay Jwt
echo $jwt = $assertObj->makeSignedJwt($requestBody, $client);

Python

jwt = {
  'iss': config.SERVICE_ACCOUNT_EMAIL_ADDRESS,
  'aud': 'google',
  'typ': 'savetoandroidpay',
  'iat':  int(time.time()),
  'payload': {
    'webserviceResponse': {
      'result': 'approved',
      'message': 'Success.'
    },
    'eventTicketClasses': [], # Event ticket classes
    'eventTicketObjects': [], # Event ticket objects
    'flightClasses': [],      # Flight classes
    'flightObjects': [],      # Flight objects
    'giftCardClasses': [],    # Gift card classes
    'giftCardObjects': [],    # Gift card objects
    'loyaltyClasses': [],     # Loyalty classes
    'loyaltyObjects': [],     # Loyalty objects
    'offerClasses': [],       # Offer classes
    'offerObjects': [],       # Offer objects
    'transitClasses': [],     # Transit classes
    'transitObjects': []      # Transit objects
  },
  'origins' : ['http://baconrista.com', 'https://baconrista.com']
}

// Generate the Save to Android Pay Jwt
signer = crypt.Signer.from_string(app_key)
signed_jwt = crypt.make_signed_jwt(signer, jwt)
response = webapp2.Response(signed_jwt)

Примечание. Эти JWT подписаны с помощью RSA-SHA256. Ключ подписи создан сервисным аккаунтом OAuth.

Поле Тип Обязательное поле Описание
iss Строка Да Адрес электронной почты, созданный сервисным аккаунтом OAuth 2.0.
aud Строка Да Аудитория. Аудиторией объектов Google Pay API for Passes всегда будет google.
typ Строка Да Тип JWT. Аудиторией объектов Google Pay API for Passes всегда будет savetoandroidpay.
iat Целое число Да Время выдачи в секундах Unix-времени.
payload Объект Да Объект полезной нагрузки. Пример создания полезной нагрузки представлен в Руководстве по созданию JWT. В массив полезной нагрузки должен быть включен только один класс или объект.
payload.eventTicketClasses Массив Нет Класс EventTicketClass для сохранения.
payload.eventTicketObjects Массив Нет Объект EventTicketObject для сохранения.
payload.flightClasses Массив Нет Класс FlightClass для сохранения.
payload.flightObjects Массив Нет Объект FlightObject для сохранения.
payload.giftCardClasses Массив Нет Класс GiftCardClass для сохранения.
payload.giftCardObjects Массив Нет Объект GiftCardObject для сохранения.
payload.loyaltyClasses Массив Нет Класс LoyaltyClass для сохранения.
payload.loyaltyObjects Массив Нет Объект LoyaltyObject для сохранения.
payload.offerObjects Массив Нет Объект OfferObject для сохранения.
payload.offerClasses Массив Нет Класс OfferClass для сохранения.
payload.transitObjects Массив Нет Объект Transit для сохранения.
payload.transitClasses Массив Нет Класс Transit для сохранения.
origins Массив Да Массив доменов, где разрешено сохранять JWT. Кнопка Google Pay API for Passes не будет отображаться, если значение поля origins не задано. В этом случае в консоли браузера могут появиться сообщения "Load denied by X-Frame-Options" или "Refused to display".

JWT в форме кода будет выглядеть примерно так:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJnb29nbGUiLCJvcmlnaW5zIjpbImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIsImh0dHA6Ly93d3cuZ29vZ2xlLmNvbSJdLCJpc3MiOiJzMmFwLXRvb2wuZ29vZ2xlLmNvbUBhcHBzcG90LmdzZXJ2aWNlYWNjb3VudC5jb20iLCJpYXQiOjE1NTE5ODcxNTEsInR5cCI6InNhdmV0b3dhbGxldCIsInBheWxvYWQiOnsib2ZmZXJPYmplY3RzIjpbeyJpZCI6IjMyMDI0MTMyNDE4NDM2OTk0MDEuMDFfT2ZmZXJPYmplY3RJZCJ9XX19.maHX40WWT29TC_kEb90EKQBH9AiTYAZR3153K8UI7fznVnfjVdlwsH_GKTECV3PGXdNnKCcmatUbKsONC0bxrnAHYG02kuvA1D3hSctz_amU66ntsvGIDe13mpxTzhI8fPvt9KMP1iaO7uOJuLQIHwipu4uRFAjyFaHGVaSFaP9c53qQyb_Zgyyk50M-MhH2n4kDpstNCqUJKWaadQkOWjrtMjwGzQ_ME04lbR4wb_mfK1A7Rc1UieWkxM9aMl5TOPubBKxKRRk_CqillN8XoTl9MI5RRGPuElVO28zGpYlFS6BarzDaaUfmbRZGvfF8ZiKrHZKxVrJjfZIJ2TCcDw

Инструмент предварительного просмотра

С помощью инструмента предварительного просмотра в Google Pay API for Passes Merchant Center можно проверять контент JWT, а также отдельные классы или объекты. Чтобы перейти к инструменту, войдите свой аккаунт продавца и откройте соответствующий раздел в левой части страницы.

Функция "gapi.savetoandroidpay.render"

С помощью этой функции можно включить явный рендеринг кнопки Google Pay API for Passes.

gapi.savetoandroidpay.render("dom-container",{
  "jwt": "JWT",
  "onsuccess": "successHandler",
  "onfailure": "failureHandler"
});
Поле Тип Обязательное поле Описание
dom-container Строка Да Идентификатор места расположения кнопки Google Pay API for Passes.
jwt Строка Да JWT, определяющий контент для сохранения.
onsuccess Строка Нет Название строки для функции успешного обратного вызова при сохранении.
onfailure Строка Нет Название строки для функции неудачного обратного вызова при сохранении. Эта функция принимает объект ошибки с errorCode и errorMessage.
onprovidejwt Строка Нет Название строки для функции создания обработчика JWT. Эта функция нужна, чтобы перехватывать и, возможно, изменять данные в JWT перед сохранением объекта в Google Pay. Функция не принимает параметры и должна возвращать JWT в виде строки. При внедрении обработчика событий исходные данные JWT можно получить в поле this.getOpenParams().renderData.userParams.jwt.

Коды ошибок и сообщения Google Pay API for Passes

В следующих таблицах перечислены коды ошибок и стандартные сообщения, которые передаются в объекте ошибки функции неудачного обратного вызова, когда при использовании кнопки JavaScript объект не сохраняется.

        {
          "errorCode": "errorCode",
          "errorMessage": "errorMessage"
        }
errorCode errorMessage
SERVICE_FAILURE На сервере Google Pay произошла ошибка.
CLASS_NOT_FOUND Класс, указанный для объекта, не найден.
CLASS_MISMATCH Должен присутствовать объект того же типа и с указанием на вложенный класс.
ORIGIN_MISMATCH Исходный адрес кнопки не совпадает с указанным в списке.
INVALID_NUM_TYPES Можно задать только один тип объекта.
INVALID_SIGNATURE Не удалось проверить подпись.
INVALID_DUPLICATE_IDS Нельзя добавить копию объекта или класса.
INVALID_JWT Недействительный веб-токен JSON.
INVALID_EXP_IAT Срок действия JWT закончился или дата выпуска токена относится к будущему.
INVALID_AUD Недопустимое значение поля AUD.
INVALID_TYP Недопустимое значение поля TYP.
INVALID_NUM_OBJECTS Только один объект в одном классе может соответствовать карте постоянного покупателя, подарочной карте или специальному предложению.
MALFORMED_ORIGIN_URL Некорректный исходный URL. URL должен содержать протокол и домен.
MISSING_ORIGIN Не указан источник.
MISSING_FIELDS У вложенного объекта или класса заполнены не все обязательные поля.

Локализация

Язык в кнопке JavaScript изменяется в зависимости от следующих критериев:

  1. Если пользователь вошел в свой аккаунт Google, кнопка отображается на языке, указанном в аккаунте Google. О том, как изменить язык, рассказывается в этой статье.
  2. Если пользователь не вошел в аккаунт Google, в HTTP-заголовке для кнопки указывается значение ACCEPT-LANGUAGE.

Если вы заметили, что кнопка отображается на неверном языке или ее текст указан некорректно, свяжитесь с нашей службой поддержки.