Service d’authentification du porteur de carte

Ce Web Service a pour but d’authentifier le porteur de la carte de paiement en utilisant les protocoles 3DS v1 ou 3DS v2 (d’autres protocoles d’authentification pourront éventuellement venir compléter cette liste). Le service propose un choix automatique du protocole, avec un repli transparent vers 3DS v1 si 3DS v2 n’est pas possible.

Le service authentifie le porteur de carte et renvoie les informations d’authentification à la fin du processus.

Principe général

Le service adopte un principe de fonctionnement qui fait abstraction du protocole sous-jacent pour permettre une intégration unique, et non pas une intégration par protocole.

La cinématique générique d’une authentification complète peut être décomposée en plusieurs étapes:

  • un appel initial au service Charge/Authenticate avec une réponse de type RESULT ou INSTRUCTION.
  • si le retour est de type INSTRUCTION, c’est une opération qu’il convient de réaliser côté marchand :
    • création d’une iFrame visible ou invisible
    • dans l’iFrame, redirection du navigateur vers la cible avec un formulaire qui suit la définition présente dans l’instruction
    • interaction éventuelle avec le porteur de carte, ou le navigateur
    • page de retour du serveur distant qui émettra un événement JavaScript contenant le résultat de l’instruction
    • interception du résultat de l’instruction sous forme d’événement JavaScript dans la page parente
    • nouvel appel au service Charge/Authenticate avec le résultat signé de l’instruction obtenu via le navigateur
    • le service Charge/Authenticate renvoie alors à nouveau soit une instruction soit un résultat
  • si le retour est de type RESULT, alors celui-ci contiendra le résultat d’authentification final et le processus est terminé.

Diagramme détaillé

Le diagramme suivant détaille un scénario générique de paiement avec une authentification: l’appel initial au service, une instruction, une interaction, un résultat final d’authentification et la fin du paiement.

Nous allons détailler les différentes étapes d’intégration dans les paragraphes suivants.

Intégration Etapes
Actions à réaliser côté serveur marchand étapes 3, 4, 16 et 17
Actions à réaliser côté JavaScript étapes 5, 6, 7 et 15

Etape 1 et 2: Initiation (paiement ou ajout de carte)

Une action de paiement ou un enregistrement de carte à été initié et nécessite une authentification. Le service Charge/Authenticate est donc prêt à être appelé.

Etape 3: Appel du service Charge/Authenticate

La requête initiale permet de transmettre les données nécessaires à l’authentification. Ci-dessous une requête d’exemple:

{
  "device": {
    "type": "BROWSER",
    "acceptHeader": "application/json",
    "ip": "89.249.65.28", 
    "javaEnabled": true,
    "language": "en",
    "colorDepth": "1",
    "screenHeight": 1024,
    "screenWidth": 768,
    "timezoneOffset": 0,
    "userAgent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0"
  },
  "productType": "GOODS_OR_SERVICE_PURCHASE",
  "merchant": {
    "mid": "123456"
  },
  "transactionCategory": "PAYMENT",
  "amount": 1230,
  "currency": "EUR",
  "paymentForm":{
    "pan": "4970100000000014",
    "expiryMonth": "02",
    "expiryYear": "22",
	  "accountType": "DEBIT"
  }
}
/**
 * I initialize the PHP SDK
 */
require_once __DIR__ . '/vendor/autoload.php';
require_once __DIR__ . '/keys.php';
require_once __DIR__ . '/helpers.php';

/** 
 * Initialize the SDK 
 * see keys.php
 */
$client = new Lyra\Client();

/**
 * I create a formToken
 */
$store = array("amount" => 250, 
"currency" => "EUR", 
"orderId" => uniqid("MyOrderId"),
"customer" => array(
  "email" => "sample@example.com"
));
$response = $client->post("V4/Charge/CreatePayment", $store);

/* I check if there are some errors */
if ($response['status'] != 'SUCCESS') {
    /* an error occurs, I throw an exception */
    display_error($response);
    $error = $response['answer'];
    throw new Exception("error " . $error['errorCode'] . ": " . $error['errorMessage'] );
}

/* everything is fine, I extract the formToken */
$formToken = $response["answer"]["formToken"];

?>

Etape 4: Réponse complète avec une instruction

La réponse contiendra une instruction sous la forme suivante (dans cet exemple il s’agit d’une authentification 3DS v1):

