3DS avec l'API JavaScript 3DS
Ce guide décrit toutes les étapes requises pour ajouter l'authentification 3DS à votre intégration Mastercard Gateway à l'aide de l'API 3DS JavaScript(JS), notamment comment utiliser le résultat de l'authentification pour traiter un paiement.
Pour voir des exemples de demandes et de réponses d'API utilisées dans le flux 3DS avec l'API 3DS JavaScript, téléchargez la collection Postman.
Pour plus d'informations sur certaines fonctionnalités génériques de l'authentification 3DS dont vous pouvez tirer parti dans votre intégration, voir Questions fréquentes. Une fois votre intégration terminée, voir Tester l'intégration 3DS pour la tester.
Conditions préalables
Pour utiliser l'authentification 3DS avec l'API 3DS JS :
- Implémentez l'intégration Hosted Session de base.
- Implémentez les opérations de paiement ultérieures que vous souhaitez utiliser avec la session créée.
- Créez une session distincte pour recueillir les détails de la carte avant de poursuivre la session d'authentification.
Étape 1 : Créer et mettre à jour une session
3DS JS utilise l'authentification basée sur la session. Pour plus d'informations sur l'authentification basée sur la session, voir Options d'authentification. La première étape consiste à créer une session que vous pouvez mettre à jour à l'aide des champs de demande et des valeurs que vous voulez stocker dans la session.
Vous pouvez créer une session à l'aide de la demande CREATE SESSION (Créer une session). Il s'agit d'une demande d'API WS côté serveur, qui est une condition préalable à l'intégration avec l'API JS. Les champs suivants sont retournés :
session.id
Identifiant de session unique que vous devez fournir lors des demandes suivantes pour faire référence au contenu de la session.session.authenticationLimit
Limite du nombre de demandes de transaction que le navigateur du payeur peut soumettre. Vous pouvez indiquer une valeur dans la demande ou utiliser la valeur par défaut de la passerelle. Par défaut, la passerelle définit ce champ sur 5, mais vous pouvez indiquer une valeur allant jusqu'à 25. Cette limite empêche les utilisateurs malveillants d'utiliser la demande d'authentification, comme pour une attaque potentielle par carte de crédit volée, et d'effectuer des attaques par déni de service (DoS) sur votre site en soumettant un grand nombre de transactions (potentiellement facturables).Toutes les tentatives d'authentification que vous lancez sont vérifiées par rapport à la limite d'authentification.session.aes256Key
Clé que vous pouvez utiliser pour décrypter les données sensibles transmises à votre site Web via le navigateur ou l'appareil mobile du payeur.session.version
Version de la session. Vous pouvez utiliser ce champ pour implémenter un verrouillage optimiste du contenu de la session.session.updateStatus
Résumé du résultat de la dernière tentative de modification de la session.
Après avoir créé la session, vous pouvez ajouter ou mettre à jour des champs dans une session à l'aide de la demande UPDATE SESSION (Mettre à jour la session). Cela vous permet d'ajouter des données de paiement et de payeur dans une session, qui peuvent ensuite devenir l'entrée pour déterminer le risque associé à un payeur dans une opération d'authentification. Le tableau suivant définit les champs couramment utilisés dans une session.
Tableau : Champs de session
Champ | Obligatoire/Facultatif | Description |
---|---|---|
session.id ou sourceOfFunds.provided.card.* ousourceOfFunds.token
|
Obligatoire | Détails de la carte utilisée pour le paiement. Vous pouvez également utiliser des jetons de réseau et des jetons de paiement mobile comme source de fonds dans l'authentification du payeur. Pour plus d'informations, voir la rubrique Questions fréquentes. |
order.amount
|
Obligatoire | Montant total de la commande. |
order.currency
|
Obligatoire | Devise de la commande. |
transaction.id
|
Obligatoire | Identifiant unique de cette authentification de paiement. |
order.id
|
Obligatoire | Identifiant unique de cette commande. |
authentication.channel
|
Obligatoire | Canal dans lequel la demande d'authentification est initiée. Vous pouvez spécifier l'un des éléments suivants :
|
authentication.redirectResponseUrl
|
Obligatoire | URL vers laquelle vous souhaitez rediriger le payeur après avoir terminé le processus d'authentification du payeur. Vous n'avez pas besoin de fournir cette URL si vous êtes certain qu'il n'y aura aucune interaction avec le payeur. |
authentication.purpose
|
Facultatif | Objectif de l'authentification. Par défaut, ce champ est défini sur « PAYMENT_TRANSACTION » pour indiquer que l'authentification doit être effectuée lors du traitement d'un paiement par carte. Cependant, vous pouvez spécifier un motif différent pour indiquer l'authentification hors paiement. Si vous établissez une entente de paiement et ne traitez pas de paiement en même temps, indiquez ADD_CARD comme objectif d'authentification. Voir Comment puis-je soumettre une demande d'authentification hors paiement ? Les détails de l'entente doivent être indiqués. |
authentication.acceptVersions
|
Facultatif | Versions 3DS que vous acceptez pour ce paiement. Si vous ne spécifiez pas de version, 3DS2 est accepté. La passerelle utilise l'authentification 3DS2, si prise en charge par l'émetteur et la carte. Si l'authentification 3DS2 n'est pas disponible, l'authentification ne se poursuit pas. |
order.merchantCategoryCode
|
Facultatif | Code de catégorie de commerçant. Fournissez la valeur si vous souhaitez remplacer la valeur par défaut configurée sur votre lien acquéreur. |
Étape 2 : Initialiser l'API
Référencez l'API 3DS JS (threeDS.js) à partir des serveurs de passerelle. Cela place un objet ThreeDS dans la fenêtre/l'espace de noms global.
Une fois une session créée, initialisez l'API 3DS JS à l'aide de la fonction configure() avec les arguments obligatoires suivants dans l'objet map threedsConfig :
merchantId
Votre identifiant de commerçant sur la passerelle.sessionId
ID de session que vous avez créé à l'aide de la demande CREATE SESSION (Créer une session).- ID
containerId
<div> dans votre code HTML où l'API injectera une iFrame masquée. callback
Fonction à appeler une fois l'API initialisée.configuration
Valeur JSON prenant en charge des éléments de données tels que userLanguage (langue de la page de paiement affichée à l'utilisateur ; facultatif) et wsVersion (version de l'API WS).
La fonction configure() doit être appelée pendant le chargement de la page ou lorsque le DOM est prêt. Elle ne doit être appelée qu'une seule fois pour le chargement de la page. Après avoir appelé cette méthode, 3DS JS fournit des valeurs de configuration en tant que variables membres.
<html> <head> <script src="../../../../../../../static/threeDS/1.3.0/three-ds.min.js" data-error="errorCallback" data-cancel="cancelCallback"> </script> <script type="text/javascript"> //The output of this call will return 'false', since the API is not configured yet console.log(ThreeDS.isConfigured()); /** Configure method with the configuration{} parameter set and demonstrates the state change of the ThreeDS object before and after the configure method is invoked. */ ThreeDS.configure({ merchantId: {merchantId}, sessionId: {sessionId}, containerId: "3DSUI", callback: function () { if (ThreeDS.isConfigured()) console.log("Done with configure"); }, configuration: { userLanguage: "en-AU", //Optional parameter wsVersion: 81 } }); //The output of this call will return 'true', since the API is configured console.log(ThreeDS.isConfigured()); //The output of the following code might look like "ThreeDS JS API Version : 1.2.0" console.log("ThreeDS JS API Version : " + ThreeDS.version); </script> </head> <body> <div id="3DSUI"></div> </body> </html>
Étape 3 : Initier l'authentification
Une fois toutes les données du payeur et du paiement recueillies dans une session, vous pouvez initier l'authentification en appelant la fonction initiateAuthentication(). Cette fonction appelle la demande INITIATE AUTHENTICATION (Initier l'authentification) de l'API Payer Authentication (Authentification du payeur) et détermine les versions d'authentification du payeur disponibles pour une carte donnée, en fonction des éléments suivants :
- les versions 3DS configurées sur votre profil de commerçant,
- le type de carte,
- les préférences que vous avez indiquées dans la demande,
- la version de l'authentification 3DS à laquelle la carte a été inscrite,
- les règles de filtrage des transactions 3DS configurées par vous ou votre Your payment service provider (PSP)
La fonction permet également à toutes les activités en arrière-plan, telles qu'un appel de la méthode ACS 3DS2, d'être exécutées afin de, par exemple, recueillir des données de payeur supplémentaires pour prendre en charge une méthode authenticatePayer().
Vous pouvez lancer l'authentification en appelant la fonction initiateAuthentication() avec les arguments obligatoires suivants :
transactionId
Identifiant unique de cette authentification de paiement.orderId
Identifiant unique de cette commande.callback
Fonction de rappel.optionalParams (optional)
Champs supplémentaires, tels que correlationId.
Si l'authentification 3DS du payeur est disponible, les champs suivants sont renvoyés dans l'argument data de la fonction de rappel. Sinon, la réponse inclut une erreur.
data.restApiResponse
Réponse brute de l'appel de l'API REST Initiate Authentication (Initier l'authentification).data.correlationId
Dernier ID de corrélation utilisé pour effectuer l'appel de l'API REST Initiate Authentication (Initier l'authentification). Il vous permet de faire correspondre la réponse à la demande.data.gatewayRecommendation
Recommandation sur vos prochaines actions, basée sur les règles de filtrage des transactions 3DS configurées par vous ou votre prestataire de services de paiement :PROCEED
:Vous pouvez passer à l' étape 4 pour authentifier le payeur.RESUBMIT_WITH_ALTERNATIVE_PAYMENT_DETAILS
:demandez au payeur des informations de paiement alternatives, par exemple une nouvelle carte ou un autre mode de paiement, puis soumettez à nouveau la demande avec les nouvelles informations. Ne soumettez pas à nouveau la même demande.
data.authenticationVersion
Renvoie l'authentification 3DS2 si celle-ci est disponible.
var optionalParams = { sourceOfFunds: { type: "CARD" }, order: { walletProvider: "MASTERPASS_ONLINE" } }; ThreeDS.initiateAuthentication({orderId}, {transactionId}, function (data) { if (data && data.error) { var error = data.error; //Something bad happened, the error value will match what is returned by the Authentication API console.error("error.code : ", error.code); console.error("error.msg : ", error.msg); console.error("error.result : ", error.result); console.error("error.status : ", error.status); } else { console.log("After Initiate 3DS ", data); //data.response will contain information like gatewayRecommendation, authentication version, and so on. console.log("REST API raw response ", data.restApiResponse); console.log("Correlation Id", data.correlationId); console.log("Gateway Recommendation", data.gatewayRecommendation); console.log("HTML Redirect Code", data.htmlRedirectCode); console.log("Authentication Version", data.authenticationVersion); switch (data.gatewayRecommendation) { case "PROCEED": authenticatePayer();//merchant's method break; case "RESUBMIT_WITH_ALTERNATIVE_PAYMENT_DETAILS": tryOtherPayment();//Card does not support 3DS and transaction filtering rules require 3DS on this transaction: Ask the payer to select a different payment method. break; } } }, optionalParams);
{ "authentication":{ "3ds2":{ "methodCompleted":false, "methodSupported":"SUPPORTED" }, "redirect":{ "customized":{ "3DS":{ "methodPostData":"eyJ0aHJlZURTTWV0aG9kTm90aWZpY2F0aW9uVVJMIjoiaHR0cHM6Ly9xYTA0LmdhdGV3YXkubWFzdGVyY2FyZC5jb20vY2FsbGJhY2tJbnRlcmZhY2UvZ2F0ZXdheS80ZjNmMGQyMjM5NzQwODE2OWIwMWFiYzg2OTQyZTY5NzBmODA2M2M0MDU4ZjAzNjNlOTFlMmJiOTNkOTA0NzU3IiwidGhyZWVEU1NlcnZlclRyYW5zSUQiOiJhYWY5YjU5ZC0yZTA0LTRjZDUtOTQzOC01OGU4MGEzNzBiNWEifQ==", "methodUrl":"<method_url>" } } }, "redirectHtml":"<div id=\"initiate3dsSimpleRedirect\" xmlns=\"http://www.w3.org/1999/html\"> <iframe id=\"methodFrame\" name=\"methodFrame\" height=\"100\" width=\"200\" > </iframe> <form id =\"initiate3dsSimpleRedirectForm\" method=\"POST\" action=\"https://<host_name>/acs/v2/method\" target=\"methodFrame\"> <input type=\"hidden\" name=\"threeDSMethodData\" value=\"eyJ0aHJlZURTTWV0aG9kTm90aWZpY2F0aW9uVVJMIjoiaHR0cHM6Ly9xYTA0LmdhdGV3YXkubWFzdGVyY2FyZC5jb20vY2FsbGJhY2tJbnRlcmZhY2UvZ2F0ZXdheS80ZjNmMGQyMjM5NzQwODE2OWIwMWFiYzg2OTQyZTY5NzBmODA2M2M0MDU4ZjAzNjNlOTFlMmJiOTNkOTA0NzU3IiwidGhyZWVEU1NlcnZlclRyYW5zSUQiOiJhYWY5YjU5ZC0yZTA0LTRjZDUtOTQzOC01OGU4MGEzNzBiNWEifQ==\" /> </form> <script>document.getElementById(\"initiate3dsSimpleRedirectForm\").submit();</script> </div>", "version":"3DS2" }, "order":{ "currency":"AUD", "status":"AUTHENTICATION_INITIATED" }, "response":{ "gatewayCode":"AUTHENTICATION_IN_PROGRESS", "gatewayRecommendation":"PROCEED" }, "result":"SUCCESS", "sourceOfFunds":{ "provided":{ "card":{ "number":"512345xxxxxx0008" } }, "type":"CARD" }, "transaction":{ "authenticationStatus":"AUTHENTICATION_AVAILABLE" }, "version":"72" }
Étape 4 : Authentifier le payeur
Si la réponse INITIATE AUTHENTICATION (Initier l'authentification) a indiqué que l'authentification est disponible (transaction.authenticationStatus=AUTHENTICATION_AVAILABLE), vous pouvez authentifier le payeur. Appelez la fonction authenticatePayer() lorsque le payeur clique sur le bouton Payer maintenant sur la page de paiement. La fonction appelle la demande AUTHENTICATE PAYER (Authentifier le payeur) de l'API Payer Authentication (Authentifier le payeur).
Vous devez appeler la fonction authenticatePayer()
en fournissant les arguments obligatoires suivants :
orderId
Même ID de commande que celui que vous avez utilisé dans la fonctioninitiateAuthentication()
précédente.transactionId
Même ID de transaction que celui que vous avez utilisé dans la fonctioninitiateAuthentication()
précédente.callback
Fonction de rappel.optionalParams(Optional)
Champs supplémentaires de demande AUTHENTICATE PAYER (Authentifier le payeur) tels que la facturation et l'expédition.
Les champs suivants sont retournés dans l'argument data
de la fonction de rappel :
data.restApiResponse
Réponse brute de la requête AUTHENTICATE PAYER (Authentifier le payeur). Les champs retournés dépendent du flux en vigueur (sans friction ou authentification) et du canal d'authentification défini pour la session. Pour une demande authentifiée par session, la réponse est filtrée pour supprimer les données qui ne sont pas liées au payeur et seuls les champs sur liste blanche sont renvoyés. Pour plus d'informations, voir Principes de base des sessions.data.correlationId
Dernier ID de corrélation utilisé pour exécuter la demande AUTHENTICATE PAYER (Authentifier le payeur). Il vous permet de faire correspondre la réponse à la demande.data.gatewayRecommendation
PROCEED :
vous pouvez poursuivre et terminer le processus d'authentification (flux d'authentification) ou terminer le paiement (flux sans friction). Si l'autorisation de paiement a réussi, procédez à la collecte des fonds et, le cas échéant, expédiez les marchandises.DO_NOT_PROCEED_ABANDON_ORDER :
ne soumettez pas la même demande à nouveau. Le prestataire de services de paiement, le système ou l'émetteur vous demande d'abandonner la commande.RESUBMIT_WITH_ALTERNATIVE_PAYMENT_DETAILS :
Demandez au payeur d'autres détails de paiement (par exemple, une nouvelle carte ou un autre mode de paiement) et soumettez à nouveau la demande avec les nouveaux détails. Ne soumettez pas à nouveau la même demande.data.htmlRedirectCode
Code de redirection. SigatewayRecommendation
a la valeur PROCEED, insérez ce code sur la page affichée au payeur.
Recommandation sur vos prochaines actions, basée sur les règles de filtrage des transactions d'authentification 3DS configurées par vous ou votre your payment service provider :
Si la passerelle vous recommande de PROCEED
:
- Si le serveur ACS a sélectionné un flux sans friction pour le payeur, il redirige le navigateur du payeur directement vers votre site Web et vous pouvez passer à l' étape 5 pour soumettre un paiement ultérieur à la passerelle. La passerelle obtient les données d'authentification liées au paiement et garantit que les paiements ne sont traités que si toutes les règles de filtrage des transactions 3DS (configurées par vous ou votre your payment service provider) ont été respectées.
- Si le serveur ACS a sélectionné un flux d'authentification pour le payeur, redirigez celui-ci vers le serveur ACS en utilisant le champ
htmlRedirectCode
fourni dans la réponse. Une fois l'authentification terminée, le serveur ACS redirige le payeur vers votre site Web et déclenche un rappel contenant les champsorderId
,transactionId
,gatewayRecommendation
etrestApiResponse
. Déterminez le résultat de la demande d'authentification en fonction du champgatewayRecommendation
. Les mêmes règles s'appliquent que celles décrites ci-dessus pour la réponse de la fonctionauthenticatePayer()
. Si la recommandation est PROCEED, passez à l'étape 5.
var optionalParams = { fullScreenRedirect: true, billing: { address: { city: "London", country: "GBR" } } }; ThreeDS.authenticatePayer({orderId}, {transactionId}, function (data) { if (!data.error) { //data.response will contain all the response payload from the AUTHENTICATE_PAYER call. console.log("REST API response ", data.restApiResponse); console.log("HTML redirect code", data.htmlRedirectCode); displayReceipt(data); } }, optionalParams); function displayReceipt(apiResponse) { var responseBody = { "apiResponse": apiResponse }; var xhr = new XMLHttpRequest(); xhr.open('PUT', '3dsreceipt', true); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.onreadystatechange = function () { if (xhr.readyState == XMLHttpRequest.DONE) { document.documentElement.innerHTML = this.response; } } xhr.send(JSON.stringify(responseBody)); }
{ "authentication":{ "3ds":{ "transactionId":"6dfa4509-1bf2-425b-965b-d44dd11f5f91" }, "3ds2":{ "3dsServerTransactionId":"8c4a911c-289a-46c2-a615-887e1cc01a6a", "acsTransactionId":"2a8234c9-e8ac-449d-a693-97a113b491fc", "directoryServerId":"A000000004", "dsTransactionId":"6dfa4509-1bf2-425b-965b-d44dd11f5f91", "methodCompleted":false, "methodSupported":"SUPPORTED", "protocolVersion":"2.1.0", "requestorId":"test2ID", "requestorName":"test2Name", "transactionStatus":"C" }, "method":"OUT_OF_BAND", "payerInteraction":"REQUIRED", "redirect":{ "customized":{ "3DS":{ "acsUrl":"https://<host_name>/acs/v2/prompt", "cReq":"eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6ImNhODM1ZDQxLTBlMDktNGI3OC1hNmUyLWQwZjJiNjFlZjBjOCJ9" } }, "domainName":"<domain_name>" }, "redirectHtml":"<div id=\"threedsChallengeRedirect\" xmlns=\"http://www.w3.org/1999/html\"> <form id =\"threedsChallengeRedirectForm\" method=\"POST\" action=\"https://<host_name>/acs/v2/prompt\" target=\"challengeFrame\"> <input type=\"hidden\" name=\"creq\" value=\"eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6ImNhODM1ZDQxLTBlMDktNGI3OC1hNmUyLWQwZjJiNjFlZjBjOCJ9\" /> </form> <iframe id=\"challengeFrame\" name=\"challengeFrame\" width=\"100%\" height=\"100%\" ></iframe> <script id=\"authenticate-payer-script\"> var e=document.getElementById(\"threedsChallengeRedirectForm\"); if (e) { e.submit(); e.remove(); } </script> </div>", "version":"3DS2" }, "correlationId":"test", "device":{ "browser":"MOZILLA", "ipAddress":"127.0.0.1" }, "merchant":"TEST_3DS2-1", "order":{ "amount":100, "authenticationStatus":"AUTHENTICATION_PENDING", "creationTime":"2021-04-13T02:22:59.113Z", "currency":"AUD", "id":"807a01b6-e6c8-4aa7-b8da-799bfff89496", "lastUpdatedTime":"2021-04-13T02:44:07.161Z", "merchantCategoryCode":"1234", "status":"AUTHENTICATION_INITIATED", "totalAuthorizedAmount":0, "totalCapturedAmount":0, "totalRefundedAmount":0, "valueTransfer":{ "accountType":"NOT_A_TRANSFER" } }, "response":{ "gatewayCode":"PENDING", "gatewayRecommendation":"PROCEED" }, "result":"PENDING", "sourceOfFunds":{ "provided":{ "card":{ "expiry":{ "month":"1", "year":"39" }, "number":"512345xxxxxx0008", "scheme":"MASTERCARD" } }, "type":"CARD" }, "timeOfLastUpdate":"2021-04-13T02:44:07.161Z", "timeOfRecord":"2021-04-13T02:22:59.113Z", "transaction":{ "acquirer":{ "merchantId":"99554411" }, "amount":100, "authenticationStatus":"AUTHENTICATION_PENDING", "currency":"AUD", "id":"42090084", "type":"AUTHENTICATION" }, "version":"60" }
Intégrations avancées
La requête soumise par le navigateur du payeur à votre site Web à l'issue de la authenticatePayer()
méthode est paramétrée vous permettant de déterminer le résultat de l'authentification. Les champs d'authentification individuels, par exemple, authentication.3ds2.transactionStatus.data
, peuvent être utiles dans une intégration avancée ou si vous avez besoin d'indiquer les données d'authentification dans un paiement traité via une autre passerelle. Pour plus d'informations, voir Comment mettre en œuvre des intégrations avancées de session de paiement ?
Étape 5 : Utiliser l'authentification dans un paiement
Lorsque le résultat de la fonction authenticatePayer()
indique que vous pouvez procéder au paiement (gatewayRecommendation=PROCEED), vous pouvez lancer une opération WS API AUTHORIZE (Autoriser) ou PAY (Payer). En plus des champs standard, vous devez renseigner les champs suivants :
- order.id
Utilisez le mêmeorderId
que celui que vous avez fourni dans les fonctionsinitiateAuthentication()
etauthenticatePayer()
. - authentication.transactionId : utilisez le même
transactionId
que vous avez fourni dans les fonctionsinitiateAuthentication()
etauthenticatePayer()
. Il n'est pas nécessaire d'inclure les champs dans l'objetauthentication
, car la passerelle utilise authentication.transactionId pour rechercher les résultats de l'authentification stockés lorsque vous lui demandez d'effectuer une authentification. La passerelle transmet les informations demandées à l'acquéreur.
URL | https://ap-gateway.mastercard.com/api/rest/version/<version>/merchant/<your_merchant_ID>/order/<your_order_ID>/transaction/<your_transaction_ID> |
Méthode HTTP | PUT |
{ "apiOperation":"PAY", "authentication":{ "transactionId":"<your_transaction_ID>" }, "session": { "id": "<your_session_id>" }, "transaction":{ "reference":"<your_order_ID>" } }
{ "authentication":{ "3ds":{ "acsEci":"02", "authenticationToken":"kHyn+7YFi1EUAREAAAAvNUe6Hv8=", "transactionId":"39c25b96-7bc3-4586-bee8-056479fed3af" }, "3ds2":{ "dsTransactionId":"39c25b96-7bc3-4586-bee8-056479fed3af", "protocolVersion":"2.1.0", "transactionStatus":"Y" }, "transactionId":"249213216", "version":"3DS2" }, "authorizationResponse":{ "posData":"1605S0100130", "transactionIdentifier":"TidTest" }, "device":{ "browser":"MOZILLA", "ipAddress":"127.0.0.1" }, "gatewayEntryPoint":"WEB_SERVICES_API", "merchant":"TEST_3DS2-1", "order":{ "amount":100.00, "authenticationStatus":"AUTHENTICATION_SUCCESSFUL", "chargeback":{ "amount":0, "currency":"AUD" }, "creationTime":"2021-04-13T02:11:06.102Z", "currency":"AUD", "id":"807a01b6-e6c8-4aa7-b8da-799bfff89496", "lastUpdatedTime":"2021-04-13T02:11:57.049Z", "merchantAmount":100.00, "merchantCategoryCode":"1234", "merchantCurrency":"AUD", "reference":"807a01b6-e6c8-4aa7-b8da-799bfff89496", "status":"CAPTURED", "totalAuthorizedAmount":100.00, "totalCapturedAmount":100.00, "totalRefundedAmount":0.00 }, "response":{ "acquirerCode":"00", "gatewayCode":"APPROVED" }, "result":"SUCCESS", "sourceOfFunds":{ "provided":{ "card":{ "brand":"MASTERCARD", "expiry":{ "month":"1", "year":"39" }, "fundingMethod":"CREDIT", "issuer":"<issuer>", "number":"512345xxxxxx0008", "scheme":"Mastercard", "storedOnFile":"NOT_STORED" } }, "type":"CARD" }, "timeOfLastUpdate":"2021-04-13T02:11:57.049Z", "timeOfRecord":"2021-04-13T02:11:56.973Z", "transaction":{ "acquirer":{ "batch":1, "id":"<acquirer_id>", "merchantId":"99554411" }, "amount":100.00, "authenticationStatus":"AUTHENTICATION_SUCCESSFUL", "authorizationCode":"028941", "currency":"AUD", "id":"1", "receipt":"1908266016", "reference":"807a01b6-e6c8-4aa7-b8da-799bfff89496", "source":"INTERNET", "stan":"496", "terminal":"1234", "type":"PAYMENT" }, "version":"60" }