Referência da API Google Pay for Passes para Web

A API Google Pay for Passes permite que os usuários salvem um objeto no Google Pay pela Web. Os usuários podem salvar diretamente os cartões pelo site.

Veja nesta referência mais detalhes sobre o elemento HTML g:savetoandroidpay, que renderiza um botão da API Google Pay for Passes, e sobre o JSON Web Token, que descreve o serviço da Web para o Google.

JavaScript da API Google Pay for Passes

Para analisar automaticamente as tags HTML g:savetoandroidpay no carregamento, inclua o JavaScript padrão.

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

Para aplicativos AJAX e renderização explícita de botões da API Google Pay for Passes, inclua o parâmetro "parsetags": "explicit".

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

Tag HTML g:savetoandroidpay

A tag de namespace g:savetoandroidpay define o canal e vários atributos do botão "Salvar no Google Pay". Use essa tag se você estiver renderizando HTML e JWTs no servidor.

<g:savetoandroidpay jwt="JWT" onsuccess="successHandler" onfailure="failureHandler" />
Campo Tipo Obrigatório Descrição
height String N Altura do botão a ser exibido. Os valores possíveis são: small (30 pixels de altura) e standard (38 pixels de altura). A height assume como padrão small. Consulte Botões da API Google Pay for Passes, que contém exemplos de botões com diferentes configurações de height.
jwt String S JWT da API Google Pay for Passes.
onsuccess String N Nome da string da função do gerenciador de callbacks de êxito na gravação.
onfailure String N Nome da string da função do gerenciador de callbacks de falha na gravação. Essa função recebe um objeto de erro contendo errorCode e errorMessage.
size String N Largura do botão a ser exibido. Defina size como matchparent para que a largura corresponda à do elemento pai. Ou deixe size indefinido para que a largura se estique e se ajuste à largura da configuração text. Consulte Botões da API Google Pay for Passes, que contém exemplos de botões com diferentes configurações de size.
text String N Obsoleto
textsize String N Quando especificado, textsize=large exibe um tamanho de texto e um tamanho de botão bem maiores para casos com requisitos de IU especiais.
theme String N Tema do botão a ser exibido. Os valores possíveis são: dark e light. O tema padrão é dark. Consulte Botões da API Google Pay for Passes, que contém exemplos de botões com diferentes configurações de theme.

JWT da API Google Pay for Passes

O JWT da API Google Pay for Passes define os objetos e as classes a serem salvos.

Protocolo


{
  "iss": "example_service_account@developer.gserviceaccount.com",
  "aud": "google",
  "typ": "savetoandroidpay",
  "iat": 1368029586,
  "payload": {
    "loyaltyClasses": [{
     ... //Loyalty Class JSON
     }],
    "loyaltyObjects": [{
      ... //Loyalty Object JSON
      }],
    "offerClasses": [{
      ... //Offer Class JSON
      }],
    "offerObjects": [{
      ... //Offer Object JSON
      }],
    "giftcardClasses": [{
      ... //Gift card Class JSON
      }],
    "giftcardObjects": [{
      ... //Gift card Object JSON
      }],
    "eventTicketClasses": [{
      ... //Event ticket Class JSON
      }],
    "eventTicketObjects": [{
      ... //Event ticket Object JSON
      }],
    "flightClasses": [{
      ... //Flight Class JSON
      }],
    "flightObjects": [{
      ... //Flight 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" => {
    "loyaltyClasses" => [ ],  #Loyalty classes
    "loyaltyObjects" => [ ],  #Loyalty objects
    "offerClasses" => [ ],  #Offer classes
    "offerObjects" => [ ],  #Offer objects
    "giftcardClasses" => [ ],  #Gift card classes
    "giftcardObjects" => [ ],  #Gift card objects
    "eventTicketClasses" => [ ],  #Event ticket classes
    "eventTicketObjects" => [ ],  #Event ticket objects
    "flightClasses" => [ ],  #Flight classes
    "flightObjects" => [ ]  #Flight 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.'
    },
    'loyaltyClasses': [], # Loyalty classes
    'loyaltyObjects': [], # Loyalty objects
    'offerClasses': [], # Offer classes
    'offerObjects': [],  # Offer objects
    'giftcardClasses': [], # Gift card classes
    'giftcardObjects': [],  # Gift card objects
    'eventTicketClasses': [], # Event ticket classes
    'eventTicketObjects': [],  # Event ticket objects
    'flightClasses': [], # Flight classes
    'flightObjects': []  # Flight 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)

Observação: estes JWTs são assinados usando-se RSA-SHA256. A chave de assinatura é a chave gerada pela conta de serviço do OAuth.

Campo Tipo Obrigatório Descrição
iss String S O endereço de e-mail gerado pela conta de serviço do OAuth 2.0.
aud String S Público-alvo. O público-alvo dos objetos da API Google Pay for Passes sempre será google.
typ String S Tipo de JWT. O público-alvo dos objetos da API Google Pay for Passes sempre será savetoandroidpay.
iat Inteiro S Emitido em tempo hábil, em segundos, desde o período.
payload Objeto S Objeto de payload. Consulte o guia Como gerar o JWT para ver um exemplo de como criar o payload. Somente um objeto ou uma classe precisa ser incluído nas matrizes de payload.
payload.loyaltyObjects Matriz N Objeto de fidelidade a ser salvo.
payload.offerObjects Matriz N Objeto de oferta a ser salvo.
payload.giftCardObjects Matriz N Objeto de vale-presente a ser salvo.
payload.eventTicketObjects Matriz N Objeto de ingresso de evento a ser salvo.
payload.flightObjects Matriz N Objeto de voo a ser salvo.
payload.loyaltyClasses Matriz N Classe de fidelidade a ser salva.
payload.offerClasses Matriz N Classe de oferta a ser salva.
payload.giftCardClasses Matriz N Classe de vale-presente a ser salva.
payload.eventTicketClasses Matriz N Classe de ingresso de evento a ser salva.
payload.flightClasses Matriz N Classe de voo a ser salva.
origins Matriz S Matriz de domínios para autorizar a funcionalidade de gravação do JWT. O botão da API Google Pay for Passes não será renderizado quando o campo origins não estiver definido. É possível receber uma mensagem "Carregamento negado por X-Frame-Options" ou "Exibição recusada" no console do navegador quando o campo de origem não está definido.

O JWT codificado pode ser semelhante ao seguinte exemplo:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJnb29nbGUiLCJvcmlnaW5zIjpbImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIsImh0dHA6Ly93d3cuZ29vZ2xlLmNvbSJdLCJpc3MiOiJzMmFwLXRvb2wuZ29vZ2xlLmNvbUBhcHBzcG90LmdzZXJ2aWNlYWNjb3VudC5jb20iLCJpYXQiOjE1NTE5ODcxNTEsInR5cCI6InNhdmV0b3dhbGxldCIsInBheWxvYWQiOnsib2ZmZXJPYmplY3RzIjpbeyJpZCI6IjMyMDI0MTMyNDE4NDM2OTk0MDEuMDFfT2ZmZXJPYmplY3RJZCJ9XX19.maHX40WWT29TC_kEb90EKQBH9AiTYAZR3153K8UI7fznVnfjVdlwsH_GKTECV3PGXdNnKCcmatUbKsONC0bxrnAHYG02kuvA1D3hSctz_amU66ntsvGIDe13mpxTzhI8fPvt9KMP1iaO7uOJuLQIHwipu4uRFAjyFaHGVaSFaP9c53qQyb_Zgyyk50M-MhH2n4kDpstNCqUJKWaadQkOWjrtMjwGzQ_ME04lbR4wb_mfK1A7Rc1UieWkxM9aMl5TOPubBKxKRRk_CqillN8XoTl9MI5RRGPuElVO28zGpYlFS6BarzDaaUfmbRZGvfF8ZiKrHZKxVrJjfZIJ2TCcDw

Função gapi.savetoandroidpay.render

Essa função permite renderizar explicitamente o botão da API Google Pay for Passes.

gapi.savetoandroidpay.render("dom-container",{
  "jwt": "JWT",
  "onsuccess": "successHandler",
  "onfailure": "failureHandler"
});
Campo Tipo Obrigatório Descrição
dom-container String S Código do contêiner para colocar o botão da API Google Pay for Passes.
jwt String S JWT que define o conteúdo a ser salvo.
onsuccess String N Nome da string da função do gerenciador de callbacks de êxito na gravação.
onfailure String N Nome da string da função do gerenciador de callbacks de falha na gravação. Essa função recebe um objeto de erro contendo errorCode e errorMessage.

Códigos de erro e mensagens da Google Pay API for Passes

As tabelas a seguir mostram os códigos de erro e as mensagens de erro padrão transmitidos no objeto de erro para a função de callback com falha quando um objeto não é salvo corretamente usando o botão javascript.

        {
          "errorCode": "errorCode",
          "errorMessage": "errorMessage"
        }
errorCode errorMessage
SERVICE_FAILURE Ocorreu um erro no servidor do Google Pay.
CLASS_NOT_FOUND A classe referenciada no objeto não foi encontrada.
CLASS_MISMATCH O objeto precisa estar presente, ser do mesmo tipo e fazer referência à classe incluída.
ORIGIN_MISMATCH A origem do botão não corresponde à especificada na lista de origens.
INVALID_NUM_TYPES Exatamente um tipo de objeto pode ser especificado.
INVALID_SIGNATURE Não foi possível verificar a assinatura.
INVALID_DUPLICATE_IDS Não é permitido duplicar objetos ou classes.
INVALID_JWT O JWT é inválido.
INVALID_EXP_IAT O JWT expirou ou foi emitido no futuro.
INVALID_AUD O valor é inválido para o campo AUD.
INVALID_TYP O valor é inválido para o campo TYP.
INVALID_NUM_OBJECTS Exatamente um objeto e no máximo uma classe podem ser especificados para cartões de fidelidade, vales-presente, ingressos de eventos, ofertas e voos.
MALFORMED_ORIGIN_URL O URL de origem está incorreto. Ele precisa conter um protocolo e um domínio.
MISSING_ORIGIN A origem precisa ser especificada.
MISSING_FIELDS O objeto ou a classe incluídos não continham os campos obrigatórios.

Localização

O idioma no botão JavaScript é alterado com base nos seguintes critérios:

  1. Se o usuário estiver conectado ao Google, o botão será processado no idioma preferencial fornecido no perfil da Conta do Google do usuário. Consulte Alterar idioma para saber como alterar o idioma preferido da sua Conta do Google.
  2. Se o usuário não estiver conectado ao Google, o botão usará o valor ACCEPT-LANGUAGE no cabeçalho HTTP.

Se você perceber que o botão não é renderizado no idioma correto, com base na lógica acima, ou se o texto não for natural, entre em contato com nossa equipe de suporte.

Enviar comentários sobre…

Google Pay for Passes