3-D Secure and Tokenisation Integration Guide

This guide walks you through the steps required to use Gateway Tokenization along with 3-D Secure Authentication.

The Token has to be created using the Hosted Session integration to capture the card details which is then used in the 3-D Secure Authentication process.

When following this guide it will explain the Client side and Server side implementation to follow along with the sample code.

Prerequisites

  • 3-D Secure must be enabled on your Tyro eCommerce merchant profile

  • Tokenisation enabled on your Tyro eCommerce merchant profile

  • Hosted Session Integration to capture the card details

Workflows

3-D Secure Authentication while Tokenising


3-D Secure Authentication on Cardholder Initiated Token Payment

Implementation

3-D Secure Authentication while Tokenising

Step 1: Creating a Session

As a first step, you must create a session, which you can then update with the request fields and values you wish to store in the session.

This is a server-side API call Create Session and is a prerequisite for integrating with the JS API.

Note: Before proceeding further, the session will need to be updated with Card details, if the the provided session is a ‘Hosted Session’ this is not needed as the payer’s card details are updated to session upon creation.

However, if you are using the Create Session API you will need to send an Update Session request to provide the necessary payment details.

Step 2: Configure Hosted Session

The configure() function allows you to configure Hosted Session interactions. You can collect the payment details by using proxy payment fields hosted by Tyro eCommerce Payment Gateway and rendered within an iFrame.

Configuring Hosted Session
PaymentSession.configure({
    session: "<your_session_ID>",
    fields: {
        // Attach hosted fields to your payment page
           card: {
              number: "#card-number",
              securityCode: "#security-code",
              expiryMonth: "#expiry-month",
              expiryYear: "#expiry-year",
              nameOnCard: "#cardholder-name"
           }
    },
    frameEmbeddingMitigation: ["javascript", "x-frame-options", "csp"],
    callbacks: {
        initialized: function(response) {
            //handle initialization response
            if(response.status === "ok") {
                // ...
            } else if (response.status === "system_error") {
                console.log(response.message);
            }
        }
    },
    interaction: {
        displayControl: {
            formatCard: "EMBOSSED",
            invalidFieldCharacters: "REJECT"
        }
    },
    order: {
        amount: 10.00,
        currency: "AUD"
    }
})

Step 3: Updating the Session with Card Details

Invoke PaymentSession.updateSessionFromForm('card') to store the payment details captured for the payment type ‘card’, into a payment session.

Once the operation completes,formSessionUpdate() callback is invoked with a result parameter.

You must check the result.status value to determine if the operation was successful.

API Reference: sessionJS Reference

Update Hosted Session
PaymentSession.updateSessionFromForm('card')

Step 4: Updating the Session with 3D-Secure Authentication Details

Update the session with the necessay fields for 3D-Secure, these include:

  • authentication.channel

    Used to indicate the channel in which the authentication request is being performed on.

  • authentication.purpose

    Indicates the context of payer authentication being used

  • authentication.redirectResponseUrl

    The URL to which you want to redirect the payer after completing the payer authentication process.

  • transaction.id

    A unique identifier for this payment authentication.

HTTP Method: PUT

Request URL: https://tyro.gateway.mastercard.com/api/rest/version/58/merchant/{merchantid}/session/SESSION_ID

API Reference: Update Session

Request Body
{
  "order": {
    "id": "ORDER_ID",
    "amount": "5.00",
    "currency": "AUD"
  },
  "transaction": {
    "id": "AUTHENTICATION_TRANSACTION_ID"
  },
  "authentication": {
    "channel": "PAYER_BROWSER",
    "purpose": "PAYMENT_TRANSACTION",
    "redirectResponseUrl": "https://ecommerce-xpay-test.prd.tyro.cloud/sessions/SESSION_ID/3ds-completion?environment=TEST&operation=TOKENISE"
  }
}

Step 5: 3-D Secure Authentication

  • Configure three-ds.js

    Once you have created a session, initialise the API using the configure()method.

    This method should be called during the page load or when the DOM is in ready state. It should be called only once for the page load.

    After calling this method, 3DS JS will provide configuration values as member variables.

