Visibilité du statut

Aperçu

Lorsque vos clients passent par le processus de paiement Affirm, vous pouvez voir leur statut en temps réel via l'API Affirm. Nous envoyons une demande webhook à votre serveur lorsqu'un client :

  • Entre dans le processus de paiement
  • Reçoit une décision de crédit
  • Confirme son prêt

Usage

Vous pouvez utiliser ces renseignements à des fins de service à la clientèle, comme le soutien téléphonique, ou pour identifier des clients potentiels dans le cadre de campagnes de marketing par courriel. Vous pouvez également utiliser la visibilité du statut pour les notifications et les commentaires lors de la session de paiement (push). Ce guide explique la manière de recevoir des mises à jour de visibilité de statut de la part d'Affirm.

Événements de paiement

Expérience utilisateurÉvénement AffirmÉvénement Webhook
Sélectionne Affirm comme option de paiement et est envoyé à AffirmPaiement crééopened
Crée ou se connecte à un compte AffirmAucunAucun
Écran de traitementDécision d'approbation approuvé
non approuvé
* plus_d'informations_nécessaires
Sélectionne les conditions du prêt et accepte les divulgationsAucunAucun
Cliquent sur confirmer et sont renvoyés au site du commerçantConfirmation de paiementconfirmed

Définitions des événements

Les clients doivent s'inscrire pour que les décisions d'approbation soient incluses. L'événement confirmed est le seul événement webhook dont la présence est garantie pour chaque tentative de paiement Affirm réussie. Tous les autres événements (approuvés/non approuvés/etc.) ne seront présents que si le client a accepté la politique de partage des données Affirm. Les clients sont activement invités à activer le partage de données et peuvent basculer ce paramètre (« services personnalisés ») dans leur profil utilisateur Affirm à tout moment (https://www.affirm.ca/u/#/settings).

ouvert

Lorsque le client a ouvert le lien de paiement et voit l'écran de connexion/inscription du compte. Il s'agit de la première étape du flux de paiement Affirm.

approuvée

Le client a été approuvé pour son achat Affirm.

Non approuvé

Le client s'est vu refuser un crédit pour une raison quelconque. La raison est volontairement ambiguë et peut être due à la solvabilité, à l'incapacité de vérifier l'identité ou à l'insuffisance des dossiers financiers.

Plus d'informations nécessaires

Le client a été invité à fournir des renseignements supplémentaires pour déterminer sa solvabilité ou son identité, et a quitté le paiement sans fournir les renseignements demandés.

Confirmé

Le client a confirmé le prêt. Il s'agit de la dernière étape du processus de paiement Affirm, qui devrait ensuite déclencher l'autorisation de prélèvement.

Intégration

Pour recevoir des mises à jour sur la visibilité du statut de la part d'Affirm :

Affirm enverra une requête HTTP POST demande à une URL que vous fournissez à votre Réussite Client Manager chez Affirm. Cette URL doit être une page ou un point de terminaison que vous avez configuré pour recevoir des demandes de nos serveurs.

Exigences relatives aux terminaux :

  • HTTP/HTTPS
  • Reçoit la méthode POST
  • Renvoie le statut 2xx
  • Prise en charge de TLS 1.2 (les certificats auto-signés ou expirés ne sont pas acceptés)
  • Tarif dépendant du trafic de caisse du commerçant
  • L'IP entrante est dynamique
  • Type de contenu : application/x-www-form-urlencoded
  • Accept-Encoding: gzip

Propriétés de la requête Webhook :

  • Méthode POST
  • User-Agent: Affirm-Webhook
  • L'IP d'origine est dynamique
  • Le nombre de champs varie; est basé sur :
    • Type d'événement - les événements approuvés/refusés/plus_d'informations ont des champs conditionnels
    • Inscription de l'utilisateur : indique si les champs conditionnels sont présents

Répondre à un événement webhook :

Votre point de terminaison doit répondre à Affirm avec un code de statut pour indiquer que vous avez bien reçu la notification d'événement webhook. Affirm traitera tous les autres types de réponse comme une livraison échouée, y compris les codes de statut 3xx. Cela signifie que nous traiterons les redirections d'URL et les réponses « Non Modifiées » comme des échecs. Affirm ignorera toute autre information renvoyée dans les en-têtes ou le corps de la demande.

Affirm ne renvoie actuellement un événement webhook si votre point de terminaison ne l'a pas reçu avec succès.

Considérations de sécurité :

Authentification

Nous pouvons prendre en charge l'authentification de base dans l'URL. Vous devrez fournir le nom d'utilisateur et le mot de passe de l'URL de votre point d'accès à votre Réussite Client Manager.

Exemple : AB123:<[email protected]>/affirm_webhook

Demandes signées

Affirm signe les demandes de webhook, afin que vous puissiez éventuellement vérifier qu'Affirm envoie la demande, plutôt qu'un tiers prétendant être Affirm. Chaque demande comprend un en-tête encodé en base 64, X-Affirm Signature. La valeur de l'en-tête est une signature de hachage HMAC-SHA256 calculée à partir de la charge utile de la demande et de votre clé API privée trouvée dans votre tableau de bord du commerçant.

Rejouer la prévention des attaques

Si un tiers intercepte une charge utile d'une demande et sa signature, votre endpoint est susceptible à une attaque par replay. Pour atténuer ces attaques, nous incluons un horodatage dans l'en-tête X-Affirm Signature. Comme l'horodatage fait partie de la charge utile signée, l'attaquant ne peut pas modifier l'horodatage sans invalider la signature. Si la signature est valide mais que l'horodatage est ancien, vous devez rejeter la demande. Nous vous recommandons de rejeter une réponse avec un horodatage antérieur de 5 minutes à l'heure actuelle.