{
  "answer": {
	  "id": "c82794e9-9c20-44a8-9297-b70e1e7c4006",
	  "protocol": {
			"name": "THREEDS",
			"version": "1.0.2",
			"challengePreference":"NO_PREFERENCE",
			"simulation":false
		},
		
	  "value": {
  		"responseType": "INSTRUCTION",
			"instructionType": "FORM",
			"name": "CHALLENGE",
			"timeout" : "15",
			"target": {
				"element": "IFRAME",
				"visible": true,
				"width": 400,
				"height": 400
			},

			"http": {
				"method": "POST",
				"url": "https://acs.sg.com/1.0.2",
				"headers": {
					"Accept": "text/html"
				},
				"body": {
					"termUrl": "https://pass.sample-acs.net/v1/notify/threeds/v1/pares",
					"MD": "eJwljEmSokAAAL8yd2O6imLVCA+oINAKCLLekALZd2ggePz0dF/ylJnEB/xAG8GQLLcRiKRoZgtWnHtkwniZfw2qontZg4mvIv2SrOOGIMERCDJ/CHSg2QMkNpqEcNt/52iDEP1/bdVYFFsyDM0BgKIOgyKp++HAQQ6CKcD93yZYyqgawK/4A6VlbYPzWv0OZu3Gj04+rf6LMlQP8db81Tm7JXBxyrM3cKIYaV7GedZVQdLkWAo6W+ufqbUMjQxLQvkUIG8k384FpmsJfG2fQ0qzI3rulyLFqkPMYD9No8B48rkcrmI59ar3Yk29l6k8EQJPDlc9p+OqPzuxhul33WZx2TvmyNBxswb2U9OmCHFhelH8WI6e3nV2xVACYrHwadbjVpKbxxjWjywfgi7EK3ZWGTMnsSl2baxnlWKWhmXuqpOXX2JBhDDUebZccWyNOagnJHKm+kgz//4OF8oyrWig5hIAw1LL7jNTTkiw76DgJDl2VXKxGc4h0O1W9e4k1b4LPeRfzsh6H4//ANdloIQ=",
					"paReq": "eJxVUslu2zAQ/RVBd5mLLZk2RgzSBlkOCYLGPqSXgss4VmNJDkkHdr4+pKosPXHezPDN4xvC2bHdZa/ofNN3dc4mNM+wM71tuqc6X68uC5FnPqjOql3fYZ2f0OdnElZbh3jxgObgUMIteq+eMGtsnf8RSghqDS0st7yY0WpeaKNZoamwrFpQzSvMJdyf/8IXCeNoGSdPOJAPGCmd2aouSFDm5cfNnWTVdC6AjAhadDcXkvHprKyA/EPQqRblrRpu2hX6AGRIgekPXXAnyUsK5APAwe3kNoS9XxLSjrcmpm+BpAqQLw33hxT5yHRsrFRv9vlxuq0e//6+Ut3O6XV4sFeXpb5e10BSB1gVUHLKBOO0yhhflvMlZUCGPKg2SZDllEY5I4B9mnH+vfI9A9FpFzdzkotkwycCPO7jYmJHdO8zBovexBeMx5f8n9fJUBOSdxsurFa0VJrPNqg0ZTjb2LnhJU8+D02JvoleMUEXA38CQBINGTdIxu3H6L9f8Q7HNMYj"
				}
			}
	  }
  }
}

Le contenu se décompose en :

Objet Fonction
id Identifiant unique de la transaction d’authentification en cours.Il devra être retransmis à chaque nouvel appel.
protocol Indique quel protocole sera effectivement appliqué lors de l’authentification.
value Représente le résultat de l’authentification ou l’instruction à suivre. Si l’attribut responseType indique INSTRUCTION, il s’agit d’une instruction à exécuter, s’il indique RESULT, il s’agit du résultat de l’authentification.

Etape 5 : Préparation de la page de gestion de l’instruction

Si une instruction à été retournée lors de l’étape précédente, la page à afficher lors de cette étape doit permettre :

  • la mise en place d’un listener sur le type d’événement renvoyé par l’iFrame, qui déclenchera un POST vers le serveur marchand avec le résultat d’instruction (cf.étape 15).
  • la création d’iFrame masquée ou visible (cf.étapes 6 et 7).

Etape 6 : Création de l’iFrame

L’instruction reçue lors de l’étape 4 est donc comme suit:

