Introduction
Mercanet est une solution de paiement de commerce électronique multicanale sécurisée conforme à la norme PCI DSS. Elle vous permet d’accepter et de gérer des transactions de paiement en prenant en compte les règles métiers liées à votre activité (paiement à la livraison, paiement différé, paiement récurrent, paiement en plusieurs fois, …).
L’objectif du présent document est d’expliquer la mise en œuvre de la solution Walletpage SOAP jusqu’au démarrage en production.
A qui s’adresse ce document
Ce document est destiné aux commerçants qui souhaitent souscrire à l’offre Mercanet et utiliser un connecteur fondé sur les échanges SOAP entre leur site Web et les serveurs Mercanet pour permettre à leurs clients de gérer leur wallet oneClick ou leur wallet abonné.
C’est un guide d’implémentation qui s’adresse à l’équipe technique du commerçant.
Pour avoir une vue d’ensemble de la solution Mercanet, nous vous conseillons de consulter les documents suivants :
- Présentation fonctionnelle
- Guide de configuration des fonctionnalités
- Guide du paiement OneClick
- Guide du paiement par abonnement
Prérequis
Une connaissance élémentaire des standards relatifs aux langages de programmation Web pratiqués aujourd’hui, tels que Java, PHP ou .Net, est nécessaire pour développer la connexion à Walletpage SOAP.
Gestion de la clé secrète
Lors de votre inscription, BNP Paribas met à disposition sur Mercanet Téléchargement (voir votre guide de démarrage rapide, annexe « Télécharger la clé secrète »), une clé secrète qui permet de sécuriser les échanges entre votre site et le serveur Mercanet.
Vous êtes responsable de sa conservation et devez prendre toutes les mesures pour :
- en restreindre l'accès ;
- la sauvegarder de manière chiffrée ;
- ne jamais la copier sur un disque non sécurisé ;
- ne jamais l'envoyer (e-mail, courrier) de manière non sécurisée.
La compromission de la clé secrète (et son utilisation par un tiers malveillant) perturberait le fonctionnement normal de votre boutique, et pourrait notamment générer des transactions et des opérations de caisse injustifiées (des remboursements par exemple).
C’est la même clé secrète qui est utilisée sur les différents connecteurs Paypage, Office (M2M), In-App et Walletpage.
Comprendre la gestion des wallets client avec Walletpage SOAP
Le principe général d’un processus de gestion de wallet est le suivant :
1. Lorsque le client initialise l’étape de gestion de wallet, une
requête doit être envoyée au connecteur Walletpage SOAP dont
BNP Paribas fournit l’URL. La requête est alors vérifiée, et
chiffrée si elle est valable (elle est nommée RedirectionData
dans le système). La requête
est envoyée au moyen d’un formulaire en mode POST via HTTPS. Toute autre
solution capable d’envoyer une requête de cette nature fonctionne
également.
2. Le site du commerçant redirige l’application appelante vers l’interface de gestion de wallet avec la requête chiffrée. Celle-ci est déchiffrée et Walletpage permet au client d’effectuer différentes opérations sur son wallet. Pour que le client puisse retourner sur votre site, une réponse est créée et envoyée à l’URL de réponse fournie dans le flux n°1.
Il y a deux notifications de réponses indépendantes :
3. Le serveur de gestion de wallet envoie la réponse manuelle via HTTP(S) POST vers l’URL de réponse manuelle, laquelle est fournie dans la requête de gestion de wallet lorsque le client clique sur « Retour à la boutique » sur la page de gestion de wallet. C’est pourquoi l’URL de réponse normale est également la page vers laquelle le client est redirigé à l’issue des opérations de gestion de wallet. Comme il n’y a aucune garantie que le client clique sur ce lien, la réception de la réponse manuelle n’est pas garantie non plus.
4. Les réponses automatiques sont envoyées indépendamment des réponses manuelles. Elles utilisent également les requêtes HTTP(S) POST envoyées par les serveurs de gestion de wallet mais, cette fois-ci moyennant l’URL de la réponse automatique précisée dans la requête de gestion de wallet. Vous recevez la réponse lorsque le client cliquera sur le bouton « retour à la boutique » ou si la session de gestion du wallet aura expiré.
Démarrer avec Walletpage SOAP en 5 étapes
Étape 1 : souscrire au service
Si votre boutique n’a pas encore été inscrite, vous devez remplir le formulaire d’inscription (en demandant le service abonnement ou le service oneClick) envoyé par BNP Paribas et le retourner à ce dernier.
Si votre boutique est déjà inscrite sur Mercanet, vous devez demander au contact technique d’activer le service abonnement ou le service oneClick.
Si ce n’est pas précisé, Mercanet définit une base wallet dédiée à votre boutique.
Étape 2 : gérer le wallet de vos clients
La requête de gestion de wallet consiste en un appel vers un service Web SOAP. En réponse, ce service Web vous fournira l’URL vers laquelle rediriger l'Internaute ainsi que les champs redirectionData et redirectionVersion. Vous devez effectuer cette redirection via un formulaire HTML au moyen de la méthode POST.
Générer la requête de gestion de wallet
Tous les champs nécessaires pour la gestion de wallet (voir les détails dans le chapitre « Renseigner les champs de la requête ») doivent être fournis.
Syntaxe de la requête
La requête est construite conformément au format SOAP.
<soapenv:Body>
<urn:walletManagementInit>
<urn:input>
<urn:responseKeyVersion>1</urn:responseKeyVersion>
<urn:merchantWalletId>9865578</urn:merchantWalletId>
<urn:requestDateTime> 2014-12-19T14:06:06.273+01:00</urn:requestDateTime>
<urn:interfaceVersion>WMR_WS_2.5</urn:interfaceVersion>
<urn:merchantId>011223744550001</urn:merchantId>
<urn:normalReturnUrl>http://www.normalreturnurl.com</urn:normalReturnUrl>
</urn:input>
</urn:walletManagementInit>
</soapenv:Body>
Sécuriser la requête
La requête contient les paramètres de la transaction et est envoyée par le navigateur Web du client. Il est théoriquement possible pour un pirate d’intercepter la demande et de la modifier avant l’envoi au serveur de paiement.
De ce fait, il est nécessaire de renforcer la sécurité pour assurer l’intégrité des paramètres de la transaction envoyée. Mercanet répond à ce besoin par un échange de signatures qui permet de vérifier :
- l’intégrité des messages requête et réponse ;
- l’authentification de l’émetteur et du destinataire car ils se partagent la même clé secrète.
Comment sécuriser la requête
La sécurisation de la requête est effectuée en calculant la valeur « hashée » conformément aux paramètres de la transaction (donnée Data). Ensuite, la clé secrète y est ajoutée. Toutes les chaînes de caractères sont converties en UTF-8 avant le « hashage ».
L’algorithme de « hashage » génère un résultat irréversible. Lorsqu’un tel message est reçu, le destinataire doit recalculer la valeur « hashée » pour la comparer à celle reçue. Toute différence indique que les données échangées ont été falsifiées ou que le destinataire et l’émetteur ne partagent pas la même clé secrète.
Le résultat doit être envoyé sous forme hexadécimale dans la donnée nommée Seal.
Calcul de la donnée Seal
Algorithme HMAC-SHA
La valeur de la donnée Seal est calculée comme suit :
- concaténation des valeurs des champs de données dans l’ordre
alphabétique (respectant le code de caractères ASCII) des noms des
champs, sauf pour les champs keyVersion et
sealAlgorithm. Donnant la donnée data, mentionnée dans les
exemples ci-dessous.
- exemple : un champ nommé authorResponseMessage est à positionner avant un champ nommé authorisationId ;
- obtention de l’encodage UTF-8 des données du résultat précédent ;
- HMAC avec chiffrement SHA256 des octets obtenus avec la clé secrète.
Cette procédure peut être résumée comme suit :
HMAC-SHA256( UTF-8(sortedDataValues), UTF-8(secretKey))
Si
toutefois vous souhaitiez calculer le sceau avec l'algorithme plus ancien
SHA-256, les paramètres d'entrée de la requête doivent contenir le champ
sealAlgorithm
avec la valeur
suivante : “SHA-256”.
Exemples de code Hmac Sha256
- Exemple d’encodage Hmac Sha256 en Php 5
<?php … // Seal computation thanks to hash sorted data hash with merchant key $data_to_send= utf8_encode($data) $seal=hash_hmac('sha256', $data_to_send, $secretKey); … … ?>
data_to_send et secretKey doivent utiliser un jeu de caractères UTF-8. Référez-vous à la fonction utf8_encode pour la conversion de caractères ISO-8859-1 en UTF-8.
- Exemple d’encodage Hmac Sha256 en Java
import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; public class ExampleHMACSHA256 { /** * table to convert a nibble to a hex char. */ static final char[] hexChar = { '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , 'a' , 'b' , 'c' , 'd' , 'e' , 'f'}; /** * Fast convert a byte array to a hex string * with possible leading zero. * @param b array of bytes to convert to string * @return hex representation, two chars per byte. */ public static String encodeHexString ( byte[] b ) { StringBuffer sb = new StringBuffer( b.length * 2 ); for ( int i=0; i<b.length; i++ ) { // look up high nibble char sb.append( hexChar [( b[i] & 0xf0 ) >>> 4] ); // look up low nibble char sb.append( hexChar [b[i] & 0x0f] ); } return sb.toString(); } /** * Computes the seal * @param Data the parameters to cipher * @param secretKey the secret key to append to the parameters * @return hex representation of the seal, two chars per byte. */ public static String computeSeal(String data, String secretKey) throws Exception { Mac hmacSHA256 = Mac.getInstance("HmacSHA256"); SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256"); hmacSHA256.init(keySpec); return encodeHexString(hmacSHA256.doFinal(data.getBytes())); } /** * @param args */ public static void main(String[] args) { try { System.out.println (computeSeal("parameters", "key")); } catch (Exception e) { e.printStackTrace(); } } }
- Exemple d’encodage Hmac Sha256 en .net
(Exemple effectué à l’aide d’un simple formulaire nommé « Form1 » contenant deux champs texte pour saisir data et txtSecretKey, ainsi qu’un autre champ pour afficher lblHEX).
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Security.Cryptography; namespace ExampleDotNET { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void cmdGO_Click(object sender, EventArgs e) { String sChaine = data.Text; UTF8Encoding utf8 = new UTF8Encoding(); Byte[] encodedBytes = utf8.GetBytes(sChaine); byte[] shaResult; HMAC hmac = new HMAC.Create("HMACSHA256"); var key = "YourSecretKey"; hmac.Key = utf8.GetBytes(key); hmac.Initialize(); shaResult = hmac.ComputeHash(encodedBytes); lblHEX.Text = ByteArrayToHEX(shaResult); } private string ByteArrayToHEX(byte[] ba) { StringBuilder hex = new StringBuilder(ba.Length * 2); foreach (byte b in ba) hex.AppendFormat("{0:x2}", b); return hex.ToString(); } } }
Validation du calcul de seal
Une fois votre calcul de seal mis en place, voici un exemple de requête vous permettant de vérifier que vous retrouvez bien le bon seal :
<urn:walletManagementInit>
<urn:input>
<urn:urn:automaticResponseUrl>https://automatic-response-url.fr/</urn:urn:automaticResponseUrl>
<urn:normalReturnUrl>https://normal-return-url/</urn:normalReturnUrl>
<urn:customerContact>
<urn:email>customer@email.com</urn:email>
</urn:customerContact>
<urn:interfaceVersion>WMR_WS_2.4</urn:interfaceVersion>
<urn:keyVersion>1</urn:keyVersion>
<urn:merchantId>011223344550000</urn:merchantId>
<urn:merchantWalletId>wallet01</urn:merchantWalletId>
<urn:requestDateTime>2018-08-08T16:31:22.589+02:00</urn:requestDateTime>
<urn:seal>5aad3874f828bc427cd58833164bdfcfd8bcdf7b0921addc9ef82e6f82b027ee</urn:seal>
</urn:input>
</urn:walletManagementInit>
Pour la requête ci-dessus, la chaîne concaténée que vous devez calculer est la suivante :
https://automatic-response-url.fr/customer@email.comWMR_WS_2.4011223344550000wallet01https://normal-return-url/2018-08-08T16:31:22.589+02:00
Avec un algorithme de hachage HMAC-SHA-256 et une clé secrète valant :
secret123
Le seal attendu est :
5aad3874f828bc427cd58833164bdfcfd8bcdf7b0921addc9ef82e6f82b027ee
Exemple de requête de gestion du wallet
Ci-dessous, voici un exemple de requête au format XML SOAP 1.1 :
<soapenv:Body>
<urn:walletManagementInit>
<urn:input>
<urn:responseKeyVersion>1</urn:responseKeyVersion>
<urn:merchantWalletId>9865578</urn:merchantWalletId>
<urn:requestDateTime> 2014-12-19T14:06:06.273+01:00</urn:requestDateTime>
<urn:interfaceVersion>WMR_WS_2.5</urn:interfaceVersion>
<urn:merchantId>011223744550001</urn:merchantId>
<urn:normalReturnUrl>http://www.normalreturnurl.com</urn:normalReturnUrl>
<urn:responseEncoding>base64</urn:responseEncoding>
</urn:input>
</urn:walletManagementInit >
</soapenv:Body>
Exemple de formulaire de redirection vers Walletpage SOAP
En réponse à cette requête, vous devez recevoir une réponse (également en XML SOAP 1.1) contenant les champs suivants :
Nom du champ | Description |
---|---|
redirectionData | Token de la requête à fournir lors de la redirection vers les pages de de gestion de wallet. |
redirectionStatusCode | Liste des codes réponse possibles. |
redirectionStatusMessage | Court message donnant le statut de l’initialisation. |
redirectionUrl | Url des pages de gestion de wallet Mercanet vers lesquelles il faut rediriger le client. |
redirectionVersion | Version de la redirection. |
seal | Seal de sortie. |
reponseEncoding | Type d’encodage utilisé dans les réponses. |
Si l’initialisation de la gestion du wallet s’est correctement déroulée, le champ redirectionStatusCode doit être valorisé à « 00 ». Les champs redirectionData, redirectionVersion et redirectionUrl seront également valorisés pour permettre la redirection vers les pages de gestion du wallet Mercanet.
Pour rediriger le client vers les pages de gestion de wallet, vous devez implémenter un formulaire de type POST envoyant les deux champs suivants : redirectionData et redirectionVersion. Le formulaire POST devra rediriger le client vers l’URL fourni dans le champ redirectionUrl.
<form method="post" action=”value of redirectionURL”>
<input type="hidden" name="redirectionVersion" value=”value of redirectionVersion”>
<input type="hidden" name="redirectionData" value=”value of redirectionData”>
</form>
Traiter les erreurs lors de l’initialisation de la gestion de wallet
Tous les champs reçus par Walletpage SOAP à travers le connecteur font l’objet d’une vérification individuelle. Le tableau ci-dessous présente la liste des codes d’erreur pouvant être reçus lors de cette étape ainsi que les solutions à mettre en œuvre.
redirectionStatusCode | Description |
---|---|
00 | Cas normal qui doit être suivi du processus normal d’affichage de l’interface de gestion de wallet. |
03 | L’identifiant commerçant ou le contrat acquéreur ne sont pas valides. |
12 | Paramètres invalides. Vérifiez les paramètres de la requête. |
30 | Le format de la requête est invalide. |
34 | Problème de sécurité : par ex. le sceau calculé est incorrect. |
40 | Fonction non gérée. |
99 | Service temporairement indisponible. |
4 cas sont à prendre en considération :
- RedirectionStatusCode = 00
Ce cas doit être suivi de la redirection de l’utilisateur vers la page de gestion de wallet.
- RedirectionStatusCode = 03, 12, 30, 34, 40
Codes d’erreur indiquant que la requête est incorrecte et doit être corrigée. Le processus doit alors être interrompu.
- RedirectionStatusCode = 99
Ce code indique un problème de disponibilité du service de gestion de wallet. Vous devez essayer de soumettre la requête de nouveau.
Renseigner les champs de la requête
La requête et la réponse de la méthode walletManagementInit sont décrites sur cette page dédiée.
Paramétrer la requête de gestion du wallet
Voici un exemple de paramétrage de la requête de gestion du wallet pour chaque fonctionnalité disponible dans Walletpage SOAP. Le détail de ces fonctionnalités est décrit dans le guide des fonctionnalités, le guide OneClick et le guide Subscription.
Restriction des fonctionnalités client de gestion du wallet
Par défaut, le client a accès à l’ensemble des fonctionnalités de gestion du wallet. Pour restreindre l’accès, il faut préciser la liste des fonctionnalités souhaitées dans le champ WalletActionNameList, comme ici pour ne permettre que d’ajouter ou modifier les moyens de paiement dans son wallet :
<walletActionNameList>
<walletActionName>ADDPM</walletActionName>
<walletActionName>UPDATEPM</walletActionName>
</walletActionNameList>
Restriction dynamique des moyens de paiement
Il faut filtrer ceux qui seront disponibles pour être ajoutés dans le wallet grâce au champ paymentMeanBrandList:
<paymentMeanBrandList>
<paymentMeanBrand>VISA</paymentMeanBrand>
<paymentMeanBrand>PAYPAL</paymentMeanBrand>
</paymentMeanBrandList>
Identification du wallet du client
<merchantWalletId>1205987</merchantWalletId>
Prestataire agissant pour le compte d’un commerçant
Vous devez passer l’identifiant du prestataire dans la requête, dans le champ intermediateServiceProvider, et utiliser la clé secrète de ce dernier pour calculer la donnée Seal :
<intermediateServiceProviderId>241891</intermediateServiceProviderId>
Traiter la réponse
Deux types de réponse sont prévus. Bien que les protocoles, formats et contenus des deux réponses soient exactement les mêmes, elles doivent être gérées de manière différente car elles répondent à deux besoins différents.
Les réponses sont des réponses HTTP(S) POST envoyées aux URL normalReturnUrl (obligatoire - réponse manuelle) et automaticResponseUrl (optionnelle - réponse automatique) précisées dans la requête.
Vous devez mettre en place le système permettant de décoder ces réponses, afin de connaître le résultat de requête.
Les quatre données suivantes sont définies dans les réponses :
Données | Notes/règles |
---|---|
Data | Concaténation des champs en réponse. |
Encode | Type d’encodage utilisé pour la donnée Data. Ce champ est valorisé avec le champ responseEncoding de la requête. |
Seal | Signature du message réponse. |
InterfaceVersion | Version de l’interface du connecteur. |
Si la valeur du champ Encode est “base64” ou “base64url”, la donnée Data doit-être décodée en Base64/Base64Url pour retrouver la chaîne des champs concaténée. La chaîne concaténée est structurée comme suit : clé1=valeur1|clé2=valeur2… Le sceau (donnée Seal) des 2 réponses est « hashé » avec le même algorithme utilisé en entrée et fourni dans le champ sealAlgorithm. Si aucune valeur n’a été définie, la valeur SHA-256 est utilisée par défaut.
La valeur de la donnée Seal est calculée comme suit :
Pour l'algorithme HMAC-SHA :
- utilisation de la clé secrète partagée pour générer la variante HMAC du message ;
- utilisation de la donnée Data uniquement (encodée si l’option correspondante est choisie) ;
- codage UTF-8 des données constituant le résultat de l’opération précédente ;
- « Hashage » HMAC-SHA des octets obtenus.
Cette procédure peut être résumée comme suit :
HMAC-SHA256( UTF-8(Data), UTF-8(secretKey))
Exemple de Seal calculé avec une clé secrète égale à "secret123" et la donnée Data au format POST ci-dessous:
captureDay=0|captureMode=AUTHOR_CAPTURE|currencyCode=978|merchantId=039000254447216|orderChannel=INTERNET|responseCode=00|transactionDateTime=2022-11-14T11:21:12+01:00|transactionReference=SIM20221114112037|keyVersion=1|acquirerResponseCode=00|amount=1000|authorisationId=664865|guaranteeIndicator=N|panExpiryDate=202401|paymentMeanBrand=VISA|paymentMeanType=CARD|customerIpAddress=10.78.106.18|maskedPan=############0600|holderAuthentRelegation=N|holderAuthentStatus=NOT_PARTICIPATING|tokenPan=490700h719850600|transactionOrigin=SIMS|paymentPattern=ONE_SHOT|customerMobilePhone=null|mandateAuthentMethod=null|mandateUsage=null|transactionActors=null|mandateId=null|captureLimitDate=20221114|dccStatus=null|dccResponseCode=null|dccAmount=null|dccCurrencyCode=null|dccExchangeRate=null|dccExchangeRateValidity=null|dccProvider=null|statementReference=null|panEntryMode=MANUAL|walletType=null|holderAuthentMethod=NO_AUTHENT_METHOD|holderAuthentProgram=3DS_V2|paymentMeanId=null|instalmentNumber=null|instalmentDatesList=null|instalmentTransactionReferencesList=null|instalmentAmountsList=null|settlementMode=null|mandateCertificationType=null|valueDate=null|creditorId=null|acquirerResponseIdentifier=null|acquirerResponseMessage=null|paymentMeanTradingName=null|additionalAuthorisationNumber=null|issuerWalletInformation=null|s10TransactionId=6|s10TransactionIdDate=20221114|preAuthenticationColor=null|preAuthenticationInfo=null|preAuthenticationProfile=null|preAuthenticationThreshold=null|preAuthenticationValue=null|invoiceReference=null|s10transactionIdsList=null|cardProductCode=F|cardProductName=VISA CLASSIC|cardProductProfile=C|issuerCode=00000|issuerCountryCode=GRC|acquirerNativeResponseCode=00|settlementModeComplement=null|preAuthorisationProfile=null|preAuthorisationProfileValue=null|preAuthorisationRuleResultList=[{"ruleCode":"VI","ruleType":"NG","ruleWeight":"I","ruleSetting":"S","ruleResultIndicator":"0","ruleDetailedInfo":"TRANS=1:3;CUMUL=24999:200000"},{"ruleCode":"RCode","ruleType":"RType","ruleWeight":"RWeight","ruleSetting":"RSetting","ruleResultIndicator":"RIndicator","ruleDetailedInfo":"DetailedInfo"}]|preAuthenticationProfileValue=null|preAuthenticationRuleResultList=null|paymentMeanBrandSelectionStatus=NOT_APPLICABLE|transactionPlatform=PROD|avsAddressResponseCode=null|avsPostcodeResponseCode=null|customerCompanyName=null|customerBusinessName=null|customerLegalId=null|customerPositionOccupied=null|paymentAttemptNumber=1|holderContactEmail=null|installmentIntermediateServiceProviderOperationIdsList=null|holderAuthentType=null|acquirerContractNumber=3863090010|secureReference=null|authentExemptionReasonList=null|paymentAccountReference=a667b63d8bec4fb980106497c53e4|schemeTransactionIdentifier=b4e683c1a6ff4a09a0415116a0a25b401d38c19d24e643078d|guaranteeLimitDateTime=null|paymentMeanDataProvider=null|virtualCardIndicator=N|cardProductUsageLabel=CREDIT|authorisationTypeLabel=TRANSACTION DE PAIEMENT|authorMessageReference=272612|acceptanceSystemApplicationId=142000000001|challengeMode3DS=null|issuingCountryCode=GRC|abortedProcessingStep=null|abortedProcessingLocation=null
Le Seal que vous devez obtenir est c946655cce0059124b4ad3eb62c0922c51a0a7d8d28a3cf223e4c0da41bbc5b9
Exemple de Seal calculé avec une clé secrète égale à "secret123" et la donnée Data au format JSON ci-dessous:
{"keyVersion":1,"amount":44000,"captureDay":0,"captureMode":"AUTHOR_CAPTURE","currencyCode":"978","customerId":"40813","customerIpAddress":"213.118.246.190","merchantId":"225005049920001","orderAmount":44000,"orderChannel":"INTERNET","responseCode":"97","responseDescription":"Request time-out; transaction refused","transactionDateTime":"2023-03-15.00:39:04+0100","transactionReference":"dd88adfZ1027b40813f40813y1678837075","statementReference":"T7Ft4KKLRA2M11B9","s10TransactionId":"6","s10TransactionIdDate":"20230315","sealAlgorithm":"sha256","transactionPlatform":"PROD","paymentAttemptNumber":2,"preAuthorisationRuleResultList":[{"ruleCode":"VI","ruleType":"NG","ruleWeight":"I","ruleSetting":"S","ruleResultIndicator":"0","ruleDetailedInfo":"TRANS=1:3;CUMUL=24999:200000"},{"ruleCode":"RCode","ruleType":"RType","ruleWeight":"RWeight","ruleSetting":"RSetting","ruleResultIndicator":"RIndicator","ruleDetailedInfo":"DetailedInfo"}]}
Le Seal que vous devez obtenir est 77be1c230491c0d4eef6eaf910f635d42f55c90cd34c5a162c0ef6fcefb3f087
Pour l’algorithme SHA-256 (bien que celui-ci soit la valeur par défaut, cet algorithme n’est plus recommandé à ce jour) :
- concaténation de la donnée Data et de la clé secrète (encodée si l’option correspondante est choisie) ;
- codage UTF-8 des données constituant le résultat de l’opération précédente ;
- « Hashage » SHA256 des octets obtenus.
Cette procédure peut être résumée comme suit :
SHA256( UTF-8(Data+secretKey ) )
Exemple de Seal calculé avec une clé secrète égale à "secret123" et la donnée Data au format POST ci-dessous:
captureDay=0|captureMode=AUTHOR_CAPTURE|currencyCode=978|merchantId=039000254447216|orderChannel=INTERNET|responseCode=00|transactionDateTime=2022-11-14T11:21:12+01:00|transactionReference=SIM20221114112037|keyVersion=1|acquirerResponseCode=00|amount=1000|authorisationId=664865|guaranteeIndicator=N|panExpiryDate=202401|paymentMeanBrand=VISA|paymentMeanType=CARD|customerIpAddress=10.78.106.18|maskedPan=############0600|holderAuthentRelegation=N|holderAuthentStatus=NOT_PARTICIPATING|tokenPan=490700h719850600|transactionOrigin=SIMS|paymentPattern=ONE_SHOT|customerMobilePhone=null|mandateAuthentMethod=null|mandateUsage=null|transactionActors=null|mandateId=null|captureLimitDate=20221114|dccStatus=null|dccResponseCode=null|dccAmount=null|dccCurrencyCode=null|dccExchangeRate=null|dccExchangeRateValidity=null|dccProvider=null|statementReference=null|panEntryMode=MANUAL|walletType=null|holderAuthentMethod=NO_AUTHENT_METHOD|holderAuthentProgram=3DS_V2|paymentMeanId=null|instalmentNumber=null|instalmentDatesList=null|instalmentTransactionReferencesList=null|instalmentAmountsList=null|settlementMode=null|mandateCertificationType=null|valueDate=null|creditorId=null|acquirerResponseIdentifier=null|acquirerResponseMessage=null|paymentMeanTradingName=null|additionalAuthorisationNumber=null|issuerWalletInformation=null|s10TransactionId=6|s10TransactionIdDate=20221114|preAuthenticationColor=null|preAuthenticationInfo=null|preAuthenticationProfile=null|preAuthenticationThreshold=null|preAuthenticationValue=null|invoiceReference=null|s10transactionIdsList=null|cardProductCode=F|cardProductName=VISA CLASSIC|cardProductProfile=C|issuerCode=00000|issuerCountryCode=GRC|acquirerNativeResponseCode=00|settlementModeComplement=null|preAuthorisationProfile=null|preAuthorisationProfileValue=null|preAuthorisationRuleResultList=[{"ruleCode":"VI","ruleType":"NG","ruleWeight":"I","ruleSetting":"S","ruleResultIndicator":"0","ruleDetailedInfo":"TRANS=1:3;CUMUL=24999:200000"},{"ruleCode":"RCode","ruleType":"RType","ruleWeight":"RWeight","ruleSetting":"RSetting","ruleResultIndicator":"RIndicator","ruleDetailedInfo":"DetailedInfo"}]|preAuthenticationProfileValue=null|preAuthenticationRuleResultList=null|paymentMeanBrandSelectionStatus=NOT_APPLICABLE|transactionPlatform=PROD|avsAddressResponseCode=null|avsPostcodeResponseCode=null|customerCompanyName=null|customerBusinessName=null|customerLegalId=null|customerPositionOccupied=null|paymentAttemptNumber=1|holderContactEmail=null|installmentIntermediateServiceProviderOperationIdsList=null|holderAuthentType=null|acquirerContractNumber=3863090010|secureReference=null|authentExemptionReasonList=null|paymentAccountReference=a667b63d8bec4fb980106497c53e4|schemeTransactionIdentifier=b4e683c1a6ff4a09a0415116a0a25b401d38c19d24e643078d|guaranteeLimitDateTime=null|paymentMeanDataProvider=null|virtualCardIndicator=N|cardProductUsageLabel=CREDIT|authorisationTypeLabel=TRANSACTION DE PAIEMENT|authorMessageReference=272612|acceptanceSystemApplicationId=142000000001|challengeMode3DS=null|issuingCountryCode=GRC|abortedProcessingStep=null|abortedProcessingLocation=null
Le Seal que vous devez obtenir est 8fb7c5b7e972ed5a279629757aeae9885cdfc1fd888e6fc03114064e94bb2bf4
Exemple de Seal calculé avec une clé secrète égale à "secret123" et la donnée Data au format JSON ci-dessous:
{"keyVersion":1,"amount":44000,"captureDay":0,"captureMode":"AUTHOR_CAPTURE","currencyCode":"978","customerId":"40813","customerIpAddress":"213.118.246.190","merchantId":"225005049920001","orderAmount":44000,"orderChannel":"INTERNET","responseCode":"97","responseDescription":"Request time-out; transaction refused","transactionDateTime":"2023-03-15.00:39:04+0100","transactionReference":"dd88adfZ1027b40813f40813y1678837075","statementReference":"T7Ft4KKLRA2M11B9","s10TransactionId":"6","s10TransactionIdDate":"20230315","sealAlgorithm":"sha256","transactionPlatform":"PROD","paymentAttemptNumber":2,"preAuthorisationRuleResultList":[{"ruleCode":"VI","ruleType":"NG","ruleWeight":"I","ruleSetting":"S","ruleResultIndicator":"0","ruleDetailedInfo":"TRANS=1:3;CUMUL=24999:200000"},{"ruleCode":"RCode","ruleType":"RType","ruleWeight":"RWeight","ruleSetting":"RSetting","ruleResultIndicator":"RIndicator","ruleDetailedInfo":"DetailedInfo"}]}
Le Seal que vous devez obtenir est e9aa5be21186a9f9a417b82d1d450792851c849ccc8a2f85136897da29477975
Renseigner l’URL de la réponse manuelle
Le principal objectif de la réponse manuelle est de rediriger le client vers votre site web en indiquant le résultat de la gestion de wallet.
La page principale de Mercanet contient le bouton « Retour » avec un lien de redirection vers votre site. Lorsque le client clique sur ce bouton, le serveur Mercanet le redirige vers l’adresse URL contenue dans le champ normalReturnUrl fourni dans la requête. La redirection est une requête HTTP(S) POST qui contient les données de la réponse. Il est de votre responsabilité de récupérer ces paramètres et de vérifier la signature pour ainsi assurer l’intégrité des données de la réponse. De plus, vous avez pour responsabilité d’afficher à votre client les messages pertinents relatifs aux détails de la réponse.
Ce champ normalReturnUrl est également utilisé pour tous les résultats de paiement (annulation, refus...) afin de rediriger vers votre site.
Il est important de noter qu’il est impossible de garantir la réception de la réponse, celle-ci étant envoyée par le navigateur web du client. Tout d’abord, le client a la possibilité de ne pas cliquer sur le lien. Ensuite, la connexion qu’il utilise peut tout simplement avoir un problème et bloquer la transmission de cette réponse. Par conséquent, celle-ci ne peut pas constituer la base unique pour vos processus métier.
Renseigner l’URL de la réponse automatique
La réponse automatique est envoyée seulement si le champ automaticResponseUrl a été envoyé dans la requête de gestion du wallet. Si tel est le cas, le serveur Mercanet envoie une réponse HTTP(S) POST à l’adresse URL reçue.
Les champs de la réponse automatique sont identiques à ceux de la réponse manuelle. La seule différence entre les deux procédures est que la réponse automatique est envoyée directement par le serveur Mercanet sans passer par le navigateur Web du client. Par conséquent, elle est bien plus fiable car elle est toujours envoyée. Le serveur Mercanet n’attend aucune réponse après la transmission de la réponse automatique.
Il vous appartient de récupérer les différentes données de la réponse, vérifier la signature pour vous assurer de l’intégrité des champs de la réponse et, par conséquent, mettre à jour votre back office.
Choisir le format de la réponse : POST ou JSON
A partir de l'interfaceVersion
HP_3.0 Mercanet vous envoie la chaîne concaténée de la réponse (champ
Data) sous 2 formats au choix :
Le format POST
Ce format POST a la structure suivante : clé1=valeur1|clé2=valeur2…
Exemple d'une réponse en POST avec séparateur "pipe" entre les données
merchantId=029000254447216|keyVersion=1|merchantWalletId=2|merchantSessionId=null|customerId=null|customerIpAddress=10.78.106.17
|returnContext=null|walletCreationDateTime=2022-10-19T12:58:01+02:00|walletLastActionDateTime=2022-10-19T12:58:01+02:00
|walletPaymentMeanDataList={paymentMeanId=1, paymentMeanAlias=cb, paymentMeanBrand=CB, maskedPan=############0400, panExpiryDate=202301, mandateId=null, transactionActors=null, paymentMeanBrandSelectionStatus=NOT_APPLICABLE}
|customerCompanyName=null|customerBusinessName=null|customerLegalId=null|customerPositionOccupied=null
Le format JSON
Le format JSON a la structure suivante : { "clé1" : "valeur1", "clé2" : "valeur2", …}
Exemple d'une réponse en JSON
{
"keyVersion":1,"customerIpAddress":"10.78.106.17","merchantId":"029000254447216","merchantWalletId":"2","walletCreationDateTime":"2022-10-19.12:58:01+0200",
"walletLastActionDateTime":"2022-10-19.12:58:01+0200","sealAlgorithm":"sha256",
"walletPaymentMeanDataList":[
{"paymentMeanId":"1","paymentMeanAlias":"cb","paymentMeanBrand":"CB","maskedPan":"############0400","panExpiryDate":"202301","paymentMeanBrandSelectionStatus":"NOT_APPLICABLE"}
]
}
Comportement par défaut à partir de
l'interfaceVersion
HP_3.0
Le format de la réponse automatique et manuelle est déterminé par le connecteur qui a été utilisé lors des échanges HTTPS entre votre site Web et les serveurs de paiement Mercanet.
Interface Version | Connecteur | Format des réponses |
---|---|---|
WMR_WS_3.x | JSON | JSON (JS_3.x) |
HP_3.x | POST | POST (HP_3.x) |
WMR_WS_3.x | SOAP | POST (HP_3.x) |
Choisir les versions des réponses depuis la requête de management du wallet
Si vous souhaitez contourner ce comportement par défaut il est possible de renseigner depuis la requête les versions exactes des réponses automatiques et manuelles que vous utilisez.
Le champs de la requête de management du wallet qui permet de
renseigner la version de la réponse automatique est interfaceVersionAutomaticResponse
Le champs de la requête de management du wallet qui permet de
renseigner la version de la réponse manuelle est interfaceVersionNormalResponse
Ces deux nouveaux champs
interfaceVersionAutomaticResponse
et
interfaceVersionNormalResponse
sont facultatifs mais si
une des versions est renseignée l'autre devient obligatoire également.
Sinon la requête de management du wallet est en echec (code erreur
12).
Résoudre les problèmes de réception des réponses
Vous trouverez ci-dessous une liste des problèmes les plus couramment observés qui bloquent la réception des réponses automatiques et manuelles. Assurez-vous de les avoir vérifiés avant d’appeler le service d’assistance technique :
- vérifiez si les adresses URL de réponse sont fournies dans la requête de gestion du wallet et si elles sont valides. Pour faire cela, vous pouvez tout simplement les copier/coller dans votre navigateur ;
- les adresses URL fournies doivent être accessibles depuis l’extérieur, c'est-à-dire de l’Internet. Le contrôle d’accès (identifiant/mot de passe ou filtre IP) ou le pare-feu peuvent bloquer l’accès à votre serveur ;
- l’accès aux adresses URL de réponse doit être confirmé dans le journal des notifications de votre serveur Web ;
- si vous utilisez un port non standard, il doit être compris entre 80 et 9999 pour assurer la compatibilité avec Mercanet.
Dans certains cas d’erreurs, le serveur Mercanet n’est pas capable de signer le message de réponse. Cela s’applique, par exemple, à l’erreur « MerchantID inconnu » et au cas où la clé secrète est inconnue de Mercanet. Pour ces raisons, le serveur de paiement envoie une réponse sans signature dans le champ Seal.
Récupérer les champs des réponses
Le contenu des réponses Web automatiques et manuelles de Walletpage est identique.
La liste des champs de la réponse est disponible sur cette page.
Analyser la réponse de gestion du wallet
Si vous procédez à une authentification par sceau électronique (seal), vous devez impérativement vérifier que le sceau reçu correspond bien au sceau que vous recalculez avec les champs de la réponse.
Si le sceau reçu ne correspond pas au sceau que vous recalculez, l’état de la session de gestion de wallet est considéré comme inconnu, veuillez contacter le support.
État | Champs de la réponse | Action à réaliser |
---|---|---|
Opération de gestion wallet prise en compte | walletLastActionDateTime renseigné avec la
date/heure courante walletPaymentMeanDataList contient les moyens de paiement du wallet après mise à jour |
Stockez dans votre base client les données suivantes du
wallet :
|
Opération de gestion wallet pas prise en compte | walletLastActionDateTime pas renseigné avec date/heure courante walletPaymentMeanDataList contient les moyens de paiement du wallet |
Si la mise jour wallet est requise alors resoumettez une requête. |
Etape 3 : Tester sur l'environnement de recette
Une fois le développement de la connexion à Mercanet réalisé, vous pouvez effectuer un test sur le serveur Mercanet de recette :
Url : https://payment-webinit-mercanet.test.sips-services.com/services/v2/walletManagementInit
Pour effectuer vos tests, utilisez la boutique et recette ainsi que les cartes mentionnées sur cette page :
merchantId | 211000021310001 |
scretKey | S9i8qClCnb2CZU3y3Vn0toIOgz3z_aBi79akR30vM9o |
keyVersion | 1 |
Cette boutique de test accepte uniquement la devise Euro.
Étape 4 : valider le passage en production
Une fois la connexion de votre site Web à Walletpage SOAP testée, vous êtes à présent en mesure de valider la connexion à Walletpage SOAP de production.
Au préalable, nous conseillons d’isoler votre site Web du public pour éviter que des clients ne génèrent des requêtes pendant cette phase de validation.
Si vous souhaitez personnaliser vos pages de paiement et de gestion de wallet, vous pouvez utiliser notre outil CustomPages, permettant de tester et visualiser le rendu des pages. Pour cela, merci de vous référer à la documentation CustomPages afin d’utiliser l’outil.
Pour basculer sur le serveur de production, vous devez changer l’URL pour vous connecter au serveur Mercanet de production en utilisant les identifiants merchantId, secretKey et keyVersion reçus lors l’inscription.
URL | https://payment-webinit.mercanet.com/services/v2/walletManagementInit |
merchantId | Identifiant de la boutique reçu par mail |
SecretKey | Clé secrète que vous récupérez via l’extranet Mercanet Téléchargement |
keyVersion | Version clé secrète récupérée sur Mercanet Téléchargement (logiquement 1 pour la 1ère clé) |
Comment valider le bon fonctionnement en production
- Initiez un wallet en ajoutant une première carte dedans.
- Vérifiez que le wallet a bien été créé.
- Ajoutez une deuxième carte dans un wallet existant si l’option multicarte a été souscrite.
- Vérifiez que la 2e carte a bien été ajoutée.
Étape 5 : Démarrer en production
Une fois la validation du passage en production effectuée, ouvrez votre site au public pour permettre à vos clients d’ajouter des moyens de paiement dans leur wallet.