iOS 3D Secure 2 SDK

Support 3D Secure 2 authentication on your iOS app.

How it works

In a full implementation, a payment eligible for 3D Secure 2 can go through either a frictionless or a challenge authentication flow before the payment is authorised.

The SDK initiates the 3D Secure 2 device fingerprinting and if required by the issuer, handles presenting the challenge to your shopper. From your server, you need to handle sending a payment request, the encrypted device fingerprint, and the challenge result to Adyen.  

If you only want to perform a 3D Secure 2 authentication and then authorise the payment later, see the Authentication only integration page.

Here's a diagram for a challenge flow:

  1. Submit a payment request with the required 3D Secure 2 objects to start the authentication process. Build your implementation depending on the resultCode returned in the response.  
  2. Get the 3D Secure 2 device fingerprint. If you receive an IdentifyShopper resultCode, you need to get the shopper's 3D Secure 2 device fingerprint. Initiate the mobile SDK, get the device fingerprint, and send the encrypted device fingerprint information to Adyen. If you get a response with an Authorised resultCode, this indicates that the 3D Secure 2 authentication was frictionless, and the payment authorisation was successfully completed.
  3. Present a challenge to the shopper. If you receive ChallengeShopper resultCode, this means that the issuer requires further shopper interaction. To handle a challenge flow, initiate the mobile SDK, and then submit the challenge result to Adyen. 

In case the issuer does not support 3D Secure 2, we will initiate a 3D Secure 1 fallback by default, indicated by a RedirectShopper resultCode. See 3D Secure fallback for more information.

For a complete list of resultCode values and the actions that you need to take, see Result codes.

Before you begin 

Before you can start accepting 3D Secure 2 authenticated transactions, make sure that you:

  1. Sign up for an Adyen test account at https://www.adyen.com/signup
  2. Get your API Key. Save a copy as you'll need it for API calls you make to the Adyen payments platform.
  3. Install one of our Libraries to connect with the Adyen APIs. For more information on these steps, refer to Get started with Adyen.
  4. Get our iOS 3DS2 SDK from GitHub: https://github.com/Adyen/adyen-3ds2-ios. Install our SDK through CocoaPods or by manual installation.

Install via CocoaPods

  1. Add pod 'Adyen3DS2' to your Podfile.
  2. Run pod install.

Install manually as a dynamic framework

  1. In Xcode, drag the dynamic Adyen3DS2.framework to the Embedded Binaries section of your General settings tab. Select Copy items if needed when asked.

Install manually as a static framework

  1. In Xcode, select File > Add Files to....
  2. Select the static Adyen3DS2.framework and check Copy items if needed, then select Add.
  3. In Xcode, select File > Add Files to....
  4. Select Adyen3DS2.bundle inside Adyen3DS2.framework and check Copy items if needed, then select Add.

Integration steps

  1. Collect the shopper's card details and proceed to submit a payment request
  2. Use the resultCode from the response to determine your next action. For example, if a transaction qualifies for 3D Secure 2 authentication, you will need to get the 3D Secure 2 device fingerprint, or present a challenge to the shopper, or both.

To test your integration, see Testing 3D Secure 2.

Submit a payment request

Submit a payment request with an /authorise call. to request 3D Secure 2 authentication for the payment. Include the threeDS2RequestData object to indicate that you are ready to accept 3D Secure 2 authenticated payments. 

  • deviceChannelapp

In addition to the regular parameters you provide to Adyen, send additional parameters in the following list. We recommend that you provide all available information to increase the likelihood of achieving a frictionless flow and a higher authorisation rate.

Request