{
    "responseType": "INSTRUCTION",
    "instructionType": "FORM",
    "name": "CHALLENGE",
    "timeout" : "15",
    "target": {
        "element": "IFRAME",
        "visible": true,
        "width": 400,
        "height": 400
    },

    "http": {
        "method": "POST",
        "url": "https://acs.sg.com/1.0.2",
        "headers": {
            "Accept": "text/html"
        },
        "body": {
            "termUrl": "https://pass.sample-acs.net/v1/notify/threeds/v1/pares",
            "MD": "eJwljEmSokAAAL8yd2O6imLVCA+oINAKCLLekALZd2ggePz0dF/ylJnEB/xAG8GQLLcRiKRoZgtWnHtkwniZfw2qontZg4mvIv2SrOOGIMERCDJ/CHSg2QMkNpqEcNt/52iDEP1/bdVYFFsyDM0BgKIOgyKp++HAQQ6CKcD93yZYyqgawK/4A6VlbYPzWv0OZu3Gj04+rf6LMlQP8db81Tm7JXBxyrM3cKIYaV7GedZVQdLkWAo6W+ufqbUMjQxLQvkUIG8k384FpmsJfG2fQ0qzI3rulyLFqkPMYD9No8B48rkcrmI59ar3Yk29l6k8EQJPDlc9p+OqPzuxhul33WZx2TvmyNBxswb2U9OmCHFhelH8WI6e3nV2xVACYrHwadbjVpKbxxjWjywfgi7EK3ZWGTMnsSl2baxnlWKWhmXuqpOXX2JBhDDUebZccWyNOagnJHKm+kgz//4OF8oyrWig5hIAw1LL7jNTTkiw76DgJDl2VXKxGc4h0O1W9e4k1b4LPeRfzsh6H4//ANdloIQ=",
            "paReq": "eJxVUslu2zAQ/RVBd5mLLZk2RgzSBlkOCYLGPqSXgss4VmNJDkkHdr4+pKosPXHezPDN4xvC2bHdZa/ofNN3dc4mNM+wM71tuqc6X68uC5FnPqjOql3fYZ2f0OdnElZbh3jxgObgUMIteq+eMGtsnf8RSghqDS0st7yY0WpeaKNZoamwrFpQzSvMJdyf/8IXCeNoGSdPOJAPGCmd2aouSFDm5cfNnWTVdC6AjAhadDcXkvHprKyA/EPQqRblrRpu2hX6AGRIgekPXXAnyUsK5APAwe3kNoS9XxLSjrcmpm+BpAqQLw33hxT5yHRsrFRv9vlxuq0e//6+Ut3O6XV4sFeXpb5e10BSB1gVUHLKBOO0yhhflvMlZUCGPKg2SZDllEY5I4B9mnH+vfI9A9FpFzdzkotkwycCPO7jYmJHdO8zBovexBeMx5f8n9fJUBOSdxsurFa0VJrPNqg0ZTjb2LnhJU8+D02JvoleMUEXA38CQBINGTdIxu3H6L9f8Q7HNMYj"
        }
    }
}

Les différentes propriétés de l’iFrame à créer se trouvent dans l’élément target:

		"target": {
		  "element": "IFRAME",
		  "visible": true,
		  "width": 400,
		  "height": 400
		}

Si elle doit être visible (attribut value.target.visible à true), alors créer l’iFrame avec ces paramètres (largeur selon width et hauteur selon height) et la montrer, sinon créer une iframe masquée.

Exemple d’implémentation :

    function createInstructionIframe(instruction) {
        // Get instruction container element
        container = document.getElementById('instructionContainer');

        // Clean instruction container
        container.innerHTML = '';

        // Create iframe element
        var iframe = document.createElement('iframe');
        iframe.id = 'instructionIframe';
        iframe.name = 'instructionIframe';
        iframe.src = 'about:blank';
        iframe.style.width = instruction.target.width;
        iframe.style.height = instruction.target.height;
        iframe.style.visibility = instruction.target.visible ? 'visible' : 'hidden';

        // Add iframe to container
        container.appendChild(iframe);

        // Create form to post
        var form = document.createElement('form');
        form.id = 'instructionForm';
        form.name = 'instructionForm';
        form.target = 'instructionIframe';
        form.method = instruction.http.method;
        form.action = instruction.http.url;
        form.style = 'visibility: hidden';

        // Create form body
        Object.keys(instruction.http.body).forEach(function (name) {
            form.innerHTML += '';
        });
        var body = document.createElement('form');

        // Add form to container
        container.appendChild(form);

        // Triger form submit
        form.submit();
    }

