Aggiungere ed eliminare callback

Questa guida spiega come utilizzare i callback con l'API Google Wallet. Quando viene creato o eliminato un pass, Google può eseguire un callback a un endpoint HTTPS a tua scelta. Questo callback è specifico per la classe e include dati sull'evento, come la classe, l'oggetto e il tipo di evento. Può essere utilizzato per tenere traccia del numero di aggiunte ed eliminazioni di utenti. Ad esempio, i callback possono essere configurati per inviare eventi a un'applicazione di analisi per monitorare il coinvolgimento dei clienti durante gli eventi promozionali.

Prerequisiti

Prima di iniziare, rivedi i seguenti prerequisiti:

  • Configura un endpoint HTTPS che gestisca le richieste POST. Questo endpoint deve essere disponibile pubblicamente.
  • Aggiorna in modo programmatico l'endpoint di callback per ogni classe. Consulta la proprietà callbackOptions per classe nell'API REST.
  • Consigliato: utilizza la libreria Tink per verificare le firme.

Implementare i callback

Per ogni aggiunta o eliminazione eseguita dall'utente su un oggetto , Google esegue callback ai commercianti con i dettagli dell'aggiunta o dell'eliminazione su un URL per classe. I commercianti devono prima utilizzare le chiavi pubbliche per verificare l'autenticità del messaggio. Dopo che i callback verificano il messaggio, possono essere utilizzati per le operazioni downstream.

Verificare la firma

Ti consigliamo di utilizzare la libreria Tink per verificare la firma del messaggio quando implementi l'endpoint HTTPS. La libreria Tink fornisce PaymentMethodTokenRecipient, un'utilità che verifica automaticamente la firma e restituisce il messaggio effettivo in caso di verifica riuscita.

L'esempio seguente mostra come utilizzare la libreria Tink per implementare PaymentMethodTokenRecipient:

import java.io.IOException;
import javax.servlet.http.*;
import com.google.common.io.CharStreams;
import com.google.crypto.tink.apps.paymentmethodtoken.*;

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

private static final String PUBLIC_KEY_URL = "https://pay.google.com/gp/m/issuer/keys";
private static final String SENDER_ID = "GooglePayPasses";
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());
    PaymentMethodTokenRecipient 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) {
    // Handle the error
  }
}

Formato del messaggio previsto

Il formato del messaggio è JSON serializzato in una stringa con le seguenti proprietà:

Identificatore Descrizione
classId

ID classe completo. Utilizza il formato seguente:

<issuer_id.class_id>
objectId

ID oggetto completo. Utilizza il formato seguente:

<issuer_id.object_id>
expTimeMillis Tempo di scadenza in millisecondi dall'epoca. Dopo il periodo di scadenza, il messaggio deve essere considerato non valido.
eventType Può essere del o save per DELETE e SAVE.
nonce Nonce per monitorare eventuali consegne duplicate.

Gestire la richiesta da un server Google

Di seguito è riportato un elenco dei campi chiave nell'intestazione della richiesta inviata all'endpoint di callback:

  • User-agent: Googlebot
  • Content-Type: application/json

Configura il server in modo che non rifiuti la richiesta. Per farlo, puoi impostare quanto segue in robots.txt:

User-agent: Googlebot
Disallow:

Nuovi tentativi

I callback vengono eseguiti secondo il criterio del "best effort". Google utilizzerà strategie di ripetizione comuni per garantire la resilienza nei casi in cui l'endpoint di callback non risponde o ha un'interruzione intermittente e ritenterà gradualmente.

Consegne duplicate

In alcuni casi, potrebbero essere presenti consegne duplicate. Ti consigliamo di utilizzare nonce per rimuovere i duplicati.