3DS cu API-ul JavaScript 3DS
Acest subiect prezintă toți pașii care sunt necesari pentru a adăuga 3DS la integrarea eGenius Platform folosind API 3DS JavaScript (JS), inclusiv cum să utilizați rezultatul autentificării pentru a procesa o plată.
Pentru a vedea exemple de solicitări și răspunsuri API utilizate în fluxul 3DS cu API-ul JavaScript 3DS, descărcați colecția Postman.
Pentru mai multe informații despre unele caracteristici 3DS generice de care puteți profita în integrarea dvs., consultați Întrebări frecvente. După ce ați finalizat integrarea, vedeți Testarea integrării 3DS pentru a o testa.
Cerințe preliminare
Pentru a utiliza 3DS cu API-ul JS 3DS:
- Implementați integrarea Hosted Session de bază.
- Implementați orice operațiuni de plată ulterioare pe care doriți să le utilizați cu sesiunea creată.
- Creați o sesiune separată pentru a aduna detaliile cardului înainte de a continua cu sesiunea de autentificare.
Pasul 1: Crearea și actualizarea unei sesiuni
3DS JS utilizează autentificarea pe baza sesiunii. Pentru mai multe informații despre autentificarea bazată pe sesiune, consultați Opțiuni de autentificare. Ca prim pas, trebuie să creați o sesiune, pe care apoi o puteți actualiza cu câmpurile de solicitare și valorile pe care doriți să le stocați în cadrul sesiunii.
Puteți crea o sesiune folosind solicitarea CREATE SESSION. Aceasta este o solicitare API WS pe partea de server și este o condiție prealabilă pentru integrarea cu API-ul JS. Acesta returnează următoarele câmpuri:
session.id
Un identificator de sesiune unic, pe care trebuie să îl furnizați în solicitările ulterioare pentru a face referire la conținutul sesiunii.session.authenticationLimit
Limita asupra numărului de solicitări de tranzacție pe care browserul plătitorului le poate trimite. Puteți furniza o valoare în solicitare sau puteți utiliza valoarea implicită a gateway-ului. În mod implicit, gateway-ul o setează la 5, dar puteți furniza o valoare până la 25. Această limită împiedică utilizatorii răuvoitori să utilizeze solicitările de autentificare ca posibil atac de carding attack și să execute atacuri Denial of Service (DoS) asupra site-ului dvs. prin trimiterea unui număr mare de tranzacții posibil facturabile.Orice reîncercări de autentificare pe care le inițiați sunt verificate cu limită de autentificare.session.aes256Key
Cheie pe care o puteți utiliza pentru a decripta datele sensibile transmise site-ului dvs. web prin browserul sau dispozitivul mobil al plătitorului.session.version
Versiunea de sesiune. Puteți utiliza acest câmp pentru a implementa blocarea optimistă a conținutului sesiunii.session.updateStatus
Un rezumat al rezultatului ultimei încercări de modificare a sesiunii.
După ce ați creat sesiunea, puteți adăuga sau actualiza câmpuri într-o sesiune utilizând solicitarea UPDATE SESSION. Acest lucru permite adăugarea datelor plăților și plătitorilor într-o sesiune care poate deveni ulterior un set de date de intrare pentru determinarea riscului asociat cu plătitorul într-o operațiune de autentificare. Următorul tabel definește câmpurile utilizate în mod obișnuit într-o sesiune.
Tabel: Câmpurile de sesiune
Câmp | Obligatoriu/Opțional | Descriere |
---|---|---|
session.id sau sourceOfFunds.provided.card.* sausourceOfFunds.token
|
Obligatoriu | Detaliile cardului utilizat pentru plată. De asemenea, puteți utiliza și simboluri din rețea și simboluri de plată pentru dispozitive ca sursă de fonduri în autentificarea plătitorului. Pentru mai multe informații, consultați întrebările frecvente. |
order.amount
|
Obligatoriu | Valoarea totală a comenzii. |
order.currency
|
Obligatoriu | Moneda comenzii. |
transaction.id
|
Obligatoriu | Identificator unic pentru autentificarea plății. |
order.id
|
Obligatoriu | Identificator unic pentru această comandă. |
authentication.channel
|
Obligatoriu | Canalul pe care este inițiată solicitarea de autentificare. Puteți specifica unul dintre următoarele elemente:
|
authentication.redirectResponseUrl
|
Obligatoriu | Adresa URL către care doriți să redirecționați plătitorul după finalizarea procesului de autentificare a plătitorului. Nu este necesar să furnizați această adresă URL dacă sunteți sigur că nu va exista nicio interacțiune cu plătitorul. |
authentication.purpose
|
Opțional | Scopul autentificării. Acest câmp este setat implicit la PAYMENT_TRANSACTION pentru a indica faptul că autentificarea trebuie efectuată la procesarea unei plăți cu cardul. Cu toate acestea, puteți specifica un scop diferit, pentru a indica autentificarea fără plată. Dacă stabiliți un acord de plată și nu procesați o plată împreună cu acesta, introduceți ADD_CARD ca scop al autentificării. Aflați cum puteți trimite o solicitare de autentificare fără plată? Trebuie completate detaliile de plată. |
authentication.acceptVersions
|
Opțional | Versiunile 3DS pe care le acceptați pentru această plată. Dacă nu specificați o versiune, 3DS2 este acceptat. Gateway-ul utilizează 3DS2, dacă această opțiune este acceptată de emitent și de card. Dacă 3DS2 nu este disponibil, autentificarea nu continuă. |
order.merchantCategoryCode
|
Opțional | Codul categoriei comerciantului. Furnizați o valoare doar dacă doriți să suprareglați valoarea implicită configurată pentru legătura dvs. de achizitor. |
Pasul 2: Inițializați API
Consultați API-ul 3DS JS (threeDS.js) de pe serverele gateway-ului. Aceasta plasează un obiect ThreeDS în fereastra/spațiul de nume global.
După ce ați creat o sesiune, inițializați 3DS JS API utilizând funcția configure(), cu următoarele argumente obligatorii în obiectul map threedsConfig:
merchantId
Identificatorul dvs. de comerciant pe gateway.sessionId
ID-ul de sesiune pe care l-ați creat folosind solicitarea CREATE SESSION.containerId
<div> ID în codul HTML în care API-ul injectează un iFrame ascuns.callback
Funcție care trebuie invocată odată ce API-ul a fost inițializat.configuration
Valoare JSON care acceptă elemente de date precum userLanguage (limba paginii de plată afișată utilizatorului; opțional) și wsVersion (versiunea API WS).
Funcția configure() trebuie apelată în timpul încărcării paginii sau când DOM-ul este în starea pregătită. Trebuie apelat o singură dată pentru încărcarea paginii. După apelarea acestei metode, 3DS JS furnizează valorile de configurare sub formă de variabile-membru.
<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>
Pasul 3: Inițierea autentificării
Odată ce toate datele plătitorului și plății au fost colectate într-o sesiune, puteți iniția autentificarea invocând metoda initiateAuthentication() function. Apelează la solicitarea INITIATE AUTHENTICATION a API de autentificare plătitor și determină versiunile de autentificare plătitor disponibile pentru un anumit card, pe baza următoarelor:
- versiunile 3DS configurate în profilul dvs. de comerciant
- Tip de card
- preferințele indicate în solicitare
- Versiunea 3DS la care a fost înscris cardul
- regulile de filtrare 3DS a tranzacțiilor configurate de către dvs. sau Your payment service provider (PSP)
Funcția permite, de asemenea, efectuarea oricăror activități în fundal – de ex., un apel 3DS2 ACS cu scopul colectării de date suplimentare privitoare la plătitor, pentru a permite o operațiune authenticatePayer() ulterioară.
Puteți iniția autentificarea apelând funcția initiateAuthentication() cu următoarele argumente obligatorii:
transactionId
Identificator unic pentru autentificarea plății.orderId
Identificator unic pentru această comandă.callback
Funcția callbackoptionalParams (optional)
Câmpuri suplimentare, cum ar fi correlationId.
Dacă autentificarea 3DS a plătitorului este disponibilă, următoarele câmpuri sunt returnate în argumentul data al funcției callback. În caz contrar, răspunsul include o eroare.
data.restApiResponse
Răspunsul brut din apelul API REST Initiate Authentication.data.correlationId
Ultimul ID de corelare utilizat pentru efectuarea apelului API REST Authentication. Acesta permite corelarea răspunsului cu solicitarea.data.gatewayRecommendation
Recomandare cu privire la următoarele acțiuni, bazată pe regulile de filtrare a tranzacțiilor 3DS configurate de dvs. sau de PSP:- PROCEED: Puteți trece la Pasul 4 pentru autentificarea plătitorului.
- RESUBMIT_WITH_ALTERNATIVE_PAYMENT_DETAILS: Solicitați plătitorului detalii alternative de plată, de exemplu, un card nou sau altă metodă de plată, și retrimiteți solicitarea cu noile detalii. Nu retrimiteți aceeași solicitare.
data.authenticationVersion
Returnează 3DS2 dacă autentificarea este disponibilă.
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" }
Pasul 4: Autentificarea plătitorului
Dacă răspunsul INITIATE AUTHENTICATION a indicat că autentificarea este disponibilă (transaction.authenticationStatus=AUTHENTICATION_AVAILABLE), vă puteți autentifica plătitorul. Invocați funcția authenticatePayer() când plătitorul face clic pe butonul Plătiți acum de pe pagina de validare. Funcția apelează solicitarea AUTHENTICATE PAYER a API-ului de autentificare a plătitorului.
Trebuie să invocați funcția authenticatePayer()
furnizând următoarele argumente obligatorii:
orderId
Același ID de comandă pe care l-ați folosit în funcțiainitiateAuthentication()
precedentă.transactionId
Același ID de tranzacție pe care l-ați folosit în funcțiainitiateAuthentication()
precedentă.callback
Funcția callback.optionalParams(Optional)
Câmpuri suplimentare de solicitare AUTENTIFICARE PAYER, cum ar fi facturarea și expedierea.
Următoarele câmpuri sunt returnate în argumentul data
al funcției callback:
data.restApiResponse
Răspuns brut de la solicitarea de AUTHENTICATE PAYER. Câmpurile returnate depind de fluxul (fluidizat sau cu testare) și de canalul de autentificare definit pentru sesiune. Pentru solicitarea de autentificare pe baza sesiunii, răspunsul este filtrat pentru eliminarea datelor care nu sunt legate de plătitor, fiind returnate numai câmpurile de pe lista albă. Pentru mai multe informații, consultați Noțiuni de bază privind sesiunile.data.correlationId
Ultimul ID de corelare care a fost folosit pentru solicitarea AUTHENTICATE PAYER. Acesta permite corelarea răspunsului cu solicitarea.data.gatewayRecommendation
PROCEED:
Puteți continua cu finalizarea procesului de autentificare (procesul de testare) sau puteți finaliza plata (proces optimizat). Dacă autorizarea plății a reușit, continuați cu decontarea fondurilor și, dacă este cazul, cu expedierea bunurilor.DO_NOT_PROCEED_ABANDON_ORDER:
Nu trimiteți din nou aceeași solicitare. PSP, schema sau emitentul vă solicită să renunțați la comandă.RESUBMIT_WITH_ALTERNATIVE_PAYMENT_DETAILS:
Solicitați plătitorului detalii alternative de plată (de exemplu, un card nou sau altă metodă de plată) și retrimiteți solicitarea cu noile detalii. Nu retrimiteți aceeași solicitare.data.htmlRedirectCode
Cod de redirecționare. DacăgatewayRecommendation
este PROCEED, introduceți acest cod în pagina afișată plătitorului.
Recomandare cu privire la următoarele acțiuni, bazată pe regulile de filtrare a tranzacțiilor 3DS configurate de dvs. sau your payment service provider:
Dacă gateway-ul vă recomandă să PROCEED
:
- Dacă ACS a selectat un flux fluidizat pentru plătitor, acesta redirecționează browserul plătitorului înapoi către site-ul dvs. web și puteți trece la pasul 5 pentru a trimite o altă plată către gateway. Gateway-ul obține datele de autentificare legate de plată și se asigură că plățile sunt procesate numai dacă toate regulile de filtrare a tranzacțiilor 3DS (configurate de dvs. sau your payment service provider) au fost satisfăcute.
- Dacă ACS a selectat un flux cu testare pentru plătitor, redirecționați plătitorul către ACS utilizând câmpul
htmlRedirectCode
indicat în răspuns. După finalizarea provocării, ACS redirecționează plătitorul înapoi către site-ul dvs. și declanșează un apel invers care conține câmpurileorderId
,transactionId
,gatewayRecommendation
șirestApiResponse
. Determinați rezultatul testării pe baza câmpuluigatewayRecommendation
. Se aplică aceleași reguli ca cele descrise mai sus pentru răspunsul la funcțiaauthenticatePayer()
. Dacă recomandarea este PROCEED, continuați cu Pasul 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" }
Integrări avansate
Solicitarea trimisă de browserul plătitorului către site-ul dvs. web la finalizarea metodei authenticatePayer()
este parametrizată într-un mod care să permită determinarea rezultatului autentificării. Fiecare câmp de autentificare, cum ar fi authentication.3ds2.transactionStatus.data
, poate fi util pentru o integrare avansată sau dacă trebuie să furnizați datele de autentificare într-o plată procesată printr-un alt gateway. Pentru mai multe detalii, vedeți Cum implementez integrările avansate ale sesiunilor de plată?
Pasul 5: Utilizarea autentificării într-o plată
Când rezultatul funcției authenticatePayer()
indică faptul că puteți continua cu plata (gatewayRecommendation=PROCEED), puteți iniția o operațiune WS API AUTHORIZE sau PAY. În plus față de câmpurile standard, trebuie să completați următoarele câmpuri:
- order.id
Folosiți acelașiorderId
pe care l-ați furnizat în funcțiileinitiateAuthentication()
șiauthenticatePayer()
. - authentication.transactionId: Utilizați același
transactionId
pe care l-ați furnizat pentru funcțiileinitiateAuthentication()
șiauthenticatePayer()
. Nu trebuie să includeți niciunul dintre câmpurile din obiectulauthentication
, deoarece gateway-ul folosește authentication.transactionId pentru a căuta rezultatele de autentificare pe care le-a stocat atunci când i-ați cerut să efectueze autentificarea. Gateway-ul transmite achizitorului informațiile solicitate.
URL | https://egenius.unicredit.ro/api/rest/version/<version>/merchant/<your_merchant_ID>/order/<your_order_ID>/transaction/<your_transaction_ID> |
Metoda 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" }