Etape 7 : Soumission du formulaire

Une fois l’iFrame créée, il faut la remplir avec un formulaire en suivant les instructions de la balise ‘http’:

"http": {
	"method": "POST",
	"url": "https://acs.sg.com/1.0.2",
	"headers": {
		"Accept": "text/html"
	},
	"body": {
		"termUrl": "https://pass.sample-acs.net/v1/notify/threeds/v1/pares",
		"MD": "eJwljEmSokAAAL8yd2O6imLVCA+oINAKCLLekALZd2ggePz0dF/ylJnEB/xAG8GQLLcRiKRoZgtWnHtkwniZfw2qontZg4mvIv2SrOOGIMERCDJ/CHSg2QMkNpqEcNt/52iDEP1/bdVYFFsyDM0BgKIOgyKp++HAQQ6CKcD93yZYyqgawK/4A6VlbYPzWv0OZu3Gj04+rf6LMlQP8db81Tm7JXBxyrM3cKIYaV7GedZVQdLkWAo6W+ufqbUMjQxLQvkUIG8k384FpmsJfG2fQ0qzI3rulyLFqkPMYD9No8B48rkcrmI59ar3Yk29l6k8EQJPDlc9p+OqPzuxhul33WZx2TvmyNBxswb2U9OmCHFhelH8WI6e3nV2xVACYrHwadbjVpKbxxjWjywfgi7EK3ZWGTMnsSl2baxnlWKWhmXuqpOXX2JBhDDUebZccWyNOagnJHKm+kgz//4OF8oyrWig5hIAw1LL7jNTTkiw76DgJDl2VXKxGc4h0O1W9e4k1b4LPeRfzsh6H4//ANdloIQ=",
		"paReq": "eJxVUslu2zAQ/RVBd5mLLZk2RgzSBlkOCYLGPqSXgss4VmNJDkkHdr4+pKosPXHezPDN4xvC2bHdZa/ofNN3dc4mNM+wM71tuqc6X68uC5FnPqjOql3fYZ2f0OdnElZbh3jxgObgUMIteq+eMGtsnf8RSghqDS0st7yY0WpeaKNZoamwrFpQzSvMJdyf/8IXCeNoGSdPOJAPGCmd2aouSFDm5cfNnWTVdC6AjAhadDcXkvHprKyA/EPQqRblrRpu2hX6AGRIgekPXXAnyUsK5APAwe3kNoS9XxLSjrcmpm+BpAqQLw33hxT5yHRsrFRv9vlxuq0e//6+Ut3O6XV4sFeXpb5e10BSB1gVUHLKBOO0yhhflvMlZUCGPKg2SZDllEY5I4B9mnH+vfI9A9FpFzdzkotkwycCPO7jYmJHdO8zBovexBeMx5f8n9fJUBOSdxsurFa0VJrPNqg0ZTjb2LnhJU8+D02JvoleMUEXA38CQBINGTdIxu3H6L9f8Q7HNMYj"
	}
}
  • la propriété method indique le verbe HTTP à associer au formulaire
  • url indique vers quel serveur doit pointer l’action du formulaire
  • les entêtes de la requête http dans headers
  • les paramètres du formulaire dans body (ici par exemple termUrl, MD et paReq)

Une fois le formulaire généré et placé dans l’iFrame, il ne reste plus qu’à déclencher la soumission au chargement de la page.

Gestion du timeout

Si l’instruction contient l’attribut timeout, alors il faut déclencher un retour vers le serveur d’authentification en émettant un événement de type LYRA_AUTH_INSTRUCTION_RESULT valorisé comme suit:

{
    eventName: 'LYRA_AUTH_INSTRUCTION_RESULT',
    value: {
        name: "Insérer ici le nom de l'instruction reçue en réponse",
        value: 'TIMEOUT',
        protocol: "Insérer ici l'objet protocol reçu en réponse"
    }
}

L’événement sera capté par le listener dont les détails sont décrits à l’étape 15. Cela permettra la poursuite du processus et d’avoir un résultat final.

Etapes 8 à 14 : Authentification de l’utilisateur

