For additional security, Synctera External Cards supports 3-D Secure (3DS), a globally accepted authentication solution designed to increase security and reduce fraud for e-commerce payments.
PULL
transactions. Depending on your External Cards program, 3DS may be required for some or all PULL
transaction. For more information, please talk to your Synctera implementation and onboarding contact.
For testing purposes, refer to this list of test PANs from our vendor that can be used to test various 3DS scenarios in the sandbox environment. See External Cards guide for information about how to create an External Card.
BROWSER
passed for device_channel
of Lookup 3DS (step 3).
For a mobile app (SDK
) implementation, please refer to our vendor’s documentation for how to obtain and implement the 3DS SDK, provided by JFrog. Your Synctera implementation and onboarding will provide you with JFrog credentials.
In order to perform the frontend processes, the Cardinal script must be loaded into the browser document according to environment:
Code snippet:
Initialize 3DS
external_card_id
, amount
, and currency
.If successful, device_data_collection_jwt
and device_data_collection_url
will be returned (used in step 2), and id
, used in all subsequent 3DS calls. The JWT will expire in 2 hours, so DDC must be used before then.Example request:Device Data Collection (DDC)
{DDC_JWT}
, obtained from the previous step, perform DDC with the Cardinal library. This is a background process that does not require any user interaction. Only proceed to the next step once the process completes successfully.Code snippet:Lookup 3DS
device_channel
must be set according to your 3DS frontend implementation: SDK
for mobile app, or BROWSER
for mobile or desktop internet browser. If the device channel is BROWSER
, you can optionally provide device_details
. This is a set of device data (collected separately by you) to be used as a fallback in case there is an issue with DDC.For authentication_indicator
, select the options that best reflect the type of transaction being performed. For transaction_mode
, select the correct device type.transaction_mode
, you can use UAParser.js:status
from the response indicates the outcome:SUCCESS
: The cardholder was successfully authenticated - proceed to step 6FAILED
: The cardholder failed authenticationCHALLENGE_REQUIRED
: A challenge is required to complete authentication - proceed to step 4NOT_ENROLLED
: The card provider does not support 3DS, so authentication cannot be completedUNKNOWN
: An indiscriminate error occured with the 3DS authentication and it cannot be completedCHALLENGE_REQUIRED
status is returned, processor_transaction_id
, challenge_url
and challenge_payload
will also be returned, which are needed to perform the 3DS challenge in the next step.Example request:3DS Challenge
{CHALLENGE_URL}
, {CHALLENGE_PAYLOAD}
and {PROCESSOR_TRANSACTION_ID}
are required, obtained from the previous step. Once triggered, a modal window will be displayed containing the challenge for the user to complete. They have 10 minutes to complete the challenge before timing out.Use an event listener to handle the various challenge results upon completion:Result | Description |
---|---|
SUCCESS | The challenge was completed successfully. |
NOACTION | There was no service level error, but authentication was not applicable. If challengeJwt is returned, you may proceed to step 5, but note that it may still result in a failure. |
FAILURE | The user failed the challenge. |
CANCEL | The challenge was canceled by the user. |
ERROR | An error was encountered while completing the challenge. |
TIMEOUT | The challenged timed out. |
SUCCESS
or NOACTION
should be treated as a failure.Assuming a successful outcome, retain challengeJwt
for performing Authenticate 3DS (step 5). This must be performed within 2 hours or else the JWT will expire.Code snippet:Authenticate 3DS
challenge_jwt
, obtained from the challenge.Example request:Attach to External Card Transaction
id_3ds
in the transaction request. A successful authentication must be used within 90 days before expiring.Example request: