1. PREREQUIS POUR FAIRE FONCTIONNER LE FORMULAIRE DE TEST
- Configuration du serveur :
- PHP 7.2 mini
- PHP Curl activé
- Gestionnaire de dépendance « Composer » installé sur le serveur
- Configurer le site pour que toutes les url soient redirigées vers le fichier index.php (via un fichier htaccess [AM1] ou une configuration serveur[AM2] )
- Exemple Apache
<Directory "/var/www/htdocs"> RewriteEngine on RewriteBase "/var/www/htdocs" RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php [L,QSA] </Directory>
- Exemple .htaccess
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.*$ /index.php [L,QSA]
- Configuration CENTRALPAY :
- Détenir des identifiants de compte permettant les appels vers l’API Centralpay
- Autoriser le HOST du formulaire dans le menu configuration Compte (BO Centralpay)
2. INSTALLATION ET CONFIGURATION DU FORMULAIRE
- Copier les sources sur le serveur Web
- Dézipper et se positionner dans le répertoire la l’application
- Lancer la commande « composer update » afin de télécharger les librairies suivantes :
- twig/twig (https://packagist.org/packages/twig/twig)
- curl/curl (https://packagist.org/packages/curl/curl)
- league/rout (https://packagist.org/packages/league/route)
- league/container (https://packagist.org/packages/league/container)
- symfony/dotenv (https://packagist.org/packages/symfony/dotenv)
- laminas/laminas-diactoros (https://packagist.org/packages/laminas/laminas-diactoros)
- laminas/laminas-httphandlerrunner (https://packagist.org/packages/laminas/laminas-httphandlerrunner)
ces librairies sont nécessaires au bon fonctionnement du formulaire de test 3DS 2.0
- Configurer le formulaire par intermédiaire du fichier « .env » qui se situe à la racine du dossier.
APP_ENV=dev HOST_CENTRALPAY_API_CORE='https://test-api.centralpay.net/v2/rest/' POS_UUID='change_it' API_USER='change_it' API_PASSWORD='change_it'
Champ | Description |
---|---|
APP_ENV | En développement, le code utilise toujours la même adresse IP (8.8.8.8) En production, utiliser l’adresse IP du client |
HOST_CENTRALPAY_API_CORE | Url de l’api Centralpay : 'https://test-api.centralpay.net/v2/rest/’ pour le mode test |
POS_UUID | Uuid du point de vente |
API_USER | Login de compte API |
API_PASSWORD | Password de compte API |
Une fois la configuration effectuée, le formulaire est utilisable.
3. ARBORESCENCE DOSSIERS/FICHIERS
- Répertoire « css » : comprend la librairie Bootstrap pour gérer la mise en page du formulaire
- Répertoire « js » : comprend les librairies jquery,boostrap et jquery.validate pour gérer les appels javascripts, validation du formulaire, etc..
- Répertoire « templates » : contient les fichiers gérants l’affichage du formulaire
- Répertoire « vendor » : contient les librairies télécharger par composer
- Fichier « .env » : fichier de configuration du formulaire
- Fichier « composer.json » : fichier de configuration de Composer
- Fichier index.php : fichier comprenant l’ensemble des actions permettant de gérer le formulaire.
4. PAGE FORMULAIRE DE PAIEMENT
Au chargement du formulaire dans votre navigateur, la formulaire affiche les éléments suivants :
Plusieurs numéros de carte de test sont fournis :
Numéro de carte | Nom de l'action | Description |
---|---|---|
4000001000000091 | BROWSER_CHALLENGE | Challenge à effectuer pour que le paiement soit accepté |
4000001000000067 | AUTHENTICATED_BROWSER_FRICTIONLESS | Paiement accepté sans avoir à effectuer le challenge |
4000001000000075 | NOT_AUTHENTICATED_BROWSER_FRICTIONLESS | Paiement refusé sans avoir à effectuer le challenge |
4000000000000002 | Pas dans le range | Paiement accepté sans avoir à effectuer le challenge |
4234123412340002 | NOT_ENROLLED | Paiement refusé carte non reconnue 3DS2.0 mais valide 3DS1.0 |
5. PRINCIPE DE FONCTIONNEMENT DU FORMULAIRE
Toutes les étapes du formulaire se réalisent sur une seule et même page (mode Iframe intégrée). Pas de redirection vers une page bancaire ou autre.
Dans cet exemple, les vérifications sont basiques (champs complétés, validité de l’adresse email) : il n’y a pas de vérification sur le format des données par exemple
13DS Versioning
Lorsque le client clique sur le bouton « Submit », si les données du formulaire sont valides, un appel ajax est effectué vers l’url suivante de l’API Centralpay : « 3ds2/versioning »
Remarque : seul le numéro de carte est envoyé à l’API.
Exemple d’appel de l’api dans le fichier « index.php » Tag ##API_VERSIONING##
23DS Method
Requête réalisée en backend par le navigateur vers la banque simultanément avec l’authentification.
Une Iframe appelle l’url retournée par l’appel de l’API « 3ds2/versioning ».
Cette url correspond à l’élément : « threeDSMethodDataForm.threeDSMethodData » retourné par l’API.
33DS Authentication
Requête réalisée en parallèle simultanément avec le 3DS Method.
Un autre appel Ajax est adressé vers l’url suivante de l’API CentralPay : « 3ds2/authentication »
Exemple d’appel de l’api dans le fichier « index.php » Tag ##API_AUTHENTICATION##
Les informations adressées à l’API concernent le navigateur du client :
- Langue du navigateur,
- Dimensions de l’écran,
- etc.
D’autres valeurs sont également retournées tels que les champs suivants :
- threeDSServerTransID : retourné par l’appel à 3ds2/versionning
- acctNumber : numéro de carte
- deviceChannel : laisser 02
- messageCategory : laisser 01
- purchaseAmount : montant du paiement en centimes
- purchaseCurrency : devise du paiement
- threeDSRequestorAuthenticationInd : laisser 01
- notificationURL : url de notification après le challenge
- threeDSRequestorURL : url du site appelant l’API
En fonction de ces données, l’api va retourner un statut de transaction (« transStatut »).
- Si Y ou A : la transaction est directement validée,
- Si N : la transaction est automatiquement refusée,
- Pour les valeurs C ou D, il sera nécessaire d’effectuer un ‘challenge’ pour valider la transaction.
- Pour tout autres valeurs, il y a un soucis au niveau de l'authentification.
Si le client doit effectuer un challenge, une Iframe soumet un formulaire à l’url retournée par l’API lors de l’appel à « 3ds2/authentication ».
Cette url correspond à la valeur : acsURL
Le seul paramètre envoyé est : creq qui comprend la valeur base64EncodedChallengeRequest
A la fin du challenge, l’url configurée (paramètre notificationURL ) dans l’appel « 3ds2/authentication » est appelée.
43DS Challenge
Les informations concernant la challenge sont disponibles dans la variable cres qui est accessible avec le méthode POST. C’est variable est une donnée JSON encodée en base 64.
Pour décoder cette valeur il suffit d’utiliser les fonctions suivantes :
$retour = json_decode(base64_decode($_POST['cres']), true)
Si au retour du challenge le statut de transaction (transStatus) est égal à Y ou A alors le client a effectué le challenge correctement et le paiement est accepté.
Si le statut de transaction est égal à une autre valeur alors le client n'a pas effectué le challenge correctement et le paiement est refusé.
Il est alors nécessaire d’appeler l’url suivante de l’API :
« 3ds2/results/'.$retour['threeDSServerTransID']”
Exemple d’appel de l’api dans le fichier « index.php » Tag ##API_3DS2_RESULTS##
Cet appel nous retournera toutes les informations concernant l’OTP réalisé par le client. Ces informations seront nécessaires pour finaliser la transaction.
Pour finaliser celle-ci il faut appeler l’objet transaction de l’API :
Exemple d’appel de l’api dans le fichier « index.php » Tag ##API_TRANSACTION##
Paramètres disponibles :
Nom du champ | Description |
---|---|
currency | Devise du paiement |
amount | Montant en centimes |
endUserIp | Adresse IP du client |
merchantTransactionId | Référence de la transaction du marchand |
pointOfSaleId | Uuid du point de vente |
browserUserAgent | User agent du navigateur |
browserAcceptLanguage | Langue du navigateur |
card[number] | Numéro de la carte bancaire |
card[cvc] | Cvc de la carte bancaire |
card[expirationMonth] | Mois d’expiration de la carte bancaire |
card[expirationYear] | Année d’expiration de la carte bancaire |
card[holderName] | Nom du porteur de carte |
order[cardholderEmail] | Email du client |
card[holderEmail] | Email du client |
order[firstName] | Prénom du client |
order[email] | Email du client |
3ds[xid] | Identifiant unique du 3ds auto généré par le site marchand |
3ds[cavv] | AuthenticationValue reçu de l’appel 3ds2/result |
3ds[eci] | Eci reçu de l’appel 3ds2/result |
3ds[status] | TransStatus reçu de l’appel 3ds2/result |
3ds[threeDSServerTransID] | L'ID de serveur 3DS, reçu de l’appel 3ds2/result |
Si le code de retour http de la transaction est égal à 200, alors la transaction est valide.
ANNEXE A : SCHEMA
ANNEXE B : EXEMPLE FORMULAIRE
Formulaire de paiement
Challenge
- 1234 retourne Y pour Challenge réussi
- 4444 retourne A pour Challenge réussi
- 1111 retourne N pour Challenge échoué
- 2222 retourne R pour Challenge échoué
- 3333 retourne U pour Challenge échoué