curl https://pal-test.adyen.com/pal/servlet/Payment/v40/authorise \
-H "X-API-key: [Your API Key here]" \
-H "Content-Type: application/json" \
-d '{
    "amount":{  
    "currency":"EUR",
    "value":1500
    },
    "merchantAccount":"YOUR_MERCHANT_ACCOUNT",
    "reference":"YOUR_ORDER_NUMBER",
    "threeDS2RequestData":{  
      "deviceChannel":"app"
    },
    "card":{  
      "cvc":"737",
      "expiryMonth":"10",
      "expiryYear":"2020",
      "holderName":"Card Holder",
      "number":"4212345678901245"
    }
  }'
# Set your X-API-KEY with the API key from the Customer Area.
adyen = Adyen::Client.new
adyen.api_key = "YOUR X-API-KEY"

response = adyen.authorise({
  "amount" => {
    "currency" => "EUR",
    "value" => 1500
  },
  "merchantAccount" => "YOUR_MERCHANT_ACCOUNT",
  "reference" => "YOUR_ORDER_NUMBER",
  "threeDS2RequestData" => {
    "deviceChannel" => "app"
  },
  "card" => {
    "cvc" => "737",
    "expiryMonth" => "10",
    "expiryYear" => "2020",
    "holderName" => "Card Holder",
    "number" => "4212345678901245"
  }
})
// Set your X-API-KEY with the API key from the Customer Area.
Config config = new Config();
config.setApiKey("Your X-API-KEY"));
Client client = new Client(config);
 
Checkout checkout = new Checkout(client);
AuthoriseRequest authoriseRequest = new AuthoriseRequest();
Amount amount = new Amount();
amount.setCurrency("EUR");
amount.setValue(1500L);
authoriseRequest.setAmount(amount);
authoriseRequest.setReference("YOUR_ORDER_NUMBER");
authoriseRequest.setThreeDS2RequestData(new HashMap<String, String>());
authoriseRequest.putThreeDS2RequestData("deviceChannel", "app");
authoriseRequest.setCard(new HashMap<String, String>());
authoriseRequest.putCardItem("cvc", "737");
authoriseRequest.putCardItem("expiryMonth", "10");
authoriseRequest.putCardItem("expiryYear", "2020");
authoriseRequest.putCardItem("holderName", "Card Holder");
authoriseRequest.putCardItem("number", "4212345678901245");
authoriseRequest.setMerchantAccount("YOUR_MERCHANT_ACCOUNT");
authoriseResponse response = checkout.authorise(authoriseRequest);
// Set your X-API-KEY with the API key from the Customer Area.
$client = new \Adyen\Client();
$client->setXApiKey("YOUR X-API-KEY");
$service = new \Adyen\Service\Authorise($client);

$params = array(
  "amount" => array(
    "currency" => "EUR",
    "value" => 1500
  ),
  "reference" => "YOUR_ORDER_NUMBER",
  "threeDS2RequestData" => array(
    "deviceChannel" => "app"
  ),
  "card" => array(
    "cvc" => "737",
    "expiryMonth" => "10",
    "expiryYear" => "2020",
    "holderName" => "Card Holder",
    "number" => "4212345678901245"
  ),
  "merchantAccount" => "YOUR_MERCHANT_ACCOUNT"
);
$result = $service->authorise($params);
// Set your X-API-KEY with the API key from the Customer Area.
var client = new Client ("YOUR-X-API-KEY", Environment.Test);
var checkout = new Checkout(client);

var amount = new Model.Checkout.Amount("EUR", 1500);
var details = new Model.Checkout.DefaultCardDetails{
  Cvc = "737",
  ExpiryMonth = "10",
  ExpiryYear = "2020",
  HolderName= "Card Holder",
  Number = "4212345678901245"
};
var threeds2requestdata = new Model.Checkout.threeDS2RequestData{
  deviceChannel = "app"
};
var authoriseRequest = new Model.Checkout.AuthoriseRequest
{
  Reference = "YOUR_ORDER_NUMBER",
  Amount = amount,
  MerchantAccount = "YOUR_MERCHANT_ACCOUNT",
  Card = details,
  ThreeDS2RequestData = threeds2requestdata
};

