Usar callbacks para salvamentos e exclusões

Este guia explica como usar callbacks com a API Google Pay for Passes. Para cada valor salvo e excluído, o Google faz o callback dos parceiros em um endpoint HTTPs no nível da classe pré-configurado com dados sobre a gravação/exclusão do usuário com uma assinatura.

Pré-requisitos

Antes de dar os primeiros passos, revise os seguintes pré-requisitos:

  • Destaque um endpoint HTTPS que processe solicitações POST. Esse endpoint precisa estar disponível publicamente.
  • Atualize programaticamente o endpoint do callback por classe. Consulte a propriedade callbackOptions por classe na API REST.
  • Recomendado: use a biblioteca do Tink para verificar as assinaturas.

Implementar callbacks

Para cada gravação ou exclusão realizada pelo usuário em um objeto, o Google faz callbacks para os comerciantes com detalhes sobre a gravação ou a exclusão em um URL por classe. Os comerciantes precisam verificar inicialmente a autenticidade da mensagem usando as chaves públicas. Assim que puderem verificar a mensagem, os callbacks poderão ser usados em operações downstream.

Verificar a assinatura

Recomendamos usar a biblioteca do Tink para verificar a assinatura da mensagem ao implementar o endpoint HTTPS. A biblioteca do Tink fornece o PaymentMethodTokenRecipient, um utilitário que verifica automaticamente a assinatura e retorna a mensagem real após a verificação.

O exemplo a seguir mostra como implementar PaymentMethodTokenRecipient usando a biblioteca do Tink:

private static final String PUBLIC_KEY_URL = "https://pay.google.com/gp/m/issuer/keys". // Public key URL provided by Google.
private static final String SENDER_ID = "GooglePayPasses". // Constant.

private static final String RECIPIENT_ID = "ISSUER_ID". // Replace ISSUER_ID with your issuer id.

private static final String PROTOCOL = "ECv2SigningOnly".
Private static final GooglePaymentsPublicKeysManager keysManager = new
                       GooglePaymentsPublicKeysManager.Builder()
                      .setKeysUrl(PUBLIC_KEY_URL)
                      .build();

public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
    try {
      // Extract signed message with signature from POST request body.
      String signedMessage = CharStreams.toString(request.getReader());
      recipient =
          new PaymentMethodTokenRecipient.Builder()
              .protocolVersion(PROTOCOL)
              .fetchSenderVerifyingKeysWith(keysManager)
              .senderId(SENDER_ID)
              .recipientId(RECIPIENT_ID)
              .build();

      String serializedJsonMessage = recipient.unseal(signedMessage);
      // Use serializedJsonMessage to extract the details.
    } catch (Exception e) {
       // …
    }
}

Formato de mensagem esperado

O formato da mensagem é JSON serializado em uma string e contém as seguintes propriedades:

Identificador Descrição
classId

ID de classe totalmente qualificado. Usa o seguinte formato:


<issuer_id.class_id>
objectId

ID de objeto totalmente qualificado. Usa o seguinte formato:


<issuer_id.object_id>
expTimeMillis Tempo de expiração em milissegundos desde EPOCH. Depois do horário de expiração, a mensagem será considerada inválida.
eventType Pode ser "del" ou "save" para DELETE e SAVE.
nonce Valor de uso único para rastrear as exibições duplicadas.

Processar a solicitação de um servidor do Google

Esta é uma lista dos campos-chave no cabeçalho da solicitação enviada para o endpoint de callback:

  • User-Agent: Google-Valuables
  • Content-Type: application/json

Configure o servidor corretamente. Dessa maneira, ele não rejeita a solicitação. Por exemplo, convém definir o seguinte em robots.txt:

User-agent: Google-Valuables
Disallow:

Novas tentativas

Os callbacks são feitos na medida do possível. O Google tenta entregar a mensagem por três dias em caso de falhas temporárias. Depois de três dias, a mensagem será descartada e não será tentada novamente no futuro.

Entregas duplicadas

Talvez haja entregas duplicadas em alguns casos. Recomendamos usar um valor de uso único para excluí-las.