Configure three-ds.js
function configure (sessionId) {
            return new Promise((resolve, reject) => {
                ThreeDS.configure({
                    merchantId: 'TYRO',
                    sessionId: sessionId,
                    containerId: "3DSUI",
                    callback: function () {
                        if (ThreeDS.isConfigured()) {
                            resolve()
                        } else {
                            reject()
                        }

                    },
                    configuration: {
                        userLanguage: "en-AU",
                        wsVersion: 57
                    }
                })
            })
  • Initiate Authentication

    Once all payer and payment data has been gathered into a session, you can initiate the authentication by invoking the initiateAuthentication()method.

Initiate Authentication (three-ds.js)
function initiateAuthentication(orderId, transactionId) {
            return new Promise((resolve, reject) => {
                ThreeDS.initiateAuthentication(orderId, transactionId, function (data) {
                    if (data && data.error) {
                        reject(data.error)
                    } else {
                        resolve(data)
                    }
                });
            })
        }
	
  • Authenticate Payer

    Where the Initiate Authentication response has indicated authentication to be available e.g gatewayRecommednation = “PROCEED”, you can invoke the authenticatePayer() method.

    Please note, you should invoke this when the payer clicks the “Pay Now” button on the checkout page.

Authenticate Payer (three-ds.js)
 function authenticate (orderId, transactionId) {
            return new Promise((resolve, reject) => {
                ThreeDS.authenticatePayer(orderId, transactionId, (data) => {
                    console.log(data)
                    if (data && data.error) {
                        reject(data.error)
                    } else {
                        resolve(data)
                    }
                })
            })
        }
  • Full Example
async function authenticate(sessionId, orderId, transactionId) {
    await configure(sessionId)
    const enrollmentResult = await initiateAuthentication(orderId, transactionId)
    if (enrollmentResult.gatewayRecommendation === 'PROCEED') {
        await sleepFor(3e3)
        const authenticationResult = await withRetry(() => authenticate(orderId, transactionId), 5, 2e3)
        if (authenticationResult.gatewayRecommendation === 'PROCEED') {
            jquery(".pay-area").hide()
            jquery(".challenge-3ds").css('display', 'flex')
            jquery(`#3DSUI`).html(authenticationResult.htmlRedirectCode)
        } else {
            throw new Error("Gateway does not recommend to continue")
        }
    } else {
        throw new Error("Gateway does not recommend to continue")
    }
}

const sleepFor = function (duration) {
    return new Promise(resolve => setTimeout(resolve, duration))
}

const withRetry = async function (fn, numberOfRetries, timeBetweenRetries) {
   

Step 6: Redirecting Payer to the ACS

Inserting authenticationResult.htmlRedirectCode into page will cause a redirection within the iframe to the ACS website where either the user is presented with a challenge or the authentication will be frictionless.

In either case, a POST request will be sent to our redirectResponseUrl with below request body:

Note: Content type is set to application/x-www-form-urlencoded

Redirecting Payer to the ACS
order.id=ORDER_ID&transaction.id=AUTHENTICATION_TRANSACTION_ID&response.gatewayRecommendation=PROCEED&encryptedData.ciphertext=LWG18HaYWznD%2FYjA0XZELY1Nt8EuZMeBIWtcCZeXHuwr45dP%2BwBe1oPjB%2FTV%2FyvC7GaSd43q%2FXj0ILAfVRStm%2BS3Z1UhhEOO8kNdpBMwJHoTSdUxgkWsiCtRDJfVDr4kcof9xYh8618KJ6ofldFwZ%2Bte3IEnYiIuUmcp%2Bfvf%2BSDknvpzW0y9REE9UTw4CRg0K1euPzBOHC8y8QoGCUcP6l2Um38DVxbm30Yc9r1WStzyVKrnk%2FGuaObQnpST9hYy2v0jdT%2FYpvyOg3bLalfnZDtiQHTWR7WDVWAWqGE82o2kVA5yynOHuOEGvkFFyZ1DZ3NlRT5JghD2aaAlT%2FvDGbe04h0RA1nF6BUZXKq%2FtM18JHW3Jo%2BR5Wof7vlYNd%2BmDUgWGgHXosg1VezLBn2grqCl4vd19H%2B00UQ2WRuydCqeGMINArWIDBHJU0P084qU6YZiek5F4EIZkfzWZo8jJAYVLK9N1YbQQ2FS6iBkKLLZaLnGSehfXttG%2FJjjPUpN9ulsqVLYcRNfgo7BE4jerfJqL%2B7pU%2FKCzzeZfFbygp%2B%2FfPUeBuNwh0ugK6tSGlUO%2BZ%2BjC1xaIjL%2Bc73qKJaVTv1vln9NT5VAYBg%3D&encryptedData.nonce=EZ%2BcQg5IQeuAAAAH&encryptedData.tag=UA7kR1XbBBBp1YYhvfq%2BGA%3D%3D&result=SUCCESS

Step 7: Tokenising the card after Authentication

If result is SUCCESS and response.gatewayRecommendation is PROCEED, we ask the gateway to tokenise the card.

HTTP Method: POST

URL: https://tyro.gateway.mastercard.com/api/rest/version/58/merchant/{merchantid}/token

API Reference: Create Token

Tokenising Card with Authenticated Session
{
  "session": {
    "id": "SESSION_ID"
  },
  "sourceOfFunds": {
    "type": "CARD"
  }
}

3-D Secure Authentication on Cardholder Initiated Token

Step 1: Create a Session

As a first step, you must create a session, which you can then update with the request fields and values you wish to store in the session.

This is a server-side API call Create Session and is a prerequisite for integrating with the JS API.

Request Method: POST

URL: https://test-tyro.mtf.gateway.mastercard.com/api/rest/version/57/merchant/TYRO_68233/session

API Reference: Create Session

Request Body: NO_REQUEST_BODY

Step 2: Update Session with Card Details

The session will need to be updated with Card details accordingly with the following fields:

  • order.id

  • order.amount

  • order.currency

  • transaction.id

  • transaction.source

  • sourceOfFunds.type

  • sourceOfFunds.provided.card.secuirtyCode

  • sourceOfFunds.type

  • authentication.channel

  • authentication.purpose

  • authentication.redirectResponseUrl

Request Method: PUT

URL: https://test-tyro.mtf.gateway.mastercard.com/api/rest/version/57/merchant/TYRO_68233/session

API Reference: Update Session

Update Session
{
  "order": {
    "id": "ORDER_ID",
    "amount": "1.00",
    "currency": "AUD"
  },
  "transaction": {
    "id": "AUTHENTICATION_TRANSACTION_ID",
    "source": "INTERNET"
  },
  "authentication": {
    "channel": "PAYER_BROWSER",
    "purpose": "PAYMENT_TRANSACTION",
    "redirectResponseUrl": "https://ecommerce-xpay-test.prd.tyro.cloud/sessions/SESSION_ID/3ds-completion?environment=TEST&operation=PURCHASE"
  },
  "sourceOfFunds": {
    "type": "CARD",
    "provided": {
      "card": {
        "securityCode": "213"
      }
    },
    "token": "SECURE_TOKEN"
  }
}

Step 3: 3-D Secure Authentication

  • Configure three-ds.js

Once you have created a session, initialise the API using the configure()method.

This method should be called during the page load or when the DOM is in ready state. It should be called only once for the page load.

After calling this method, 3DS JS will provide configuration values as member variables.

Configure three-ds.js
<html>
    <head>
    <script src="https://test-tyro.mtf.gateway.mastercard.com/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: 58
            }
        });

        //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>
  • Initiate Authentication

    Once all payer and payment data has been gathered into a session, you can initiate the authentication by invoking the initiateAuthentication()method