var paymentResponse = checkout.Authorise(authoriseRequest); 
#Set your X-API-KEY with the API key from the Customer Area.
ady = Adyen.Adyen()
client = ady.client
client.xapikey = "YOUR X-API-KEY"
 
request = {}
request['amount'] = {
  "value": "1500", 
  "currency": "EUR"
}
request['threeDS2RequestData] = {
  "deviceChannel" = "app"
}
request['reference'] = "YOUR_ORDER_NUMBER"
request['card'] = {                                    
  "cvc": "737",
  "expiryMonth": "10",
  "expiryYear": "2020",
  "holderName": "Card Holder",
  "number": "4212345678901245"
}
request['merchantAccount'] = "YOUR_MERCHANT_ACCOUNT"
result = self.ady.checkout.authorise(request)

Response

You'll receive a response containing:

  • resultCodeIdentifyShopper

In case the issuer does not support 3D Secure 2, we will initiate a 3D Secure 1 fallback by default, indicated by a RedirectShopper resultCode. See 3D Secure fallback for more information.

For a complete list of resultCode values and the actions you need to take, see Result codes.

Sample response with IdentifyShopper resultCode
{
    "additionalData": {
        "threeds2.threeDSServerTransID": "055fadfb-9fe4-4e70-99f0-9b8935bf1eb2",
        "threeds2.threeDS2DirectoryServerInformation.algorithm": "RSA",
        "threeds2.threeDS2Token": "BQABAQC2LEWucYNwQRzhH9c1/hup5ZZa9HUehFbwdC86PAfhpGJ/+...",
        "threeds2.threeDS2DirectoryServerInformation.directoryServerId": "A000000003",
        "threeds2.threeDS2DirectoryServerInformation.publicKey": "eyJrdHkiOiJSU0EiLCJlIjoiQVFBQiIsIm4iOiI4VFBxZkFQ==..."
    },
    "pspReference": "8835495304426403",
    "resultCode": "IdentifyShopper"
}

Get the 3D Secure 2 device fingerprint

If your server receives IdentifyShopper resultCode, start the 3D Secure 2 device fingerprinting process.

  1. Get the following values from the /authorise response:
    • threeds2.threeDS2DirectoryServerInformation.directoryServerId
    • threeds2.threeDS2DirectoryServerInformation.publicKey
  2. Create an instance of ADYServiceParameterswith the values from the /authorise response

    ADYServiceParameters *parameters = [ADYServiceParameters new];
    [parameters setDirectoryServerIdentifier:...]; // Retrieved from Adyen.
    [parameters setDirectoryServerPublicKey:...]; // Retrieved from Adyen.

    For a complete description of all the classes used in the SDK, see our appledoc page.

  3. Use ADYService class method to create a transaction.

    [ADYService serviceWithParameters:parameters appearanceConfiguration:nil completionHandler:^(ADYService *service) {
        NSError *error = nil;
        ADYTransaction *transaction = [service transactionWithMessageVersion:nil error:&error];
        if (transaction) {
            ADYAuthenticationRequestParameters *authenticationRequestParameters = [transaction authenticationRequestParameters];
            // Submit the authenticationRequestParameters to /authorise3ds2.
        } else {
            // An error occurred.
        }
    }];

    Keep a reference to your ADYTransaction instance until the transaction is complete.

  4. Use the transaction's authenticationRequestParameters and pass them on to your server.

    Get the following information:

    • deviceInformation
    • SDKTransactionIdentifier
    • SDKApplicationIdentifier
    • SDKReferenceNumber
    • SDKEphemeralPublicKey
    • messageVersion
  5. Send the encrypted device finger print information to Adyen. Use the data from the transaction from the authenticationRequestParameters  and pass them as parameters in a POST /authorise3ds2 call.

    • sdkEncData: Device information
    • sdkTransID: SDK Transaction Identifier
    • sdkAppID: SDK Application Identifier
    • sdkReferenceNumber: SDK Reference Number
    • sdkEphemPubKey: SDK Ephemeral Public Key
    • messageVersion

