Ajouter et supprimer des rappels

Ce guide explique comment utiliser les rappels avec l'API Google Wallet. Quand un objet de valeur est créé ou supprimé, Google peut effectuer un rappel vers le point de terminaison HTTPS de votre choix. Ce rappel est propre à la classe et inclut des données concernant l'événement, telles que la classe, l'objet et le type d'événement. Cela permet de maintenir la synchronisation avec 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.

Conditions préalables

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 le point de terminaison de rappel pour chaque classe par programmation. Consultez la propriété callbackOptions par classe 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 un objet, Google envoie des rappels aux marchands leur indiquant les détails de l'ajout ou de la suppression dans une URL de classe. Les marchands doivent d'abord utiliser les clés publiques pour vérifier l'authenticité du message. Une fois que les rappels ont permis de vérifier le message, ils peuvent être utilisés pour effectuer 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
  }
}

Expected message format

The message format is JSON that's serialized into a string with the following properties:

Identifier Description
classId

Fully qualified class ID. Uses the following format:

<issuer_id.class_id>
objectId

ID complet de l'objet. Utilise le format suivant :

<issuer_id.object_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 : Google-Valuables
  • 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: Google-Valuables
Disallow:

Nouvelles tentatives

Les rappels sont exécutés de la manière la plus optimale possible. En cas d'échec temporaire, Google tente de distribuer le message pendant trois jours. Après trois jours, Google supprime le message et n'essaie pas de le renvoyer.

Diffusions en double

Dans certains cas, des diffusions en double peuvent se produire. Nous vous recommandons d'utiliser nonce pour les dédupliquer.