Initiate Authentication
Request
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, etc.
        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 "DO_NOT_PROCEED":
                displayReceipt(data);//merchant's method, you can offer the payer the option to try another payment method.
                break;
        }
    }
}
	
Initiate Authentication
Response
{
  "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_WITH_AUTHENTICATION"
  },
  "result": "SUCCESS",
  "sourceOfFunds": {
    "provided": {
      "card": {
        "number": "512345xxxxxx0008"
      }
    },
    "type": "CARD"
  },
  "transaction": {
    "authenticationStatus": "AUTHENTICATION_AVAILABLE"
  },
  "version": "58"
}
  • Authenticate Payer

    Where the Initiate Authentication response has indicated authentication to be available e.g gatewayRecommednation = “PROCEED”, you can invoke the authenticatePayer() method.

    Please note, you should invoke this when the payer clicks the “Pay Now” button on the checkout page.

Authenticate Payer
Request
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);
    }
},
 
 
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));
}
Authenticate Payer
Response
{
  "authentication": {
    "3ds2": {
      "methodCompleted": false,
      "methodSupported": "SUPPORTED"
    },
    "payerInteraction": "REQUIRED",
    "redirect": {
      "customized": {
        "3DS": {
          "acsUrl": "https://<host_name>/acs/v2/prompt",
          "cReq": "eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6ImFhZjliNTlkLTJlMDQtNGNkNS05NDM4LTU4ZTgwYTM3MGI1YSJ9"
        }
      },
      "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=\"eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6ImFhZjliNTlkLTJlMDQtNGNkNS05NDM4LTU4ZTgwYTM3MGI1YSJ9\" /> </form> <iframe id=\"challengeFrame\" name=\"challengeFrame\" width=\"100%\" height=\"100%\" ></iframe> <script>document.getElementById(\"threedsChallengeRedirectForm\").submit();</script> </div>",
    "version": "3DS2"
  },
  "order": {
    "currency": "AUD",
    "status": "AUTHENTICATION_INITIATED"
  },
  "response": {
    "gatewayCode": "PENDING",
    "gatewayRecommendation": "PROCEED_WITH_AUTHENTICATION"
  },
  "result": "PENDING",
  "sourceOfFunds": {
    "provided": {
      "card": {
        "number": "512345xxxxxx0008"
      }
    },
    "type": "CARD"
  },
  "transaction": {
    "authenticationStatus": "AUTHENTICATION_PENDING"
  },
  "version": "58"
}

Step 4: Redirecting Payer to the ACS

Inserting authenticationResult.htmlRedirectCode into page will cause a redirection within the iframe to the ACS website where either the user is presented with a challenge or the authentication will be frictionless.

In either case, a POST request will be sent to our redirectResponseUrl with below request body:

Note: Content type is set to application/x-www-form-urlencoded

ACS Redirect
order.id=ORDER_ID&transaction.id=AUTHENTICATION_TRANSACTION_ID&response.gatewayRecommendation=PROCEED&encryptedData.ciphertext=LWG18HaYWznD%2FYjA0XZELY1Nt8EuZMeBIWtcCZeXHuwr45dP%2BwBe1oPjB%2FTV%2FyvC7GaSd43q%2FXj0ILAfVRStm%2BS3Z1UhhEOO8kNdpBMwJHoTSdUxgkWsiCtRDJfVDr4kcof9xYh8618KJ6ofldFwZ%2Bte3IEnYiIuUmcp%2Bfvf%2BSDknvpzW0y9REE9UTw4CRg0K1euPzBOHC8y8QoGCUcP6l2Um38DVxbm30Yc9r1WStzyVKrnk%2FGuaObQnpST9hYy2v0jdT%2FYpvyOg3bLalfnZDtiQHTWR7WDVWAWqGE82o2kVA5yynOHuOEGvkFFyZ1DZ3NlRT5JghD2aaAlT%2FvDGbe04h0RA1nF6BUZXKq%2FtM18JHW3Jo%2BR5Wof7vlYNd%2BmDUgWGgHXosg1VezLBn2grqCl4vd19H%2B00UQ2WRuydCqeGMINArWIDBHJU0P084qU6YZiek5F4EIZkfzWZo8jJAYVLK9N1YbQQ2FS6iBkKLLZaLnGSehfXttG%2FJjjPUpN9ulsqVLYcRNfgo7BE4jerfJqL%2B7pU%2FKCzzeZfFbygp%2B%2FfPUeBuNwh0ugK6tSGlUO%2BZ%2BjC1xaIjL%2Bc73qKJaVTv1vln9NT5VAYBg%3D&encryptedData.nonce=EZ%2BcQg5IQeuAAAAH&encryptedData.tag=UA7kR1XbBBBp1YYhvfq%2BGA%3D%3D&result=SUCCESS

Step 5: Use the Authentication Result in a Payment Operation

When the result of the authenticatePayer() indicates that you can proceed with the payment e.g gatewayRecommendation=PROCEED and your session has been tokenised you may perform a Pay operation.

In addition to the standard fields, you must provide the following fields:

  • order.id

    Provide the orderId that you supplied in the initiateAuthentication() and authenticatePayer()methods.

  • authentication.transactionId

    Provide the transactionId that you supplied in the initiateAuthentication()and authenticatePayer()methods.

    The gateway will use this transactionId to look up the authentication results that it stored when you performed authenticatePayer() function.

Request Method: PUT

URL: https://test-tyro.mtf.gateway.mastercard.com/api/rest/version/57/merchant/MERCHANT_ID/order/ORDER_ID/transaction/PAYMENT_TRANSACTION_ID

API Reference: Pay with Session

Pay With Session
Request
{
  "order": {
    "amount": "1.00",
    "currency": "AUD",
    "reference": "ORDER_ID"
  },
  "sourceOfFunds": {
    "type": "CARD"
  },
  "session": {
    "id": "SESSION_ID"
  },
  "apiOperation": "PAY",
  "authentication": {
    "transactionId": "AUTHENTICATION_TRANSACTION_ID"
  }
}
Pay with Session
Response
{
  "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"
  },
  "gatewayEntryPoint": "WEB_SERVICES_API",
  "merchant": "TEST_3DS2-1",
  "order": {
    "amount": 1,
    "chargeback": {
      "amount": 0,
      "currency": "AUD"
    },
    "creationTime": "2019-10-28T05:00:27.234Z",
    "currency": "AUD",
    "id": "807a01b6-e6c8-4aa7-b8da-799bfff89496",
    "merchantCategoryCode": "1234",
    "reference": "807a01b6-e6c8-4aa7-b8da-799bfff89496",
    "status": "CAPTURED",
    "totalAuthorizedAmount": 100,
    "totalCapturedAmount": 100,
    "totalRefundedAmount": 0
  },
  "response": {
    "acquirerCode": "00",
    "gatewayCode": "APPROVED"
  },
  "result": "SUCCESS",
  "sourceOfFunds": {
    "provided": {
      "card": {
        "brand": "MASTERCARD",
        "expiry": {
          "month": "5",
          "year": "21"
        },
        "fundingMethod": "CREDIT",
        "issuer": "<issuer>",
        "number": "512345xxxxxx0008",
        "scheme": "MASTERCARD",
        "storedOnFile": "NOT_STORED"
      }
    },
    "type": "CARD"
  },
  "timeOfRecord": "2019-10-28T05:00:27.234Z",
  "transaction": {
    "acquirer": {
      "batch": 1,
      "id": "<acquirer_id>",
      "merchantId": "99554411"
    },
    "amount": 1,
    "authenticationStatus": "AUTHENTICATION_SUCCESSFUL",
    "authorizationCode": "028941",
    "currency": "AUD",
    "frequency": "SINGLE",
    "id": "1",
    "receipt": "1908266016",
    "reference": "807a01b6-e6c8-4aa7-b8da-799bfff89496",
    "source": "INTERNET",
    "terminal": "1234",
    "type": "PAYMENT"
  },
  "version": "58"
}

FAQs

  • Does my merchant liability change when using 3D-Secure with Tokenisation?

    When tokenising, 3D-Secure Authentication can help you increase customer assurance. To achieve fraud liability shift on a payment made with this token you must successfully attempt 3D-Secure Authentication again (at the time of the payment).

    You might consider tokenising a card immediately after a successful 3D-Secure payment instead of using this transaction workflow for a similar experience.