In addition to the regular parameters you provide to Adyen, send additional parameters in the following list. We recommend that you provide all available information to increase the likelihood of achieving a frictionless flow and a higher authorisation rate.

Request

{
    "merchantAccount": "YOUR_MERCHANT_ACCOUNT",
    "threeDS2RequestData": {
        "deviceChannel": "app",
        "sdkAppID": "9063b12c-fcde-43c7-b28e-8d0af5520e8a",
        "sdkEncData": "<device-fingerprint>",
        "sdkEphemPubKey": {
            "crv": "P-256",
            "kty": "EC",
            "x": "LYImJkRzS92vogM6AUPCBhJ20VagSe8IL0Q9SdisUSo",
            "y": "Rav4sKHnLUIUHVdyR4dyV7G2_EeAnuCn_6621ZhqZYU"
            }
        },
        "sdkReferenceNumber": "3DS_LOA_SDK_ADBV_739485_94783",
        "sdkTransID": "b60c9879-ac77-4918-a317-7b01c4317053/8Q==.."
}

Response

You'll receive a response containing a resultCode that can be:

  • Authorised – Indicates that the 3D Secure 2 authentication was frictionless, and the payment authorisation was successfully completed. This state serves as an indicator to proceed with the delivery of goods and services. 
  • ChallengeShopper – The issuer has requested further shopper interaction. Perform the Challenge flow.

For a complete list of resultCode values and the actions that you need to take, see Result codes.

{
    "additionalData": {
        "threeds2.threeDS2ResponseData.acsSignedContent": "eyJhbGciOiJQUzI1NiIsIngPVEFOQmdrcWhraUc5dtw4I-RBJ8_OUt8yIZEsoc...",
        "threeds2.threeDS2ResponseData.transStatus": "C",
        "threeds2.threeDS2ResponseData.acsChallengeMandated": "Y",
        "threeds2.threeDS2ResponseData.acsURL": "https://pal-test.adyen.com/threeds2simulator/services/ThreeDS2Simulator/v1/handle/83e78317-e73f-4a6f-j738-7hj09p07n178",
        "threeds2.threeDS2ResponseData.threeDSServerTransID": "930h2k09-1986-4hl2-800a-c8d7783918bf",
        "threeds2.threeDS2ResponseData.authenticationType": "01",
        "threeds2.threeDS2ResponseData.messageVersion": "2.1.0",
        "threeds2.threeDS2Token": "BQABAQC2LEWucYNwQRzhH9c1/hup5ZZa9HUehFbwdC86PAfhpGJ/+...",
        "threeds2.threeDS2ResponseData.acsTransID": "45e79886-e60c-4c6d-a962-7aa43d59b150",
        "threeds2.threeDS2ResponseData.acsReferenceNumber": "ADYEN-ACS-SIMULATOR"
    },
    "pspReference": "8825495326513370",
    "resultCode": "ChallengeShopper"
}

Present a challenge

