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.

Esta referência inclui detalhes sobre o elemento HTML g:savetoandroidpay, que renderiza um botão da API Google Pay for Passes, e sobre o JSON Web Token (em inglês), 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" type="text/javascript"></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" type="text/javascript">
  {"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 px de altura) e standard (38 px de altura). O padrão de height é 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.
onprovidejwt String N Nome da string da função do gerenciador JWT fornecido. O objetivo dessa função é interceptar e talvez manipular os dados do JWT antes que o objeto seja salvo no Google Pay. Essa função não recebe nenhum parâmetro e precisa retornar o JWT como String. Ao implementar o manipulador de eventos, os dados do JWT originais podem ser recuperados no campo this.getOpenParams().renderData.userParams.jwt.
size String N Largura do botão a ser exibido. Você pode definir size como matchparent para que a largura corresponda à largura do elemento pai. Ou deixe size indefinido para que a largura se estenda para ajustar-se à largura da configuração text. Consulte os botões da API Google Pay for Passes para ver exemplos de botões com configurações de size diferentes.
text String N Obsoleto
textsize String N Quando textsize=large é especificado, ele exibe o tamanho de botão e o tamanho do texto drasticamente 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": {
    "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)

Observação: estes JWTs são assinados usando 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 Integer 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.eventTicketClasses Matriz N Classe de ingresso de evento a ser salva.
payload.eventTicketObjects Matriz N Objeto de ingresso de evento a ser salvo.
payload.flightClasses Matriz N Classe de voo a ser salva.
payload.flightObjects Matriz N Objeto de voo a ser salvo.
payload.giftCardClasses Matriz N Classe de vale-presente a ser salva.
payload.giftCardObjects Matriz N Objeto de vale-presente a ser salvo.
payload.loyaltyClasses Matriz N Classe de fidelidade a ser salva.
payload.loyaltyObjects Matriz N Objeto de fidelidade a ser salvo.
payload.offerObjects Matriz N Objeto de oferta a ser salvo.
payload.offerClasses Matriz N Classe de oferta a ser salva.
payload.transitObjects Matriz N Objeto de transporte a ser salvo.
payload.transitClasses Matriz N Classe de transporte a ser salva.
origins Matriz S Matriz de domínios para autorizar a funcionalidade de gravação do JWT. O botão API Google Pay for Passes não será processado 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

Ferramenta de visualização para validar os JWTs

A ferramenta de visualização na Google Pay API para Passes do Merchant Center pode ser usada para validar o conteúdo do JWT ou qualquer classe ou objeto individual. Ela está disponível em sua conta do emissor, no lado esquerdo, em Ferramenta de pré-visualização.

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.
onprovidejwt String N Nome da string da função do gerenciador JWT fornecido. O objetivo dessa função é interceptar e talvez manipular os dados do JWT antes que o objeto seja salvo no Google Pay. Essa função não recebe nenhum parâmetro e precisa retornar o JWT como String. Ao implementar o manipulador de eventos, os dados do JWT originais podem ser recuperados no campo this.getOpenParams().renderData.userParams.jwt.

Códigos de erro e mensagens da API Google Pay 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 e ofertas.
MALFORMED_ORIGIN_URL URL de origem malformado. 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.