Une fois le formulaire posté, le code de la banque émétrice va prendre la main sur le processus afin de permettre l’authentification sécurisée (silencieuse ou interactive). A la fin de cette étape, l’événement LYRA_AUTH_INSTRUCTION_RESULT sera émis depuis l’iFrame afin d’indiquer la fin du processus. Exemple:

{
    "eventName": "LYRA_AUTH_INSTRUCTION_RESULT",
    "value" : {
        "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c",
        "name": "CHALLENGE",
        "protocol": {
            "name": "THREEDS",
            "version": "2.1.0",
        }
    }
}

Etape 15 : Récupération de l’événement JavaScript émis à l’étape 14

Afin d’interpréter l’événemment LYRA_AUTH_INSTRUCTION_RESULT, il est nécessaire de mettre en place un listener sur la page principale. Ce dernier doit être capable de parser du code JSON et peut être écrit ainsi:

window.addEventListener('message', function (messageEvent) {
    
        var data = messageEvent.data;
        try {
            var messageData = JSON.parse(data);
            if (messageData.eventName === 'LYRA_AUTH_INSTRUCTION_RESULT') {
                try {
                    // callback call with messageData.value content
                } catch (err) {
                    // error callback call
                } finally {
                    // always close the iFrame/popin
                }
            }
        } catch (err) {
            // process eventual exceptions during callbacks
        }
    
}, false);

Il convient ensuite de renvoyer ces informations vers le serveur marchand.

Etape 16 : Renvoi au serveur marchand du résultat d’instruction

Une fois le résultat d’instruction récupéré côté serveur marchand, il doit être renvoyé via un nouvel appel au service Charge/Authenticate. L’objet instructionResult sera à rajouter à la requête initiale:

{
  "id": "c82794e9-9c20-44a8-9297-b70e1e7c4006",
  "device": {
    "type": "BROWSER",
    "acceptHeader": "application/json",
    "ip": "89.249.65.28", 
    "javaEnabled": true,
    "language": "en",
    "colorDepth": "1",
    "screenHeight": 1024,
    "screenWidth": 768,
    "timezoneOffset": 0,
    "userAgent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0"
  },
  "productType": "GOODS_OR_SERVICE_PURCHASE",
  "merchant": {
    "mid": "123456"
  },	
  "transactionCategory": "PAYMENT",
  "amount": 1230,
  "currency": "EUR",
  "paymentForm":{
    "pan": "4970100000000014",
    "expiryMonth": "02",
    "expiryYear": "22",
	  "accountType": "DEBIT"
  },
  "instructionResult": {
    "name" : "CHALLENGE",
    "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c",
    "protocol" : {
      "name" : "THREEDS",
      "version" : "1.0.2",
      "challengePreference": "NO_PREFERENCE",
      "simulation": false
    }
  }
}
/**
 * I initialize the PHP SDK
 */
require_once __DIR__ . '/vendor/autoload.php';
require_once __DIR__ . '/keys.php';
require_once __DIR__ . '/helpers.php';

/** 
 * Initialize the SDK 
 * see keys.php
 */
$client = new Lyra\Client();

/**
 * I create a formToken
 */
$store = array("amount" => 250, 
"currency" => "EUR", 
"orderId" => uniqid("MyOrderId"),
"customer" => array(
  "email" => "sample@example.com"
));
$response = $client->post("V4/Charge/CreatePayment", $store);

/* I check if there are some errors */
if ($response['status'] != 'SUCCESS') {
    /* an error occurs, I throw an exception */
    display_error($response);
    $error = $response['answer'];
    throw new Exception("error " . $error['errorCode'] . ": " . $error['errorMessage'] );
}

/* everything is fine, I extract the formToken */
$formToken = $response["answer"]["formToken"];

?>

Etape 17 : Réception de la réponse du serveur de la plateforme de paiement

Tout comme à l’étape 4, le serveur marchand reçoit une nouvelle réponse, qui peut soit être finale (RESULT), soit demander une nouvelle instruction (INSTRUCTION). Dans ce dernier cas, le flux reprend à l’étape 5. Voici l’exemple d’un message final:

{
    "answer": {
        "id": "c82794e9-9c20-44a8-9297-b70e1e7c4006",
  
        "protocol": {
          "name": "THREEDS",
          "version": "1.0.2",
          "challengePreference":"NO_PREFERENCE",
          "simulation":false
        },
  
        "value": {
          "responseType": "RESULT",
          "authenticationId":{
            "authenticationIdType":"xid",
            "value":"c82794e99c2044a89297b70e1e7c4006"
          },
          "status": "SUCCESS",
          "authenticationType": "CHALLENGE",
          "authenticationValue":{
              "authenticationValueType": "CAVV",
              "value": "FsXD4Ox0VEI2MseoR0VhN5pX952I"
          },
          "commerceIndicator": "05",
          "extension": {
            "enrolled": "Y",
            "algorithm": "2",
            "signatureValid": true
          }
        }
      }
  }

Etape 18 : Poursuite des opérations par le Serveur marchand

Si la réponse précédente est un résultat final, le serveur marchand doit analyser le statut du résultat (propriété ‘value.status’) afin de donner une suite à l’opération en cours (autorisation si ‘SUCCESS’ par exemple ou fin du paiement ou de l’enregistrement de carte si ‘FAILED’ …).

Annexes

Exemple de cinématique : Authentification 3DS v1 avec authentification sur l’ACS

  • un appel initial au service Charge/Authenticate avec une carte enrôlée 3DS v1
  • un retour avec une instruction CHALLENGE de redirection vers l’ACS avec un paReq (iFrame visible)
  • une redirection vers l’ACS dans l’iFrame, authentification du porteur
  • une retour via le navigateur avec un résultat d’instruction
  • un nouvel appel au service Charge/Authenticate en transmettant ce résultat
  • un retour du serveur de la plateforme de paiement avec le résultat final d’authentification

Exemple de cinématique : Authentification 3DS v2 avec authentification sur l’ACS

  • un appel initial au service Charge/Authenticate avec une carte enrôlée 3DS v2
  • un retour avec une instruction FINGERPRINT (3DS Method)
  • une redirection vers l’ACS dans l’iFrame invisible, chargement et exécution du code JavaScript de fingerprint de l’ACS
  • une retour via le navigateur avec un résultat d’instruction
  • un nouvel appel au service Charge/Authenticate en transmettant ce résultat
  • un retour du serveur de la plateforme de paiement avec une nouvelle instruction CHALLENGE de redirection vers l’ACS avec un CReq (iFrame visible)
  • l’instruction a lieu (redirection vers l’ACS avec un Creq et interaction utilisateur)
  • le retour via le navigateur est un résultat d’instruction : nouvel appel au service Charge/Authenticate en transmettant ce résultat
  • le retour du serveur est le résultat final d’authentification

Glossaire

3DS Method Code JavaScript de l’ACS exécuté dans le navigateur de l’acheteur à des fins de fingerprinting
3DS Requestor Demandeur lors d’une authentification 3DS, généralement le marchand ou sa passerelle de paiement
3DS Server Serveur 3DS. Composant du domaine du 3DS Requestor qui démarre le processus 3DS v2 et communique avec le DS ou l’ACS lors de l’authentification de transactions. Il facilite l’interaction entre le 3DS Requestor et le DS
ACS Access Control Server. Composant qui vérifie si l’authentification est disponible pour un numéro de carte et authentifie des transactions spécifiques
Application 3DS Requestor Application sur dispositif mobile de l’acheteur qui peut traiter une transaction 3DS grâce à l’usage du SDK 3DS. L’application est possible grâce à l’intégration avec le SDK 3DS.
Challenge Phase d’authentification interactive entre l’acheteur et sa banque (ACS)
CReq Message 3DS v2 de demande d’authentification du porteur de carte, envoyé à l’ACS
DS Directory Server. Composant qui maintient la liste d’intervalles de cartes pour lesquels une authentification peut être disponible et qui permet aux MPIs / 3DS Servers / ACS de communiquer entre eux lors des authentifications.
Fingerprinting Littéralement “prise d’empreinte”. Identification de manière unique de l’acheteur grâce à des informations du navigateur
MPI Merchant Plug-In. Composant qui démarre le processus 3DS v1 et communique avec le DS ou l’ACS lors de l’authentification de transactions
paReq Message 3DS v1 de demande d’authentification du porteur de carte, envoyé à l’ACS
SDK 3DS Kit de développement 3D Secure. Composant software inclus dans une Application 3DS Requestor

Liste des protocoles supportés

Protocole Version
3D Secure 1.0.2
3D Secure 2.1.0

Cartes de test

La page de référence des cartes de test se trouve ici.