If your server receives ChallengeShopper resultCode, this means that the issuer would like to perform additional checks in order to verify that the shopper is indeed the cardholder.

  1. Get the following parameters from the /authorise3ds2 response.
    • threeds2.threeDS2ResponseData.threeDSServerTransID
    • threeds2.threeDS2ResponseData.acsTransID
    • threeds2.threeDS2ResponseData.acsReferenceNumber
    • threeds2.threeDS2ResponseData.acsSignedContent
  2. Create an instance of ADYChallengeParameters and pass the values from the previous step.

    NSDictionary *additionalData = ...; // Retrieved from Adyen.
    ADYChallengeParameters *parameters = [ADYChallengeParameters challengeParametersWithServerTransactionIdentifier:additionalData[@"threeds2.threeDS2ResponseData.threeDSServerTransID"]                                                                                    ACSTransactionIdentifier:additionalData[@"threeds2.threeDS2ResponseData.acsTransID"]
    ACSReferenceNumber:additionalData[@"threeds2.threeDS2ResponseData.acsReferenceNumber"]                                                                                               ACSSignedContent:additionalData[@"threeds2.threeDS2ResponseData.acsSignedContent"]];
  3. Present the challenge.

    [transaction performChallengeWithParameters:parameters completionHandler:^(ADYChallengeResult *result, NSError *error) {
        if (result) {
            NSString *transactionStatus = [result transactionStatus];
            // Submit the transactionStatus to /authorise3ds2.
        } else {
            // An error occurred.
        }
    }];

    When the challenge flow has been completed, submit the transactionStatus from the result to your server.

  4. Make a POST /authorise3ds2 request from your server. Include the transStatus generated by the SDK and the threeds2.threeDS2Token.

    Request

    {
        "merchantAccount": "YOUR_MERCHANT_ACCOUNT",
        "threeDS2Result": {
            "transStatus": "Y"
        },
        "threeDS2Token": "BQABAQC2LEWucYNwQRzhH9c1/hup5ZZa9HUehFbwdC86PAfhpGJ/+..."
    }
    

    Response

    You'll receive Authorised as the resultCode if the payment was successful. 

    {
        "additionalData": {
            "liabilityShift": "true",
            "authCode": "44402",
            "avsResult": "4 AVS not supported for this card type",
            "threeDOffered": "true",
            "refusalReasonRaw": "AUTHORISED",
            "authorisationMid": "1000",
            "acquirerAccountCode": "TestPmmAcquirerAccount",
            "cvcResult": "1 Matches",
            "avsResultRaw": "4",
            "threeDAuthenticated": "true",
            "cvcResultRaw": "M",
            "acquirerCode": "TestPmmAcquirer",
            "acquirerReference": "7CASOGMCCB4"
        },
        "pspReference": "8825495331860022",
        "resultCode": "Authorised",
        "authCode": "44402"
    }

Optional implementation: Prefetch device fingerprinting keys

This functionality requires additional configuration on Adyen's end. To enable it, contact the  Support Team.

You can opt to retrieve and cache 3D Secure device fingerprint keys for specific BIN ranges or card brands. When you cache the keys, you reduce the number of calls for each transaction as you can already start with performing 3D Secure 2 device fingerprinting.

To use cached keys for your authentication flow, you will need to:

  1. Retrieve and cache device fingerprinting keys once for each card brand or BIN.
  2. Perform 3D Secure 2 device fingerprinting to start an authentication flow for a transaction.
  3. Submit a payment request with the encrypted device fingerprint information.
  4. Present a challenge if required by the issuer.

Make sure to update your cache regularly to get the latest keys and to avoid getting your transactions refused.

Get device fingerprinting keys

To retrieve device fingerprinting keys, send a POST /get3dsAvailability request, providing either a cardNumber from a BIN range you want to cache or a list of card brand names, along with your merchantAccount.

Sample request with card number

  • cardNumber
{
   "merchantAccount":"YOUR_MERCHANT_ACCOUNT",
   "cardNumber":"4212345678901245"
}

Response

{  
  "dsPublicKeys":[  
    {  
      "brand":"visa",
      "directoryServerId":"A000000003",
      "publicKey":"eyJrdHkiOiJSU0.....Eb0dyY2JbOV80NncifQ=="
    }
  ],
  "threeDS1Supported": true,
  "threeDS2Supported": true,
  "threeDS2CardRangeDetails":[  
    {  
      "brandCode":"visa",
      "endRange":"42123456",
      "startRange":"42123456",
      "threeDS2Version":"2.1.0",
      "threeDSMethodURL":"https://pal-test.adyen.com/threeds2simulator/acs/startMethod.shtml"
    }
  ]
}