Corps de la demande de webhook de paiement

Type de contenu : application/x-www-form-urlencoded

checkout_token=I97HK0EREM38YHK3
created=2019-02-27T22%3A50%3A52.601851
event=confirmed
event_timestamp=2019-02-27T22%3A51%3A57.941799
order_id=000000017
webhook_session_id=A1b2C3
checkout_tokenstringLorsque l'utilisateur quitte, annule ou est refusé dans le flux de paiement Affirm
événementenum ouvert
approuvé
non approuvé
plus_informations_nécessaires
* confirmé
event_timestampHorodatageUTC (AAAA-MM-JJTHH:MM:SS:SSSSS)
createdHorodatageUTC (AAAA-MM-JJTHH:MM:SS:SSSSS)
order_idstring*(Facultatif) Doit être activé par Affirm. Uniquement inclus si le commerçant transmet la valeur dans l'objet de paiement
webhook_session_idstring*(Facultatif) Doit être activé par Affirm. Uniquement inclus si le commerçant transmet la valeur dans l'objet de paiement

🚧

Les champs order_id et webhook_session_id ne sont pas disponibles dans Shopify.

Réconciliation

Vous pouvez effectuer une réconciliation avec vos propres enregistrements client en fonction de l'un de ces champs :

  • Checkout_token - fourni par Affirm
  • Numéro de commande - fourni par le commerçant
  • ID de session Webhook - fourni par le commerçant

🚧

Les champs order_id et webhook_session_id ne sont pas disponibles dans Shopify. Veuillez communiquer avec votre Manager Réussite Client chez Affirm. Ils peuvent donner accès à l'adresse électronique du client à recevoir dans le webhook pour la réconciliation.

Si vous utilisez un champ fourni par Affirm, tel que le checkout_token, vous devrez stocker cet identifiant dans votre système afin de le rapprocher ultérieurement des demandes de webhook entrantes.

Si vous utilisez l’un de vos champs connus (order_id, customer email, webhook_session_id), vous devriez être en mesure de rapprocher les demandes de webhook entrantes avec les informations dont vous disposez.

Les order_id et webhook_session_id envoyé dans l'objet de paiement figure dans toutes les demandes de webhook entrantes pour cette tentative de paiement. Vous pouvez rapprocher ces données de vos dossiers clients.

Exemple de code

//-------------------------
// START AFFIRM MFP EXAMPLE

    var toInteger = function(a) {
    var _a;
    if (typeof a === "number" && a != Math.floor(a)){
        return a * 100;
    }
    if (typeof a === "number" && a === Math.floor(a)) {
        return a;
    }
    if (typeof a === "string" && a.includes('.')) {
        var _a = a.replace(/[$\.\,]/gi,'');
        return parseInt(_a);
    }
    if (typeof a === "string" && a.includes('$')) {
        var _a = a.replace(/[$\,]/gi,'') + '00';
        return parseInt(_a);
    }
    else {
        return parseInt(a);
    }
}

    var affirm_mfp_config = {
        // Price threshold
        "min": 30000,
        
        // Put your MFP Promo ID below:
        "promo_id": "",
        // Put your MFP Financing Program name below:
        "program_name": "",

        "default_promo_id": "",
        "default_program_name": ""
    };
    
    // Your existing price element's ID (optional)
    var affirm_price_elid = "the-price";
    
    // A delay to let things load (optional)
    var affirm_trigger = "refresh-button";
    
    if(affirm_trigger){
        document.getElementById(affirm_trigger);
        affirm_trigger.addEventListener('click',function(){affirmRefresh(affirm_current_price)});
    }
        var affirm_program_name = "";
      var affirm_current_price = function() {
        var _current_price;
        var _affirm_promos = document.getElementsByClassName('affirm-as-low-as');

       var _price_el = document.getElementById(affirm_price_elid);
       if (!_price_el) {
          console.log("No price provided");
          return false
        }
        if (_price_el.tagName === "INPUT"){
          _current_price = toInteger(_price_el.value);
        }
        else {
          _current_price = toInteger(_price_el.innerText);
        }
      return _current_price
      }

    var affirm_mfp_eligible = function(a) {
        return affirm_current_price >= affirm_mfp_config.min
    }
  
  function affirmRefresh(a) {
    var _affirm_promos = document.getElementsByClassName('affirm-as-low-as');
    for (var i = _affirm_promos.length - 1; i >= 0; i--) {
      _affirm_promos[i].setAttribute('data-amount',affirm_current_price());
    }
    affirmMfp(a);
    affirm.ui.refresh();
  }
  
    function affirmMfp(a) {
        var _affirm_promos = document.getElementsByClassName('affirm-as-low-as');
        if (affirm_mfp_eligible(a)) {
            console.log('mfp');
            for (var i = _affirm_promos.length - 1; i >= 0; i--) {
                _affirm_promos[i].setAttribute('data-promo-id',affirm_mfp_config.promo_id);
            }
            affirm_program_name = affirm_mfp_config.program_name;
        }
        else {
            for (var i = _affirm_promos.length - 1; i >= 0; i--) {
            console.log('default');
            _affirm_promos[i].setAttribute('data-promo-id',affirm_mfp_config.default_promo_id);
            }
            affirm_program_name = affirm_mfp_config.default_program_name
        }
    }

    // affirm_checkout_object = {
    // ...
    //    "financing_program_name" : affirm_program_name;
    // ...
    // }
  
 // END AFFIRM MFP EXAMPLE
 //-------------------------