Ajouter et supprimer des rappels

Ce guide explique comment utiliser les rappels avec l'API Google Wallet. Lorsqu'une carte est créée ou supprimée, Google peut effectuer un rappel vers un point de terminaison HTTPS de votre choix. Ce rappel est spécifique à la carte et inclut des données sur l'événement, telles que externalPassId et le type d'événement. Il permet de suivre le nombre d'ajouts et de suppressions effectués par les utilisateurs. Par exemple, les rappels peuvent être configurés pour envoyer des événements à une application d'analyse afin de suivre l'engagement client lors d'événements promotionnels.

Prérequis

Avant de commencer, passez en revue les conditions préalables suivantes:

  • Mettez en place un point de terminaison HTTPS qui gère les requêtes POST. Ce point de terminaison doit être public.
  • Mettez à jour par programmation l'URL du point de terminaison de rappel pour l'émetteur. Consultez la propriété callbackOptions de l'émetteur dans l'API REST.
  • Recommandation: utilisez la bibliothèque Tink pour valider les signatures.

Implémenter des rappels

Pour chaque ajout ou suppression effectué par l'utilisateur sur une carte, Google envoie des rappels aux marchands leur indiquant les détails de l'ajout ou de la suppression sur l'URL de rappel de l'émetteur. Les marchands doivent d'abord utiliser les clés publiques pour vérifier l'authenticité du message. Une fois que les rappels ont validé le message, ils peuvent être utilisés pour les opérations en aval.

Vérifier la signature

Nous vous recommandons d'utiliser la bibliothèque Tink pour vérifier la signature du message lorsque vous implémentez votre point de terminaison HTTPS. La bibliothèque Tink fournit PaymentMethodTokenRecipient, un utilitaire qui valide automatiquement la signature et renvoie le message une fois la validation effectuée.

L'exemple suivant montre comment utiliser la bibliothèque Tink pour implémenter 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
  }
}

Format de message attendu

Le format du message est JSON sérialisé dans une chaîne avec les propriétés suivantes:

Identifiant Description
externalPassId

ID de carte externe complet. Utilise le format suivant:

<issuer_id.external_pass_id>
expTimeMillis Délai d'expiration en millisecondes depuis EPOCH. Passé ce délai, le message doit être considéré comme non valide.
eventType Les valeurs possibles sont del ou save pour DELETE et SAVE.
nonce Nonce de suivi des diffusions en double.

Gérer la requête d'un serveur Google

La liste suivante contient les champs de clé figurant dans l'en-tête de la requête envoyée au point de terminaison de votre rappel:

  • User-agent: Googlebot
  • Type de contenu: application/json

Configurez votre serveur pour qu'il ne refuse pas la requête. Pour ce faire, vous pouvez définir les éléments suivants dans robots.txt:

User-agent: Googlebot
Disallow:

Tentatives

Les rappels sont exécutés dans la mesure du possible. Google tente deux fois de tenir compte des échecs temporaires. Après deux tentatives, Google supprime le message et n'essaie pas de le renvoyer.

Distributions en double

Il peut y avoir des diffusions en double dans certains cas. Nous vous recommandons d'utiliser nonce pour les dédupliquer.