Sample request with card brand

{
   "merchantAccount":"YOUR_MERCHANT_ACCOUNT",
   "brands" : ["visa","mc"]
}

Response

{  
  "dsPublicKeys":[  
    {  
      "brand":"visa",
      "directoryServerId":"A000000003",
      "publicKey":"eyJrdHkiOiJSU0EiLCJlIjoiQVFBQiIsIm4iOiI4VFBxZkFOW..."
    },
    {  
      "brand":"mc",
      "directoryServerId":"A000000011",
      "publicKey":"dabJHa91fadhUVZjZ1g4LUpWZ1Y0M2diWURtYmdTY0N5SkVSN..."
    }
  ]
}
Cache the values of the following parameters for the specific BIN range or brand:
  • dsPublicKeys.directoryServerId

  • dsPublicKeys.publicKey


Next, use the cached keys to get the shopper's 3D Secure 2 device fingerprint.

Perform 3D Secure 2 device fingerprinting with cached keys

  1. Create an instance of ADYServiceParameters with the cached keys

    ADYServiceParameters *parameters = [ADYServiceParameters new];
        [parameters setDirectoryServerIdentifier:...]; // Retrieved from Adyen.
        [parameters setDirectoryServerPublicKey:...]; // Retrieved from Adyen.
  2. Use ADYService class method to create a transaction.

    [ADYService transactionWithParameters:parameters appearanceConfiguration:nil completionHandler:^(ADYTransaction *transaction, NSArray<ADYWarning *> *warnings, NSError *error) {
        if (transaction) {
            ADYAuthenticationRequestParameters *authenticationRequestParameters = [transaction authenticationRequestParameters];
        } else {
            // An error occurred.
        }
    }];
  3. Use the transaction's authenticationRequestParameters and pass them on to your server.

    Get the following information:

    • deviceInformation
    • SDKTransactionIdentifier
    • SDKApplicationIdentifier
    • SDKReferenceNumber
    • SDKEphemeralPublicKey
    • messageVersion
  4. Send the encrypted device fingerprint information to Adyen. Use the data from the transaction from the authenticationRequestParameters  and pass them as parameters in your /authorise call.

    Get the following information:

    • sdkEncData: Device Information
    • sdkTransID: SDK Transaction Identifier
    • sdkAppID: SDK Application Identifier
    • sdkReferenceNumber: SDK Reference Number
    • sdkEphemPubKey: SDK Ephemeral Public Key
    • messageVersion

In addition to the regular parameters you provide to Adyen, send additional parameters in the following list. We recommend that you provide all available information to increase the likelihood of achieving a frictionless flow and a higher authorisation rate.

Request

{
    "merchantAccount": "YOUR_MERCHANT_ACCOUNT",
    "threeDS2RequestData": {
        "deviceChannel": "app",
        "sdkAppID": "9063b12c-fcde-43c7-b28e-8d0af5520e8a",
        "sdkEncData": "<device-fingerprint>",
        "sdkEphemPubKey": {
            "crv": "P-256",
            "kty": "EC",
            "x": "LYImJkRzS92vogM6AUPCBhJ20VagSe8IL0Q9SdisUSo",
            "y": "Rav4sKHnLUIUHVdyR4dyV7G2_EeAnuCn_6621ZhqZYU"
            }
        },
        "sdkReferenceNumber": "3DS_LOA_SDK_ADBV_739485_94783",
        "sdkTransID": "b60c9879-ac77-4918-a317-7b01c4317053/8Q==.."
}

Response

You'll receive a response containing a resultCode:

  • Authorised – Indicates that the 3D Secure 2 authentication was frictionless, and the payment authorisation was successfully completed. This state serves as an indicator to proceed with the delivery of goods and services. 

  • ChallengeShopper – The issuer has requested further shopper interaction. Perform the Challenge flow.

For a complete list of resultCode values and the actions that you need to take, see Result codes.

{
    "additionalData": {
        "threeds2.threeDS2ResponseData.acsSignedContent": "eyJhbGciOiJQUzI1NiIsIngPVEFOQmdrcWhraUc5dtw4I-RBJ8_OUt8yIZEsoc...",
        "threeds2.threeDS2ResponseData.transStatus": "C",
        "threeds2.threeDS2ResponseData.acsChallengeMandated": "Y",
        "threeds2.threeDS2ResponseData.acsURL": "https://pal-test.adyen.com/threeds2simulator/services/ThreeDS2Simulator/v1/handle/83e78317-e73f-4a6f-j738-7hj09p07n178",
        "threeds2.threeDS2ResponseData.threeDSServerTransID": "930h2k09-1986-4hl2-800a-c8d7783918bf",
        "threeds2.threeDS2ResponseData.authenticationType": "01",
        "threeds2.threeDS2ResponseData.messageVersion": "2.1.0",
        "threeds2.threeDS2Token": "BQABAQC2LEWucYNwQRzhH9c1/hup5ZZa9HUehFbwdC86PAfhpGJ/+...",
        "threeds2.threeDS2ResponseData.acsTransID": "45e79886-e60c-4c6d-a962-7aa43d59b150",
        "threeds2.threeDS2ResponseData.acsReferenceNumber": "ADYEN-ACS-SIMULATOR"
    },
    "pspReference": "8825495326513370",
    "resultCode": "ChallengeShopper"
}

UI customizations

The SDK inherits your app's theme to ensure the UI of the challenge flow fits your app's look and feel. If you require further UI customizations, the SDK provides some customization options through the ADYAppearanceConfiguration class. 

To customize your UI, create an instance of ADYAppearanceConfiguration, configure the desired properties, and pass it during initialization of the ADYService.

For example, to make the Continue button red and change its corner radius:

ADYAppearanceConfiguration *appearanceConfiguration = [ADYAppearanceConfiguration new];
[[appearanceConfiguration buttonAppearanceForButtonType:ADYAppearanceButtonTypeContinue] setBackgroundColor:[UIColor redColor]];
[[appearanceConfiguration buttonAppearanceForButtonType:ADYAppearanceButtonTypeContinue] setTextColor:[UIColor whiteColor]];
[[appearanceConfiguration buttonAppearanceForButtonType:ADYAppearanceButtonTypeContinue] setCornerRadius:3.0f];

[ADYService transactionWithParameters:parameters appearanceConfiguration:appearanceConfiguration completionHandler:...];

Check out ADYAppearanceConfiguration class reference documentation for a complete list of customizable properties.

Here is a list of customizable UI elements used in the challenge flow:

Customizable elements Customizable properties
Body
  • Font
  • Font color
  • Line height
Header
  • Font
  • Font color
  • Line height
Info items
  • Font
  • Font color
  • Line height
  • Border color
Input fields
  • Font
  • Font color
  • Separator color
  • Keyboard appearance
Input fields header
  • Font
  • Font color
Navigation bar
  • Background color
  • Status bar style
Screen
  • Background color
Submit/Next/Continue button
  • Font
  • Text transform
  • Font color
  • Background color
  • Corner radius
Cancel button
  • Font
  • Text transform
  • Font color
Resend button
  • Font
  • Text transform
  • Text color

Testing 3D Secure 2

Use the following resources to test 3D Secure 2 transactions:

  • Test cards:
    • 4212 3456 7890 1245
    • 5212 3456 7890 1242
  • To test specific scenarios, use the following amounts:
Amount Authentication scenario
12002 Frictionless
12100 Basic text authentication
12110 Basic single select
12120 Basic multi select
12130 Basic OOB authentication
12140 Basic HTML
12141 HTML OOB authentication
12150 App single select then text
  • For text challenges in an app-based integration, use 1234 for the password.

See also