{"title":"Android 3D Secure 2 SDK","category":"default","creationDate":1676371680,"content":"<div class=\"sc-notice warning\"><div>\n<p><strong>Adyen is no longer developing the Classic API integration<\/strong><\/p>\n<p>This page is for the Classic API (<code>\/authorise<\/code>) integration, which we no longer accept new integrations with. <\/p>\n<p>We strongly recommend migrating to the newer <a href=\"\/online-payments\/3d-secure\/native-3ds2\/android\">Native 3D Secure 2 for Android<\/a> integration. To use this newer integration, you must also <a href=\"\/pt\/online-payments\/upgrade-your-integration\/migrate-to-checkout-api\">migrate to the Checkout API<\/a>.<\/p>\n<\/div><\/div>\n<div class=\"additional-info-block output-inline\">\n<h5 class=\"article__heading additional-info-block__title\">PSD2 compliance<\/h5><div class=\"additional-info-block__body\"><p>If you are implementing 3D Secure to comply with PSD2 SCA, learn more from our <a href=\"\/pt\/online-payments\/psd2-sca-compliance-and-implementation-guide\">comprehensive guide<\/a>.<\/p><\/div><\/div>\n\n<p>The <a href=\"https:\/\/github.com\/Adyen\/adyen-3ds2-android\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Adyen 3DS2 Android SDK<\/a> gets the device fingerprint and presents the challenge to your shopper. From your server, you need to send a payment request, the encrypted device fingerprint, and the challenge result to Adyen.<\/p>\n<p>In a full 3D Secure 2 implementation, a payment can go through either a <a href=\"\/pt\/online-payments\/classic-integrations\/classic-api-integration\/3d-secure-authentication\/native-3ds2#frictionless-flow\">frictionless<\/a> or a <a href=\"\/pt\/online-payments\/classic-integrations\/classic-api-integration\/3d-secure-authentication\/native-3ds2#challenge-flow\">challenge<\/a> authentication flow before it can be authorised.<\/p>\n<p>If you only want to perform a 3D Secure 2 authentication and then authorise the payment later, refer to the <a href=\"\/pt\/online-payments\/classic-integrations\/classic-api-integration\/3d-secure-authentication\/native-3ds2\/authentication-only-integration\">Authentication-only<\/a> documentation.<\/p>\n<h3>How it works<\/h3>\n<p>Here's how a 3D Secure 2 challenge authentication flow works:<\/p>\n<p><a rel=\"lightbox\" href=\"\/user\/pages\/docs\/02.online-payments\/60.classic-integrations\/01.classic-api-integration\/03.3d-secure-authentication\/09.native-3ds2\/03.android-sdk-integration\/3ds2-android.png\" src=\"\">\n  <img alt=\"\" src=\"\/user\/pages\/docs\/02.online-payments\/60.classic-integrations\/01.classic-api-integration\/03.3d-secure-authentication\/09.native-3ds2\/03.android-sdk-integration\/3ds2-android.png\" \/>\n<\/a><\/p>\n<ol>\n<li><a href=\"#submit-a-payment-request\">Submit a payment request<\/a>\u00a0with the required 3D Secure 2 objects to start the authentication process.\u00a0Build your implementation depending on the\u00a0<code>resultCode<\/code>\u00a0returned in the response. If the transaction is exempted from 3D Secure, you might get an <strong>Authorised<\/strong> result code.<\/li>\n<li>If you receive an <strong>IdentifyShopper<\/strong> <code>resultCode<\/code>, <a href=\"#get-the-3d-secure-2-device-fingerprint\">get the 3D Secure 2 device fingerprint<\/a> and send the encrypted device fingerprint information to Adyen. After you send the device fingerprint, it is possible that you receive an <strong>Authorised<\/strong><code>resultCode<\/code> in the response. This means that the 3D Secure 2 authentication was frictionless, and the payment was authorised.<\/li>\n<li>If you receive\u00a0<strong>ChallengeShopper<\/strong><code>resultCode<\/code>, this means that the issuer requires further shopper interaction and you need to <a href=\"#present-a-challenge\">present a challenge to the shopper<\/a>.<\/li>\n<li>After the 3D Secure 2 flow is complete, whether the transaction is successful or not, <a href=\"#close-the-transaction\">close the transaction<\/a> and clean up the <code>ThreeDS2Service.INSTANCE<\/code>.<\/li>\n<\/ol>\n<p>The payment might also be <a href=\"\/pt\/online-payments\/classic-integrations\/classic-api-integration\/3d-secure-authentication\/native-3ds2#3d-secure-1-fallback\">routed to 3D Secure 1<\/a>, based on issuer performance. This is indicated by a\u00a0<strong>RedirectShopper<\/strong>\u00a0<code>resultCode<\/code>. If you do not want to automatically fall back to 3D Secure 1, contact our <a href=\"https:\/\/ca-test.adyen.com\/ca\/ca\/contactUs\/support.shtml?form=other\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Support Team<\/a>.<\/p>\n<p>To test your integration, see\u00a0<a href=\"#testing-3d-secure-2\">Testing 3D Secure 2<\/a>.<\/p>\n<h2 id=\"before-you-begin\">Before\u00a0you begin<\/h2>\n<div class=\"additional-info-block output-inline\">\n<h5 class=\"article__heading additional-info-block__title\">Adyen 3DS2 Android<\/h5><div class=\"additional-info-block__body\"><p>Subscribe to our <a href=\"https:\/\/github.com\/Adyen\/adyen-3ds2-android\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">GitHub repository<\/a> to get the latest updates and versions.<\/p><\/div><\/div>\n\n<p>Before you begin to integrate, make sure you have followed the <a href=\"\/pt\/get-started-with-adyen\">Get started with Adyen guide<\/a> to:<\/p>\n<ul>\n<li>Get an overview of the steps needed to accept live payments.<\/li>\n<li>Create your test account.<\/li>\n<\/ul>\n<p>After you have created your test account:<\/p>\n<ol>\n<li>\n<p><a href=\"\/pt\/development-resources\/api-credentials#generate-api-key\">Get your API Key<\/a>. Save a copy, because you'll need it for API calls you make to the Adyen payments platform.<\/p>\n<\/li>\n<li>\n<p>Install one of our\u00a0<a href=\"\/pt\/development-resources\/libraries\">Libraries<\/a>\u00a0to connect with the Adyen APIs.<\/p>\n<\/li>\n<li>\n<p>Install the latest SDK version\u00a0either through Maven Central or our GitHub repository. You must use version 2.2.9 or later to trigger the 3D Secure 2 native flow.<\/p>\n\n<div id=\"tabnoY3S\">\n    <div data-component-wrapper=\"tabs\">\n        <tabs\n                        :items=\"[{&quot;title&quot;:&quot;Maven Central&quot;,&quot;content&quot;:&quot;\\n&lt;p&gt;Install the SDK through &lt;a href=\\&quot;https:\\\/\\\/repo1.maven.org\\\/maven2\\\/com\\\/adyen\\\/threeds\\\/adyen-3ds2\\\/\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot; class=\\&quot;external-link no-image\\&quot;&gt;Maven Central&lt;\\\/a&gt;.&lt;\\\/p&gt;\\n&lt;p&gt;Add this line to your\\u00a0&lt;code&gt;build.gradle&lt;\\\/code&gt;\\u00a0file.&lt;\\\/p&gt;\\n&lt;pre&gt;&lt;code class=\\&quot;language-java\\&quot;&gt;    implementation \\&quot;com.adyen.threeds:adyen-3ds2:&amp;lt;latestSDKVersion&amp;gt;\\&quot;&lt;\\\/code&gt;&lt;\\\/pre&gt;\\n&quot;,&quot;altTitle&quot;:null,&quot;oldTabId&quot;:&quot;maven_central_0_1&quot;,&quot;relation&quot;:&quot;&quot;},{&quot;title&quot;:&quot;GitHub&quot;,&quot;content&quot;:&quot;\\n&lt;p&gt;Install the SDK through our &lt;a href=\\&quot;https:\\\/\\\/github.com\\\/Adyen\\\/adyen-3ds2-android\\&quot; target=\\&quot;_blank\\&quot; rel=\\&quot;nofollow noopener noreferrer\\&quot; class=\\&quot;external-link no-image\\&quot;&gt;GitHub repository&lt;\\\/a&gt;.&lt;\\\/p&gt;\\n&lt;p&gt;Copy the SDK package &lt;code&gt;adyen-3ds2.aar&lt;\\\/code&gt;\\u00a0to the\\u00a0&lt;code&gt;\\\/libs&lt;\\\/code&gt;\\u00a0folder in your module and add this line to your module&#039;s\\u00a0&lt;code&gt;build.gradle&lt;\\\/code&gt;\\u00a0file.&lt;\\\/p&gt;\\n&lt;pre&gt;&lt;code class=\\&quot;language-java\\&quot;&gt;    implementation \\&quot;com.adyen.threeds:adyen-3ds2:&amp;lt;latestSDKVersion&amp;gt;@aar\\&quot;&lt;\\\/code&gt;&lt;\\\/pre&gt;\\n&quot;,&quot;altTitle&quot;:null,&quot;oldTabId&quot;:&quot;github_1_2&quot;,&quot;relation&quot;:&quot;&quot;}]\"\n            :should-update-when-url-changes='false'>\n        <\/tabs>\n    <\/div>\n<\/div>\n\n<\/li>\n<\/ol>\n<h2 id=\"submit-a-payment-request\">Step 1: Submit a\u00a0payment request<\/h2>\n<p>Collect your shopper's card details then make a payment with a POST <a href=\"https:\/\/docs.adyen.com\/api-explorer\/#\/Payment\/authorise\" class=\"codeLabel external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/authorise<\/a> request, and include the following:<\/p>\n<table>\n<thead>\n<tr>\n<th>Parameter name<\/th>\n<th style=\"text-align: center;\">Required<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><a href=\"https:\/\/docs.adyen.com\/api-explorer\/#\/Payment\/latest\/post\/authorise__reqParam_card\" class=\"codeLabel external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">card<\/a><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td>Object that contains the shopper's card details.<\/td>\n<\/tr>\n<tr>\n<td> <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Payment\/latest\/post\/authorise#request-threeDS2RequestData-deviceChannel\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">threeDS2RequestData.deviceChannel<\/a><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td>Set to <strong>app<\/strong>.<\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/docs.adyen.com\/api-explorer\/#\/Payment\/latest\/post\/authorise__reqParam_browserInfo\" class=\"codeLabel external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">browserInfo<\/a><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td>Object that contains the <code>userAgent<\/code> and <code>acceptHeader<\/code> fields. Indicates that your integration can handle <a href=\"\/pt\/online-payments\/classic-integrations\/classic-api-integration\/3d-secure-authentication\/3d-secure-1\">3D Secure 1 redirect authentication<\/a> in case the transaction is <a href=\"\/pt\/online-payments\/classic-integrations\/classic-api-integration\/3d-secure-authentication\/native-3ds2#3d-secure-1-fallback\">routed to 3D Secure 1<\/a>. If your integration is unable to generate this information, you can send the same data as in the request below.<\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/docs.adyen.com\/api-explorer\/Payment\/68\/post\/authorise#request-threeDS2RequestData-sdkVersion\" class=\"codeLabel external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">sdkVersion<\/a><\/td>\n<td style=\"text-align: center;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td>We recommend you use the <code>ThreeDS2Service.INSTANCE.getSDKVersion()<\/code> function to determine your 3DS2 sdkVersion. You can also get the sdkVersion from <a href=\"https:\/\/github.com\/Adyen\/adyen-3ds2-android\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Github<\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"sc-notice note\"><div>\n<p>You can send <a href=\"\/pt\/online-payments\/classic-integrations\/classic-api-integration\/3d-secure-authentication\/native-3ds2\/api-reference-3d-secure-2#3d-secure-2-additional-parameters\">additional parameters<\/a> for better authorization rates, and to increase the chance of a frictionless flow. You do not have to send all the additional parameters.  Send parameters that you know you can provide accurately, or that are mandatory in specific scenarios.<\/p>\n<\/div><\/div>\n<p>Here is an example of how to make a request for a <strong>EUR&nbsp;150<\/strong> purchase:<\/p>\n<div data-component-wrapper=\"code-sample\">\n    <code-sample :title=\"''\" :id=\"'705651292'\" :code-data=\"[{&quot;language&quot;:&quot;bash&quot;,&quot;tabTitle&quot;:&quot;curl&quot;,&quot;content&quot;:&quot;curl https:\\\/\\\/pal-test.adyen.com\\\/pal\\\/servlet\\\/Payment\\\/v68\\\/authorise \\\\\\n-H 'x-api-key: ADYEN_API_KEY' \\\\\\n-H 'content-type: application\\\/json' \\\\\\n-d '{\\n    \\&quot;amount\\&quot;:{\\n      \\&quot;currency\\&quot;:\\&quot;EUR\\&quot;,\\n      \\&quot;value\\&quot;:1500\\n    },\\n    \\&quot;merchantAccount\\&quot;:\\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;,\\n    \\&quot;reference\\&quot;:\\&quot;YOUR_ORDER_NUMBER\\&quot;,\\n    \\&quot;threeDS2RequestData\\&quot;:{\\n      \\&quot;deviceChannel\\&quot;:\\&quot;app\\&quot;,\\n      \\&quot;{hint:Required to trigger native. Get your sdkVersion and send it here. Do not hard code your sdkVersion.}sdkVersion{\\\/hint}\\&quot;: \\&quot;STATE_DATA\\&quot;\\n  },\\n  \\&quot;card\\&quot;:{\\n  \\&quot;cvc\\&quot;:\\&quot;737\\&quot;,\\n  \\&quot;expiryMonth\\&quot;:\\&quot;03\\&quot;,\\n  \\&quot;expiryYear\\&quot;:\\&quot;2030\\&quot;,\\n  \\&quot;holderName\\&quot;:\\&quot;Simon Hopper\\&quot;,\\n  \\&quot;number\\&quot;:\\&quot;4917610000000000\\&quot;\\n  },\\n  \\&quot;{hint:Required for 3D Secure 1}browserInfo{\\\/hint}\\&quot;: {\\n  \\&quot;userAgent\\&quot;:\\&quot;Mozilla\\\/5.0 (Linux; Android 6.0.1; Nexus 6P Build\\\/MMB29P) AppleWebKit\\\/537.36 (KHTML, like Gecko) Chrome\\\/47.0.2526.83 Mobile Safari\\\/537.36\\&quot;,\\n  \\&quot;acceptHeader\\&quot;:\\&quot;text\\\\\\\/html,application\\\\\\\/xhtml+xml,application\\\\\\\/xml;q=0.9,image\\\\\\\/webp,image\\\\\\\/apng,*\\\\\\\/*;q=0.8\\&quot;\\n  }\\n}'&quot;},{&quot;language&quot;:&quot;java&quot;,&quot;tabTitle&quot;:&quot;Java&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Java API Library v25.0.0\\nimport com.adyen.Client;\\nimport com.adyen.enums.Environment;\\nimport com.adyen.model.payment.*;\\nimport java.time.OffsetDateTime;\\nimport java.util.*;\\nimport com.adyen.service.*;\\n\\nClient client = new Client(\\&quot;ADYEN_API_KEY\\&quot;, Environment.TEST);\\n\\n\\\/\\\/ Create the request object(s)\\nAmount amount = new Amount()\\n  .currency(\\&quot;EUR\\&quot;)\\n  .value(1500L);\\n\\nThreeDS2RequestData threeDS2RequestData = new ThreeDS2RequestData()\\n  .sdkVersion(\\&quot;STATE_DATA\\&quot;)\\n  .deviceChannel(\\&quot;app\\&quot;);\\n\\nCard card = new Card()\\n  .cvc(\\&quot;737\\&quot;)\\n  .number(\\&quot;4917610000000000\\&quot;)\\n  .holderName(\\&quot;Simon Hopper\\&quot;)\\n  .expiryMonth(\\&quot;03\\&quot;)\\n  .expiryYear(\\&quot;2030\\&quot;);\\n\\nBrowserInfo browserInfo = new BrowserInfo()\\n  .acceptHeader(\\&quot;text\\\/html,application\\\/xhtml+xml,application\\\/xml;q=0.9,image\\\/webp,image\\\/apng,*\\\/*;q=0.8\\&quot;)\\n  .userAgent(\\&quot;Mozilla\\\/5.0 (Linux; Android 6.0.1; Nexus 6P Build\\\/MMB29P) AppleWebKit\\\/537.36 (KHTML, like Gecko) Chrome\\\/47.0.2526.83 Mobile Safari\\\/537.36\\&quot;);\\n\\nPaymentRequest paymentRequest = new PaymentRequest()\\n  .reference(\\&quot;YOUR_ORDER_NUMBER\\&quot;)\\n  .amount(amount)\\n  .merchantAccount(\\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;)\\n  .threeDS2RequestData(threeDS2RequestData)\\n  .card(card)\\n  .browserInfo(browserInfo);\\n\\n\\\/\\\/ Make the API call\\npaymentApi service = new paymentApi(client);\\nPaymentResult response = service.authorise(paymentRequest, null);&quot;},{&quot;language&quot;:&quot;php&quot;,&quot;tabTitle&quot;:&quot;PHP&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen PHP API Library v17.4.0\\nuse Adyen\\\\Client;\\nuse Adyen\\\\Environment;\\nuse Adyen\\\\Model\\\\Payments\\\\Amount;\\nuse Adyen\\\\Model\\\\Payments\\\\ThreeDS2RequestData;\\nuse Adyen\\\\Model\\\\Payments\\\\Card;\\nuse Adyen\\\\Model\\\\Payments\\\\BrowserInfo;\\nuse Adyen\\\\Model\\\\Payments\\\\PaymentRequest;\\nuse Adyen\\\\Service\\\\Payments\\\\PaymentsApi;\\n\\n$client = new Client();\\n$client-&gt;setXApiKey(\\&quot;ADYEN_API_KEY\\&quot;);\\n$client-&gt;setEnvironment(Environment::TEST);\\n\\n\\n\\\/\\\/ Create the request object(s)\\n$amount = new Amount();\\n$amount\\n  -&gt;setCurrency(\\&quot;EUR\\&quot;)\\n  -&gt;setValue(1500);\\n\\n$threeDS2RequestData = new ThreeDS2RequestData();\\n$threeDS2RequestData\\n  -&gt;setSdkVersion(\\&quot;STATE_DATA\\&quot;)\\n  -&gt;setDeviceChannel(\\&quot;app\\&quot;);\\n\\n$card = new Card();\\n$card\\n  -&gt;setCvc(\\&quot;737\\&quot;)\\n  -&gt;setNumber(\\&quot;4917610000000000\\&quot;)\\n  -&gt;setHolderName(\\&quot;Simon Hopper\\&quot;)\\n  -&gt;setExpiryMonth(\\&quot;03\\&quot;)\\n  -&gt;setExpiryYear(\\&quot;2030\\&quot;);\\n\\n$browserInfo = new BrowserInfo();\\n$browserInfo\\n  -&gt;setAcceptHeader(\\&quot;text\\\/html,application\\\/xhtml+xml,application\\\/xml;q=0.9,image\\\/webp,image\\\/apng,*\\\/*;q=0.8\\&quot;)\\n  -&gt;setUserAgent(\\&quot;Mozilla\\\/5.0 (Linux; Android 6.0.1; Nexus 6P Build\\\/MMB29P) AppleWebKit\\\/537.36 (KHTML, like Gecko) Chrome\\\/47.0.2526.83 Mobile Safari\\\/537.36\\&quot;);\\n\\n$paymentRequest = new PaymentRequest();\\n$paymentRequest\\n  -&gt;setReference(\\&quot;YOUR_ORDER_NUMBER\\&quot;)\\n  -&gt;setAmount($amount)\\n  -&gt;setMerchantAccount(\\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;)\\n  -&gt;setThreeDS2RequestData($threeDS2RequestData)\\n  -&gt;setCard($card)\\n  -&gt;setBrowserInfo($browserInfo);\\n\\n\\\/\\\/ Make the API call\\n$service = new PaymentsApi($client);\\n$response = $service-&gt;authorise($paymentRequest);&quot;},{&quot;language&quot;:&quot;cs&quot;,&quot;tabTitle&quot;:&quot;C#&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen .net API Library v14.4.0\\nusing Adyen;\\nusing Environment = Adyen.Model.Environment;\\nusing Adyen.Model;\\nusing Adyen.Model.Payment;\\nusing Adyen.Service;\\n\\nvar config = new Config()\\n{\\n    XApiKey = \\&quot;ADYEN_API_KEY\\&quot;,\\n    Environment = Environment.Test\\n};\\nvar client = new Client(config);\\n\\n\\\/\\\/ Create the request object(s)\\nAmount amount = new Amount\\n{\\n  Currency = \\&quot;EUR\\&quot;,\\n  Value = 1500\\n};\\n\\nThreeDS2RequestData threeDS2RequestData = new ThreeDS2RequestData\\n{\\n  SdkVersion = \\&quot;STATE_DATA\\&quot;,\\n  DeviceChannel = \\&quot;app\\&quot;\\n};\\n\\nCard card = new Card\\n{\\n  Cvc = \\&quot;737\\&quot;,\\n  Number = \\&quot;4917610000000000\\&quot;,\\n  HolderName = \\&quot;Simon Hopper\\&quot;,\\n  ExpiryMonth = \\&quot;03\\&quot;,\\n  ExpiryYear = \\&quot;2030\\&quot;\\n};\\n\\nBrowserInfo browserInfo = new BrowserInfo\\n{\\n  AcceptHeader = \\&quot;text\\\/html,application\\\/xhtml+xml,application\\\/xml;q=0.9,image\\\/webp,image\\\/apng,*\\\/*;q=0.8\\&quot;,\\n  UserAgent = \\&quot;Mozilla\\\/5.0 (Linux; Android 6.0.1; Nexus 6P Build\\\/MMB29P) AppleWebKit\\\/537.36 (KHTML, like Gecko) Chrome\\\/47.0.2526.83 Mobile Safari\\\/537.36\\&quot;\\n};\\n\\nPaymentRequest paymentRequest = new PaymentRequest\\n{\\n  Reference = \\&quot;YOUR_ORDER_NUMBER\\&quot;,\\n  Amount = amount,\\n  MerchantAccount = \\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;,\\n  ThreeDS2RequestData = threeDS2RequestData,\\n  Card = card,\\n  BrowserInfo = browserInfo\\n};\\n\\n\\\/\\\/ Make the API call\\nvar service = new PaymentService(client);\\nvar response = service.Authorise(paymentRequest);&quot;},{&quot;language&quot;:&quot;js&quot;,&quot;tabTitle&quot;:&quot;NodeJS (JavaScript)&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Node API Library v16.2.0\\n\\\/\\\/ Require the parts of the module you want to use\\nconst { Client, PaymentAPI } = require('@adyen\\\/api-library');\\n\\\/\\\/ Initialize the client object\\nconst client = new Client({apiKey: \\&quot;ADYEN_API_KEY\\&quot;, environment: \\&quot;TEST\\&quot;});\\n\\n\\\/\\\/ Create the request object(s)\\nconst paymentRequest = {\\n  amount: {\\n    currency: \\&quot;EUR\\&quot;,\\n    value: 1500\\n  },\\n  merchantAccount: \\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;,\\n  reference: \\&quot;YOUR_ORDER_NUMBER\\&quot;,\\n  threeDS2RequestData: {\\n    deviceChannel: \\&quot;app\\&quot;,\\n    sdkVersion: \\&quot;STATE_DATA\\&quot;\\n  },\\n  card: {\\n    cvc: \\&quot;737\\&quot;,\\n    expiryMonth: \\&quot;03\\&quot;,\\n    expiryYear: \\&quot;2030\\&quot;,\\n    holderName: \\&quot;Simon Hopper\\&quot;,\\n    number: \\&quot;4917610000000000\\&quot;\\n  },\\n  browserInfo: {\\n    userAgent: \\&quot;Mozilla\\\/5.0 (Linux; Android 6.0.1; Nexus 6P Build\\\/MMB29P) AppleWebKit\\\/537.36 (KHTML, like Gecko) Chrome\\\/47.0.2526.83 Mobile Safari\\\/537.36\\&quot;,\\n    acceptHeader: \\&quot;text\\\/html,application\\\/xhtml+xml,application\\\/xml;q=0.9,image\\\/webp,image\\\/apng,*\\\/*;q=0.8\\&quot;\\n  }\\n}\\n\\n\\\/\\\/ Make the API call\\nconst paymentAPI = new PaymentAPI(client);\\nconst response = paymentAPI.authorise(paymentRequest);&quot;},{&quot;language&quot;:&quot;go&quot;,&quot;tabTitle&quot;:&quot;Go&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Go API Library v9.3.0\\nimport (\\n  \\&quot;context\\&quot;\\n  \\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v9\\\/src\\\/common\\&quot;\\n  \\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v9\\\/src\\\/adyen\\&quot;\\n  \\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v9\\\/src\\\/payments\\&quot;\\n)\\nclient := adyen.NewClient(&amp;common.Config{\\n  ApiKey:      \\&quot;ADYEN_API_KEY\\&quot;,\\n  Environment: common.TestEnv,\\n})\\n\\n\\\/\\\/ Create the request object(s)\\namount := payments.Amount{\\n  Currency: \\&quot;EUR\\&quot;,\\n  Value: 1500,\\n}\\n\\nthreeDS2RequestData := payments.ThreeDS2RequestData{\\n  SdkVersion: common.PtrString(\\&quot;STATE_DATA\\&quot;),\\n  DeviceChannel: \\&quot;app\\&quot;,\\n}\\n\\ncard := payments.Card{\\n  Cvc: common.PtrString(\\&quot;737\\&quot;),\\n  Number: common.PtrString(\\&quot;4917610000000000\\&quot;),\\n  HolderName: common.PtrString(\\&quot;Simon Hopper\\&quot;),\\n  ExpiryMonth: common.PtrString(\\&quot;03\\&quot;),\\n  ExpiryYear: common.PtrString(\\&quot;2030\\&quot;),\\n}\\n\\nbrowserInfo := payments.BrowserInfo{\\n  AcceptHeader: \\&quot;text\\\/html,application\\\/xhtml+xml,application\\\/xml;q=0.9,image\\\/webp,image\\\/apng,*\\\/*;q=0.8\\&quot;,\\n  UserAgent: \\&quot;Mozilla\\\/5.0 (Linux; Android 6.0.1; Nexus 6P Build\\\/MMB29P) AppleWebKit\\\/537.36 (KHTML, like Gecko) Chrome\\\/47.0.2526.83 Mobile Safari\\\/537.36\\&quot;,\\n}\\n\\npaymentRequest := payments.PaymentRequest{\\n  Reference: \\&quot;YOUR_ORDER_NUMBER\\&quot;,\\n  Amount: amount,\\n  MerchantAccount: \\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;,\\n  ThreeDS2RequestData: &amp;threeDS2RequestData,\\n  Card: &amp;card,\\n  BrowserInfo: &amp;browserInfo,\\n}\\n\\n\\\/\\\/ Make the API call\\nservice := client.Payments()\\nreq := service.PaymentsApi.AuthoriseInput().PaymentRequest(paymentRequest)\\nres, httpRes, err := service.PaymentsApi.Authorise(context.Background(), req)&quot;},{&quot;language&quot;:&quot;py&quot;,&quot;tabTitle&quot;:&quot;Python&quot;,&quot;content&quot;:&quot;# Adyen Python API Library v12.2.0\\nimport Adyen\\n\\nadyen = Adyen.Adyen()\\nadyen.client.xapikey = \\&quot;ADYEN_API_KEY\\&quot;\\nadyen.client.platform = \\&quot;test\\&quot; # The environment to use library in.\\n\\n# Create the request object(s)\\njson_request = {\\n  \\&quot;amount\\&quot;: {\\n    \\&quot;currency\\&quot;: \\&quot;EUR\\&quot;,\\n    \\&quot;value\\&quot;: 1500\\n  },\\n  \\&quot;merchantAccount\\&quot;: \\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;,\\n  \\&quot;reference\\&quot;: \\&quot;YOUR_ORDER_NUMBER\\&quot;,\\n  \\&quot;threeDS2RequestData\\&quot;: {\\n    \\&quot;deviceChannel\\&quot;: \\&quot;app\\&quot;,\\n    \\&quot;sdkVersion\\&quot;: \\&quot;STATE_DATA\\&quot;\\n  },\\n  \\&quot;card\\&quot;: {\\n    \\&quot;cvc\\&quot;: \\&quot;737\\&quot;,\\n    \\&quot;expiryMonth\\&quot;: \\&quot;03\\&quot;,\\n    \\&quot;expiryYear\\&quot;: \\&quot;2030\\&quot;,\\n    \\&quot;holderName\\&quot;: \\&quot;Simon Hopper\\&quot;,\\n    \\&quot;number\\&quot;: \\&quot;4917610000000000\\&quot;\\n  },\\n  \\&quot;browserInfo\\&quot;: {\\n    \\&quot;userAgent\\&quot;: \\&quot;Mozilla\\\/5.0 (Linux; Android 6.0.1; Nexus 6P Build\\\/MMB29P) AppleWebKit\\\/537.36 (KHTML, like Gecko) Chrome\\\/47.0.2526.83 Mobile Safari\\\/537.36\\&quot;,\\n    \\&quot;acceptHeader\\&quot;: \\&quot;text\\\/html,application\\\/xhtml+xml,application\\\/xml;q=0.9,image\\\/webp,image\\\/apng,*\\\/*;q=0.8\\&quot;\\n  }\\n}\\n\\n# Make the API call\\nresult = adyen.payment.payments_api.authorise(request=json_request)&quot;},{&quot;language&quot;:&quot;rb&quot;,&quot;tabTitle&quot;:&quot;Ruby&quot;,&quot;content&quot;:&quot;# Adyen Ruby API Library v9.3.0\\nrequire \\&quot;adyen-ruby-api-library\\&quot;\\n\\nadyen = Adyen::Client.new\\nadyen.api_key = 'ADYEN_API_KEY'\\nadyen.env = :test # Set to \\&quot;live\\&quot; for live environment\\n\\n# Create the request object(s)\\nrequest_body = {\\n  :amount =&gt; {\\n    :currency =&gt; 'EUR',\\n    :value =&gt; 1500\\n  },\\n  :merchantAccount =&gt; 'YOUR_MERCHANT_ACCOUNT',\\n  :reference =&gt; 'YOUR_ORDER_NUMBER',\\n  :threeDS2RequestData =&gt; {\\n    :deviceChannel =&gt; 'app',\\n    :sdkVersion =&gt; 'STATE_DATA'\\n  },\\n  :card =&gt; {\\n    :cvc =&gt; '737',\\n    :expiryMonth =&gt; '03',\\n    :expiryYear =&gt; '2030',\\n    :holderName =&gt; 'Simon Hopper',\\n    :number =&gt; '4917610000000000'\\n  },\\n  :browserInfo =&gt; {\\n    :userAgent =&gt; 'Mozilla\\\/5.0 (Linux; Android 6.0.1; Nexus 6P Build\\\/MMB29P) AppleWebKit\\\/537.36 (KHTML, like Gecko) Chrome\\\/47.0.2526.83 Mobile Safari\\\/537.36',\\n    :acceptHeader =&gt; 'text\\\/html,application\\\/xhtml+xml,application\\\/xml;q=0.9,image\\\/webp,image\\\/apng,*\\\/*;q=0.8'\\n  }\\n}\\n\\n# Make the API call\\nresult = adyen.payment.payments_api.authorise(request_body)&quot;},{&quot;language&quot;:&quot;ts&quot;,&quot;tabTitle&quot;:&quot;NodeJS (TypeScript)&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Node API Library v16.2.0\\n\\\/\\\/ Require the parts of the module you want to use\\nimport { Client, PaymentAPI, Types } from \\&quot;@adyen\\\/api-library\\&quot;;\\n\\\/\\\/ Initialize the client object\\nconst client = new Client({apiKey: \\&quot;ADYEN_API_KEY\\&quot;, environment: \\&quot;TEST\\&quot;});\\n\\n\\\/\\\/ Create the request object(s)\\nconst amount: Types.payment.Amount = {\\n  currency: \\&quot;EUR\\&quot;,\\n  value: 1500\\n};\\n\\nconst threeDS2RequestData: Types.payment.ThreeDS2RequestData = {\\n  sdkVersion: \\&quot;STATE_DATA\\&quot;,\\n  deviceChannel: \\&quot;app\\&quot;\\n};\\n\\nconst card: Types.payment.Card = {\\n  cvc: \\&quot;737\\&quot;,\\n  number: \\&quot;4917610000000000\\&quot;,\\n  holderName: \\&quot;Simon Hopper\\&quot;,\\n  expiryMonth: \\&quot;03\\&quot;,\\n  expiryYear: \\&quot;2030\\&quot;\\n};\\n\\nconst browserInfo: Types.payment.BrowserInfo = {\\n  acceptHeader: \\&quot;text\\\/html,application\\\/xhtml+xml,application\\\/xml;q=0.9,image\\\/webp,image\\\/apng,*\\\/*;q=0.8\\&quot;,\\n  userAgent: \\&quot;Mozilla\\\/5.0 (Linux; Android 6.0.1; Nexus 6P Build\\\/MMB29P) AppleWebKit\\\/537.36 (KHTML, like Gecko) Chrome\\\/47.0.2526.83 Mobile Safari\\\/537.36\\&quot;\\n};\\n\\nconst paymentRequest: Types.payment.PaymentRequest = {\\n  reference: \\&quot;YOUR_ORDER_NUMBER\\&quot;,\\n  amount: amount,\\n  merchantAccount: \\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;,\\n  threeDS2RequestData: threeDS2RequestData,\\n  card: card,\\n  browserInfo: browserInfo\\n};\\n\\n\\\/\\\/ Make the API call\\nconst paymentAPI = new PaymentAPI(client);\\nconst response = paymentAPI.authorise(paymentRequest);&quot;}]\" :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<p><a id=\"payment-response-params\"><\/a><br \/>\nYou receive a response containing a <code>resultCode<\/code> of:<\/p>\n<ul>\n<li>\u00a0<strong>IdentifyShopper<\/strong>. This means that you need to perform the\u00a0<a href=\"#get-the-3d-secure-2-device-fingerprint\">Identify the shopper<\/a>\u00a0flow. You also get the following parameters from the response, which you'll need to create a transaction in the SDK:\n<ul>\n<li><code>additionalData.threeds2.threeDS2DirectoryServerInformation.directoryServerId<\/code><\/li>\n<li><code>additionalData.threeds2.threeDS2DirectoryServerInformation.publicKey<\/code><\/li>\n<li><code>additionalData.threeds2.threeDS2DirectoryServerInformation.rootCertificates<\/code><\/li>\n<li><code>additionalData.threeds2.threeDS2ResponseData.messageVersion<\/code><\/li>\n<\/ul><\/li>\n<\/ul>\n<p>We recommend that you always get these values from the <code>\/authorise<\/code> response and pass them to the SDK.<\/p>\n<div class=\"notices green\">\n<p>For a complete list of <code>resultCode<\/code> values and the actions you need to take, see\u00a0<a href=\"\/pt\/online-payments\/payment-result-codes\">Result codes<\/a>.<\/p>\n<\/div>\n<p>Here's an example of a response showing an <strong>IdentifyShopper<\/strong> result code:<\/p>\n<div data-component-wrapper=\"code-sample\">\n    <code-sample :title=\"'Payment response'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"additionalData\\\": {\\n        \\\"threeds2.threeDSServerTransID\\\": \\\"055fadfb-9fe4-4e70-99f0-9b8935bf1eb2\\\",\\n        \\\"threeds2.threeDS2DirectoryServerInformation.algorithm\\\": \\\"RSA\\\",\\n        \\\"threeds2.threeDS2ResponseData.messageVersion\\\" : \\\"2.1.0\\\",\\n        \\\"threeds2.threeDS2Token\\\": \\\"BQABAQC2LEWucYNwQRzhH9c1\\\/hup5ZZa9HUehFbwdC86PAfhpGJ\\\/+...\\\",\\n        \\\"threeds2.threeDS2DirectoryServerInformation.directoryServerId\\\": \\\"A000000003\\\",\\n        \\\"threeds2.threeDS2DirectoryServerInformation.publicKey\\\": \\\"eyJrdHkiOiJSU0EiLCJlIjoiQVFBQiIsIm4iOiI4VFBxZkFQ==...\\\",\\n        \\\"threeds2.threeDS2DirectoryServerInformation.rootCertificates\\\": \\\"........\\\"\\n    },\\n    \\\"pspReference\\\": \\\"8835495304426403\\\",\\n    \\\"resultCode\\\": \\\"IdentifyShopper\\\"\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<p>Save <code>additionalData.threeds2.threeDS2Token<\/code> and include it in every request.<\/p>\n<h2 id=\"get-the-3d-secure-2-device-fingerprint\">Step 2: Get the 3D Secure 2 device fingerprint<\/h2>\n<p>If your server receives an\u00a0<strong>IdentifyShopper<\/strong> <code>resultCode<\/code>, start the 3D Secure 2\u00a0device fingerprinting process.<\/p>\n<ol>\n<li>\n<p>Create an instance of <a href=\"https:\/\/adyen.github.io\/adyen-3ds2-android\/com\/adyen\/threeds2\/parameters\/ConfigParameters.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">\n  <code>ConfigParameters<\/code>\n<\/a> passing the <code>directoryServerId<\/code>, the <code>publicKey<\/code> and the <code>rootCertificates<\/code> parameters from the  <code>\/authorise<\/code> <a href=\"#payment-response-params\">response<\/a> or from your <a href=\"\/pt\/online-payments\/classic-integrations\/classic-api-integration\/3d-secure-authentication\/native-3ds2\/browser-based-integration#optional-prefetch-device-fingerprinting-keys\">prefetched cached keys<\/a>.<\/p>\n<pre><code class=\"language-java\">ConfigParameters configParameters = new AdyenConfigParameters.Builder(\n        {hint:The directoryServerId from the authorise response}directoryServerId{\/hint},\n        {hint:The publicKey from the authorise response}directoryServerPublicKey{\/hint},\n        {hint:The rootCertificates from the authorise response}directoryServerRootCertificates{\/hint} \/\/ null if using prefetched device fingerprinting keys.\n).build();<\/code><\/pre>\n<\/li>\n<li>\n<p>Use <a href=\"https:\/\/adyen.github.io\/adyen-3ds2-android\/com\/adyen\/threeds2\/ThreeDS2Service.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">\n  <code>ThreeDS2Service.INSTANCE<\/code>\n<\/a> to create a transaction.<\/p>\n<ul>\n<li>\n<p>When using <a href=\"https:\/\/github.com\/Adyen\/adyen-3ds2-android\/releases\/tag\/2.2.0\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Adyen 3DS2 Android SDK version 2.2.0 and later<\/a>, you must pass the value of <code>additionalData.threeds2.threeDS2ResponseData.messageVersion<\/code> from the <code>\/authorise<\/code> response into <code>createTransaction<\/code>.<\/p>\n<p>For more information about the latest SDK version, refer to <a href=\"\/pt\/online-payments\/classic-integrations\/classic-api-integration\/3d-secure-authentication\/native-3ds2\/migrating-to-2-2\">Migrating to 3DS2 SDK version 2.2.0<\/a>.<\/p>\n<\/li>\n<\/ul>\n<div class=\"sc-notice note\"><div>\n<p>Keep a reference to your\u00a0<code>Transaction<\/code>\u00a0instance until the transaction is complete.<\/p>\n<\/div><\/div>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Create a transaction in the SDK'\" :id=\"''\" :code-data='[{\"language\":\"java\",\"tabTitle\":\"\",\"content\":\"ThreeDS2Service.INSTANCE.initialize(\\\/*Activity*\\\/ this, configParameters, null, null);\\n\\nTransaction mTransaction = ThreeDS2Service.INSTANCE.createTransaction(\\n\\tnull,\\n    {hint:The messageVersion from the authorise response}messageVersion{\\\/hint}\\n);\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<li>\n<p>Use the <a href=\"https:\/\/adyen.github.io\/adyen-3ds2-android\/com\/adyen\/threeds2\/AuthenticationRequestParameters.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">\n  <code>AuthenticationRequestParameters<\/code>\n<\/a> to get the device fingerprint information.<\/p>\n<pre><code class=\"language-java\">AuthenticationRequestParameters authenticationRequestParameters = mTransaction.getAuthenticationRequestParameters();<\/code><\/pre>\n<p>You'll get the following information:<\/p>\n<ul>\n<li><code>transaction.authenticationRequestParameters.deviceData<\/code><\/li>\n<li><code>transaction.authenticationRequestParameters.SDKTransactionID<\/code><\/li>\n<li><code>transaction.authenticationRequestParameters.SDKAppID<\/code><\/li>\n<li><code>transaction.authenticationRequestParameters.SDKReferenceNumber<\/code><\/li>\n<li><code>transaction.authenticationRequestParameters.SDKEphemeralPublicKey<\/code><\/li>\n<li><code>transaction.authenticationRequestParameters.messageVersion<\/code><br \/>\n<br><\/li>\n<\/ul>\n<\/li>\n<li>\n<p>From your server, make a POST\u00a0<a href=\"https:\/\/docs.adyen.com\/api-explorer\/#\/Payment\/authorise3ds2\" class=\"codeLabel external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/authorise3ds2<\/a>\u00a0request to send the encrypted device fingerprint information to Adyen:<\/p>\n<ul>\n<li><code>sdkEncData<\/code>: Device data<\/li>\n<li><code>sdkTransID<\/code>:\u00a0SDK Transaction ID<\/li>\n<li><code>sdkAppID<\/code>: SDK App ID<\/li>\n<li><code>sdkReferenceNumber<\/code>: SDK Reference Number<\/li>\n<li><code>sdkEphemPubKey<\/code>:  The SDK provides output as a string. Transform this string into a JSON object to send in your <a href=\"https:\/\/docs.adyen.com\/api-explorer\/#\/Payment\/authorise3ds2\" class=\"codeLabel external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/authorise3ds2<\/a> request.<\/li>\n<li><code>messageVersion<\/code>:  3D Secure 2 protocol version\n<div class=\"sc-notice note\"><div>\n<p>You can send <a href=\"\/pt\/online-payments\/classic-integrations\/classic-api-integration\/3d-secure-authentication\/native-3ds2\/api-reference-3d-secure-2#3d-secure-2-additional-parameters\">additional parameters<\/a> for better authorization rates, and to increase the chance of a frictionless flow. You do not have to send all the additional parameters.  Send parameters that you know you can provide accurately, or that are mandatory in specific scenarios.<\/p>\n<\/div><\/div><\/li>\n<\/ul>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Send device fingerprint to Adyen'\" :id=\"'send-device-fingerprint-to-adyen-8737872206'\" :code-data=\"[{&quot;language&quot;:&quot;bash&quot;,&quot;tabTitle&quot;:&quot;curl&quot;,&quot;content&quot;:&quot;curl https:\\\/\\\/pal-test.adyen.com\\\/pal\\\/servlet\\\/Payment\\\/v68\\\/authorise3ds2 \\\\\\n-H 'x-api-key: ADYEN_API_KEY' \\\\\\n-H 'content-type: application\\\/json' \\\\\\n-d '{\\n  \\&quot;merchantAccount\\&quot;: \\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;,\\n  \\&quot;threeDS2RequestData\\&quot;: {\\n    \\&quot;deviceChannel\\&quot;: \\&quot;app\\&quot;,\\n    \\&quot;sdkAppID\\&quot;: \\&quot;9063b12c-fcde-43c7-b28e-8d0af5520e8a\\&quot;,\\n    \\&quot;sdkEncData\\&quot;: \\&quot;&lt;device-fingerprint&gt;\\&quot;,\\n    \\&quot;sdkEphemPubKey\\&quot;: {\\n        \\&quot;crv\\&quot;: \\&quot;P-256\\&quot;,\\n        \\&quot;kty\\&quot;: \\&quot;EC\\&quot;,\\n        \\&quot;x\\&quot;: \\&quot;LYImJkRzS92vogM6AUPCBhJ20VagSe8IL0Q9SdisUSo\\&quot;,\\n        \\&quot;y\\&quot;: \\&quot;Rav4sKHnLUIUHVdyR4dyV7G2_EeAnuCn_6621ZhqZYU\\&quot;\\n    },\\n    \\&quot;sdkReferenceNumber\\&quot;: \\&quot;3DS_LOA_SDK_ADBV_739485_94783\\&quot;,\\n    \\&quot;sdkTransID\\&quot;: \\&quot;b60c9879-ac77-4918-a317-7b01c4317053\\\/8Q==..\\&quot;,\\n    \\&quot;messageVersion\\&quot;: \\&quot;2.2.0\\&quot;\\n  }\\n}'&quot;},{&quot;language&quot;:&quot;java&quot;,&quot;tabTitle&quot;:&quot;Java&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Java API Library v25.0.0\\nimport com.adyen.Client;\\nimport com.adyen.enums.Environment;\\nimport com.adyen.model.payment.*;\\nimport java.time.OffsetDateTime;\\nimport java.util.*;\\nimport com.adyen.service.*;\\n\\nClient client = new Client(\\&quot;ADYEN_API_KEY\\&quot;, Environment.TEST);\\n\\n\\\/\\\/ Create the request object(s)\\nSDKEphemPubKey sDKEphemPubKey2 = new SDKEphemPubKey()\\n  .kty(\\&quot;EC\\&quot;)\\n  .crv(\\&quot;P-256\\&quot;)\\n  .x(\\&quot;LYImJkRzS92vogM6AUPCBhJ20VagSe8IL0Q9SdisUSo\\&quot;)\\n  .y(\\&quot;Rav4sKHnLUIUHVdyR4dyV7G2_EeAnuCn_6621ZhqZYU\\&quot;);\\n\\nThreeDS2RequestData threeDS2RequestData2 = new ThreeDS2RequestData()\\n  .sdkReferenceNumber(\\&quot;3DS_LOA_SDK_ADBV_739485_94783\\&quot;)\\n  .sdkAppID(\\&quot;9063b12c-fcde-43c7-b28e-8d0af5520e8a\\&quot;)\\n  .sdkEncData(\\&quot;&lt;device-fingerprint&gt;\\&quot;)\\n  .messageVersion(\\&quot;2.2.0\\&quot;)\\n  .sdkTransID(\\&quot;b60c9879-ac77-4918-a317-7b01c4317053\\\/8Q==..\\&quot;)\\n  .deviceChannel(\\&quot;app\\&quot;)\\n  .sdkEphemPubKey(sDKEphemPubKey2);\\n\\nPaymentRequest3ds2 paymentRequest3ds2 = new PaymentRequest3ds2()\\n  .merchantAccount(\\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;)\\n  .threeDS2RequestData(threeDS2RequestData2);\\n\\n\\\/\\\/ Make the API call\\npaymentApi service = new paymentApi(client);\\nPaymentResult response = service.authorise3ds2(paymentRequest3ds2, null);&quot;},{&quot;language&quot;:&quot;php&quot;,&quot;tabTitle&quot;:&quot;PHP&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen PHP API Library v17.4.0\\nuse Adyen\\\\Client;\\nuse Adyen\\\\Environment;\\nuse Adyen\\\\Model\\\\Payments\\\\SDKEphemPubKey;\\nuse Adyen\\\\Model\\\\Payments\\\\ThreeDS2RequestData;\\nuse Adyen\\\\Model\\\\Payments\\\\PaymentRequest3ds2;\\nuse Adyen\\\\Service\\\\Payments\\\\PaymentsApi;\\n\\n$client = new Client();\\n$client-&gt;setXApiKey(\\&quot;ADYEN_API_KEY\\&quot;);\\n$client-&gt;setEnvironment(Environment::TEST);\\n\\n\\n\\\/\\\/ Create the request object(s)\\n$sDKEphemPubKey2 = new SDKEphemPubKey();\\n$sDKEphemPubKey2\\n  -&gt;setKty(\\&quot;EC\\&quot;)\\n  -&gt;setCrv(\\&quot;P-256\\&quot;)\\n  -&gt;setX(\\&quot;LYImJkRzS92vogM6AUPCBhJ20VagSe8IL0Q9SdisUSo\\&quot;)\\n  -&gt;setY(\\&quot;Rav4sKHnLUIUHVdyR4dyV7G2_EeAnuCn_6621ZhqZYU\\&quot;);\\n\\n$threeDS2RequestData2 = new ThreeDS2RequestData();\\n$threeDS2RequestData2\\n  -&gt;setSdkReferenceNumber(\\&quot;3DS_LOA_SDK_ADBV_739485_94783\\&quot;)\\n  -&gt;setSdkAppID(\\&quot;9063b12c-fcde-43c7-b28e-8d0af5520e8a\\&quot;)\\n  -&gt;setSdkEncData(\\&quot;&lt;device-fingerprint&gt;\\&quot;)\\n  -&gt;setMessageVersion(\\&quot;2.2.0\\&quot;)\\n  -&gt;setSdkTransID(\\&quot;b60c9879-ac77-4918-a317-7b01c4317053\\\/8Q==..\\&quot;)\\n  -&gt;setDeviceChannel(\\&quot;app\\&quot;)\\n  -&gt;setSdkEphemPubKey($sDKEphemPubKey2);\\n\\n$paymentRequest3ds2 = new PaymentRequest3ds2();\\n$paymentRequest3ds2\\n  -&gt;setMerchantAccount(\\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;)\\n  -&gt;setThreeDS2RequestData($threeDS2RequestData2);\\n\\n\\\/\\\/ Make the API call\\n$service = new PaymentsApi($client);\\n$response = $service-&gt;authorise3ds2($paymentRequest3ds2);&quot;},{&quot;language&quot;:&quot;cs&quot;,&quot;tabTitle&quot;:&quot;C#&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen .net API Library v14.4.0\\nusing Adyen;\\nusing Environment = Adyen.Model.Environment;\\nusing Adyen.Model;\\nusing Adyen.Model.Payment;\\nusing Adyen.Service;\\n\\nvar config = new Config()\\n{\\n    XApiKey = \\&quot;ADYEN_API_KEY\\&quot;,\\n    Environment = Environment.Test\\n};\\nvar client = new Client(config);\\n\\n\\\/\\\/ Create the request object(s)\\nSDKEphemPubKey sDKEphemPubKey2 = new SDKEphemPubKey\\n{\\n  Kty = \\&quot;EC\\&quot;,\\n  Crv = \\&quot;P-256\\&quot;,\\n  X = \\&quot;LYImJkRzS92vogM6AUPCBhJ20VagSe8IL0Q9SdisUSo\\&quot;,\\n  Y = \\&quot;Rav4sKHnLUIUHVdyR4dyV7G2_EeAnuCn_6621ZhqZYU\\&quot;\\n};\\n\\nThreeDS2RequestData threeDS2RequestData2 = new ThreeDS2RequestData\\n{\\n  SdkReferenceNumber = \\&quot;3DS_LOA_SDK_ADBV_739485_94783\\&quot;,\\n  SdkAppID = \\&quot;9063b12c-fcde-43c7-b28e-8d0af5520e8a\\&quot;,\\n  SdkEncData = \\&quot;&lt;device-fingerprint&gt;\\&quot;,\\n  MessageVersion = \\&quot;2.2.0\\&quot;,\\n  SdkTransID = \\&quot;b60c9879-ac77-4918-a317-7b01c4317053\\\/8Q==..\\&quot;,\\n  DeviceChannel = \\&quot;app\\&quot;,\\n  SdkEphemPubKey = sDKEphemPubKey2\\n};\\n\\nPaymentRequest3ds2 paymentRequest3ds2 = new PaymentRequest3ds2\\n{\\n  MerchantAccount = \\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;,\\n  ThreeDS2RequestData = threeDS2RequestData2\\n};\\n\\n\\\/\\\/ Make the API call\\nvar service = new PaymentService(client);\\nvar response = service.Authorise3ds2(paymentRequest3ds2);&quot;},{&quot;language&quot;:&quot;js&quot;,&quot;tabTitle&quot;:&quot;NodeJS (JavaScript)&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Node API Library v16.2.0\\n\\\/\\\/ Require the parts of the module you want to use\\nconst { Client, PaymentAPI } = require('@adyen\\\/api-library');\\n\\\/\\\/ Initialize the client object\\nconst client = new Client({apiKey: \\&quot;ADYEN_API_KEY\\&quot;, environment: \\&quot;TEST\\&quot;});\\n\\n\\\/\\\/ Create the request object(s)\\nconst paymentRequest3ds2 = {\\n  merchantAccount: \\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;,\\n  threeDS2RequestData: {\\n    deviceChannel: \\&quot;app\\&quot;,\\n    sdkAppID: \\&quot;9063b12c-fcde-43c7-b28e-8d0af5520e8a\\&quot;,\\n    sdkEncData: \\&quot;&lt;device-fingerprint&gt;\\&quot;,\\n    sdkEphemPubKey: {\\n      crv: \\&quot;P-256\\&quot;,\\n      kty: \\&quot;EC\\&quot;,\\n      x: \\&quot;LYImJkRzS92vogM6AUPCBhJ20VagSe8IL0Q9SdisUSo\\&quot;,\\n      y: \\&quot;Rav4sKHnLUIUHVdyR4dyV7G2_EeAnuCn_6621ZhqZYU\\&quot;\\n    },\\n    sdkReferenceNumber: \\&quot;3DS_LOA_SDK_ADBV_739485_94783\\&quot;,\\n    sdkTransID: \\&quot;b60c9879-ac77-4918-a317-7b01c4317053\\\/8Q==..\\&quot;,\\n    messageVersion: \\&quot;2.2.0\\&quot;\\n  }\\n}\\n\\n\\\/\\\/ Make the API call\\nconst paymentAPI = new PaymentAPI(client);\\nconst response = paymentAPI.authorise3ds2(paymentRequest3ds2);&quot;},{&quot;language&quot;:&quot;go&quot;,&quot;tabTitle&quot;:&quot;Go&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Go API Library v9.3.0\\nimport (\\n  \\&quot;context\\&quot;\\n  \\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v9\\\/src\\\/common\\&quot;\\n  \\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v9\\\/src\\\/adyen\\&quot;\\n  \\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v9\\\/src\\\/payments\\&quot;\\n)\\nclient := adyen.NewClient(&amp;common.Config{\\n  ApiKey:      \\&quot;ADYEN_API_KEY\\&quot;,\\n  Environment: common.TestEnv,\\n})\\n\\n\\\/\\\/ Create the request object(s)\\nsDKEphemPubKey2 := payments.SDKEphemPubKey{\\n  Kty: common.PtrString(\\&quot;EC\\&quot;),\\n  Crv: common.PtrString(\\&quot;P-256\\&quot;),\\n  X: common.PtrString(\\&quot;LYImJkRzS92vogM6AUPCBhJ20VagSe8IL0Q9SdisUSo\\&quot;),\\n  Y: common.PtrString(\\&quot;Rav4sKHnLUIUHVdyR4dyV7G2_EeAnuCn_6621ZhqZYU\\&quot;),\\n}\\n\\nthreeDS2RequestData2 := payments.ThreeDS2RequestData{\\n  SdkReferenceNumber: common.PtrString(\\&quot;3DS_LOA_SDK_ADBV_739485_94783\\&quot;),\\n  SdkAppID: common.PtrString(\\&quot;9063b12c-fcde-43c7-b28e-8d0af5520e8a\\&quot;),\\n  SdkEncData: common.PtrString(\\&quot;&lt;device-fingerprint&gt;\\&quot;),\\n  MessageVersion: common.PtrString(\\&quot;2.2.0\\&quot;),\\n  SdkTransID: common.PtrString(\\&quot;b60c9879-ac77-4918-a317-7b01c4317053\\\/8Q==..\\&quot;),\\n  DeviceChannel: \\&quot;app\\&quot;,\\n  SdkEphemPubKey: &amp;sDKEphemPubKey2,\\n}\\n\\npaymentRequest3ds2 := payments.PaymentRequest3ds2{\\n  MerchantAccount: \\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;,\\n  ThreeDS2RequestData: &amp;threeDS2RequestData2,\\n}\\n\\n\\\/\\\/ Make the API call\\nservice := client.Payments()\\nreq := service.PaymentsApi.Authorise3ds2Input().PaymentRequest3ds2(paymentRequest3ds2)\\nres, httpRes, err := service.PaymentsApi.Authorise3ds2(context.Background(), req)&quot;},{&quot;language&quot;:&quot;py&quot;,&quot;tabTitle&quot;:&quot;Python&quot;,&quot;content&quot;:&quot;# Adyen Python API Library v12.2.0\\nimport Adyen\\n\\nadyen = Adyen.Adyen()\\nadyen.client.xapikey = \\&quot;ADYEN_API_KEY\\&quot;\\nadyen.client.platform = \\&quot;test\\&quot; # The environment to use library in.\\n\\n# Create the request object(s)\\njson_request = {\\n  \\&quot;merchantAccount\\&quot;: \\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;,\\n  \\&quot;threeDS2RequestData\\&quot;: {\\n    \\&quot;deviceChannel\\&quot;: \\&quot;app\\&quot;,\\n    \\&quot;sdkAppID\\&quot;: \\&quot;9063b12c-fcde-43c7-b28e-8d0af5520e8a\\&quot;,\\n    \\&quot;sdkEncData\\&quot;: \\&quot;&lt;device-fingerprint&gt;\\&quot;,\\n    \\&quot;sdkEphemPubKey\\&quot;: {\\n      \\&quot;crv\\&quot;: \\&quot;P-256\\&quot;,\\n      \\&quot;kty\\&quot;: \\&quot;EC\\&quot;,\\n      \\&quot;x\\&quot;: \\&quot;LYImJkRzS92vogM6AUPCBhJ20VagSe8IL0Q9SdisUSo\\&quot;,\\n      \\&quot;y\\&quot;: \\&quot;Rav4sKHnLUIUHVdyR4dyV7G2_EeAnuCn_6621ZhqZYU\\&quot;\\n    },\\n    \\&quot;sdkReferenceNumber\\&quot;: \\&quot;3DS_LOA_SDK_ADBV_739485_94783\\&quot;,\\n    \\&quot;sdkTransID\\&quot;: \\&quot;b60c9879-ac77-4918-a317-7b01c4317053\\\/8Q==..\\&quot;,\\n    \\&quot;messageVersion\\&quot;: \\&quot;2.2.0\\&quot;\\n  }\\n}\\n\\n# Make the API call\\nresult = adyen.payment.payments_api.authorise3ds2(request=json_request)&quot;},{&quot;language&quot;:&quot;rb&quot;,&quot;tabTitle&quot;:&quot;Ruby&quot;,&quot;content&quot;:&quot;# Adyen Ruby API Library v9.3.0\\nrequire \\&quot;adyen-ruby-api-library\\&quot;\\n\\nadyen = Adyen::Client.new\\nadyen.api_key = 'ADYEN_API_KEY'\\nadyen.env = :test # Set to \\&quot;live\\&quot; for live environment\\n\\n# Create the request object(s)\\nrequest_body = {\\n  :merchantAccount =&gt; 'YOUR_MERCHANT_ACCOUNT',\\n  :threeDS2RequestData =&gt; {\\n    :deviceChannel =&gt; 'app',\\n    :sdkAppID =&gt; '9063b12c-fcde-43c7-b28e-8d0af5520e8a',\\n    :sdkEncData =&gt; '&lt;device-fingerprint&gt;',\\n    :sdkEphemPubKey =&gt; {\\n      :crv =&gt; 'P-256',\\n      :kty =&gt; 'EC',\\n      :x =&gt; 'LYImJkRzS92vogM6AUPCBhJ20VagSe8IL0Q9SdisUSo',\\n      :y =&gt; 'Rav4sKHnLUIUHVdyR4dyV7G2_EeAnuCn_6621ZhqZYU'\\n    },\\n    :sdkReferenceNumber =&gt; '3DS_LOA_SDK_ADBV_739485_94783',\\n    :sdkTransID =&gt; 'b60c9879-ac77-4918-a317-7b01c4317053\\\/8Q==..',\\n    :messageVersion =&gt; '2.2.0'\\n  }\\n}\\n\\n# Make the API call\\nresult = adyen.payment.payments_api.authorise3ds2(request_body)&quot;},{&quot;language&quot;:&quot;ts&quot;,&quot;tabTitle&quot;:&quot;NodeJS (TypeScript)&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Node API Library v16.2.0\\n\\\/\\\/ Require the parts of the module you want to use\\nimport { Client, PaymentAPI, Types } from \\&quot;@adyen\\\/api-library\\&quot;;\\n\\\/\\\/ Initialize the client object\\nconst client = new Client({apiKey: \\&quot;ADYEN_API_KEY\\&quot;, environment: \\&quot;TEST\\&quot;});\\n\\n\\\/\\\/ Create the request object(s)\\nconst sDKEphemPubKey2: Types.payment.SDKEphemPubKey = {\\n  kty: \\&quot;EC\\&quot;,\\n  crv: \\&quot;P-256\\&quot;,\\n  x: \\&quot;LYImJkRzS92vogM6AUPCBhJ20VagSe8IL0Q9SdisUSo\\&quot;,\\n  y: \\&quot;Rav4sKHnLUIUHVdyR4dyV7G2_EeAnuCn_6621ZhqZYU\\&quot;\\n};\\n\\nconst threeDS2RequestData2: Types.payment.ThreeDS2RequestData = {\\n  sdkReferenceNumber: \\&quot;3DS_LOA_SDK_ADBV_739485_94783\\&quot;,\\n  sdkAppID: \\&quot;9063b12c-fcde-43c7-b28e-8d0af5520e8a\\&quot;,\\n  sdkEncData: \\&quot;&lt;device-fingerprint&gt;\\&quot;,\\n  messageVersion: \\&quot;2.2.0\\&quot;,\\n  sdkTransID: \\&quot;b60c9879-ac77-4918-a317-7b01c4317053\\\/8Q==..\\&quot;,\\n  deviceChannel: \\&quot;app\\&quot;,\\n  sdkEphemPubKey: sDKEphemPubKey2\\n};\\n\\nconst paymentRequest3ds2: Types.payment.PaymentRequest3ds2 = {\\n  merchantAccount: \\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;,\\n  threeDS2RequestData: threeDS2RequestData2\\n};\\n\\n\\\/\\\/ Make the API call\\nconst paymentAPI = new PaymentAPI(client);\\nconst response = paymentAPI.authorise3ds2(paymentRequest3ds2);&quot;}]\" :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<p><a id=\"authorise3ds2-response\"><\/a><\/p>\n<p>You receive a response containing a\u00a0<code>resultCode<\/code>. Some of the possible values for <code>resultCode<\/code> are:<\/p>\n<ul>\n<li><strong>Authorised<\/strong>\u00a0\u2013\u00a0Indicates that the\u00a03D Secure 2 authentication was frictionless, and the payment authorisation was successfully completed. This means that you can already proceed with the delivery of goods and services.<\/li>\n<li><strong>ChallengeShopper<\/strong>\u00a0\u2013 The issuer has requested further shopper interaction. This means that you'll have to perform the\u00a0<a href=\"#present-a-challenge\">challenge flow<\/a>. You also get the following parameters from the response, which you'll need to start the challenge flow in the SDK:\n<ul>\n<li><code>threeds2.threeDS2ResponseData.threeDSServerTransID<\/code><\/li>\n<li><code>threeds2.threeDS2ResponseData.acsTransID<\/code><\/li>\n<li><code>threeds2.threeDS2ResponseData.acsReferenceNumber<\/code><\/li>\n<li><code>threeds2.threeDS2ResponseData.acsSignedContent<\/code><\/li>\n<li><code>threeds2.threeDS2Token<\/code><\/li>\n<\/ul><\/li>\n<\/ul>\n<div class=\"notices green\">\n<p>For a complete list of\u00a0<code>resultCode<\/code>\u00a0values and the actions that you need to take, see\u00a0<a href=\"\/pt\/online-payments\/payment-result-codes\">Result codes<\/a>.<\/p>\n<\/div>\n<p>Here's an example of a challenge flow response:<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Response showing ChallengeShopper'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"additionalData\\\": {\\n        \\\"threeds2.threeDS2ResponseData.acsSignedContent\\\": \\\"eyJhbGciOiJQUzI1NiIsIngPVEFOQmdrcWhraUc5dtw4I-RBJ8_OUt8yIZEsoc...\\\",\\n        \\\"threeds2.threeDS2ResponseData.transStatus\\\": \\\"C\\\",\\n        \\\"threeds2.threeDS2ResponseData.acsChallengeMandated\\\": \\\"Y\\\",\\n        \\\"threeds2.threeDS2ResponseData.acsURL\\\": \\\"https:\\\/\\\/pal-test.adyen.com\\\/threeds2simulator\\\/services\\\/ThreeDS2Simulator\\\/v1\\\/handle\\\/83e78317-e73f-4a6f-j738-7hj09p07n178\\\",\\n        \\\"threeds2.threeDS2ResponseData.threeDSServerTransID\\\": \\\"930h2k09-1986-4hl2-800a-c8d7783918bf\\\",\\n        \\\"threeds2.threeDS2ResponseData.authenticationType\\\": \\\"01\\\",\\n        \\\"threeds2.threeDS2ResponseData.messageVersion\\\": \\\"2.1.0\\\",\\n        \\\"threeds2.threeDS2Token\\\": \\\"BQABAQC2LEWucYNwQRzhH9c1\\\/hup5ZZa9HUehFbwdC86PAfhpGJ\\\/+...\\\",\\n        \\\"threeds2.threeDS2ResponseData.acsTransID\\\": \\\"45e79886-e60c-4c6d-a962-7aa43d59b150\\\",\\n        \\\"threeds2.threeDS2ResponseData.acsReferenceNumber\\\": \\\"ADYEN-ACS-SIMULATOR\\\"\\n    },\\n    \\\"pspReference\\\": \\\"8825495326513370\\\",\\n    \\\"resultCode\\\": \\\"ChallengeShopper\\\"\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<\/ol>\n<h2 id=\"present-a-challenge\">Step 3: Present a challenge<\/h2>\n<p>If your server receives a\u00a0<strong>ChallengeShopper<\/strong> <code>resultCode<\/code>, this means that the issuer would like to perform additional checks in order to verify that the shopper is indeed the cardholder.<\/p>\n<ol>\n<li>\n<p>Create an instance of <a href=\"https:\/\/adyen.github.io\/adyen-3ds2-android\/com\/adyen\/threeds2\/parameters\/ChallengeParameters.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">\n  <code>ChallengeParameters<\/code>\n<\/a> and pass the following:<\/p>\n<ul>\n<li>\n<p>The values from the <code>\/authorise3ds2<\/code> <a href=\"#authorise3ds2-response\">response<\/a>.<\/p>\n<\/li>\n<li>\n<p><code>ThreeDSRequestorAppURL<\/code>: This field is an optional field. If you use <a href=\"https:\/\/github.com\/Adyen\/adyen-3ds2-android\/releases\/tag\/2.2.12\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Adyen 3DS2 Android SDK version 2.2.12 and later<\/a>, your <code>ThreeDSRequestorAppURL<\/code> should be an <a href=\"https:\/\/developer.android.com\/training\/app-links\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Android App Link<\/a>. This is used to call your app after an <a href=\"\/pt\/online-payments\/classic-integrations\/classic-api-integration\/3d-secure-authentication\/native-3ds2\/migrating-to-2-2#supported\">out-of-band (OOB) authentication<\/a>. Your app must <a href=\"#handling-android-app-links\">handle the Android App Link<\/a>. Supported in <a href=\"\/pt\/online-payments\/classic-integrations\/classic-api-integration\/3d-secure-authentication\/native-3ds2\/migrating-to-2-2\">3D Secure version 2.2.0 and later<\/a>.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Create instance of ChallengeParameters'\" :id=\"''\" :code-data='[{\"language\":\"java\",\"tabTitle\":\"\",\"content\":\"Map&lt;String, String&gt; additionalData = ...; \\\/\\\/ Retrieved from Adyen.\\n\\nChallengeParameters challengeParameters = new ChallengeParameters();\\nchallengeParameters.set3DSServerTransactionID(additionalData.get(\\\"threeds2.threeDS2ResponseData.threeDSServerTransID\\\"));\\nchallengeParameters.setAcsTransactionID(additionalData.get(\\\"threeds2.threeDS2ResponseData.acsTransID\\\"));\\nchallengeParameters.setAcsRefNumber(additionalData.get(\\\"threeds2.threeDS2ResponseData.acsReferenceNumber\\\"));\\nchallengeParameters.setAcsSignedContent(additionalData.get(\\\"threeds2.threeDS2ResponseData.acsSignedContent\\\"));\\nchallengeParameters.setThreeDSRequestorAppURL(\\\"https:\\\/\\\/{yourapp.com}\\\/adyen3ds2\\\"); \\\/\\\/ Optional\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>Present the challenge.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Present the challenge flow'\" :id=\"''\" :code-data=\"[{&quot;language&quot;:&quot;java&quot;,&quot;tabTitle&quot;:&quot;&quot;,&quot;content&quot;:&quot;mTransaction.doChallenge(\\\/*Activity*\\\/ this, challengeParameters, new ChallengeStatusReceiver() {\\n                @Override\\n                public void completed(CompletionEvent completionEvent) {\\n                    String transactionStatus = completionEvent.getTransactionStatus();\\n                    \\\/\\\/ Submit the transactionStatus to \\\/authorise3ds2.\\n                }\\n\\n                @Override\\n                public void cancelled() {\\n                    \\\/\\\/ Cancelled by the user or the App.\\n                }\\n\\n                @Override\\n                public void timedout() {\\n                    \\\/\\\/ The user didn't submit the challenge within the given time, 5 minutes in this case.\\n                }\\n\\n                @Override\\n                public void protocolError(ProtocolErrorEvent protocolErrorEvent) {\\n                    \\\/\\\/ An error occurred.\\n                }\\n\\n                @Override\\n                public void runtimeError(RuntimeErrorEvent runtimeErrorEvent) {\\n                    \\\/\\\/ An error occurred.\\n                }\\n            }, 5);&quot;}]\" :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<li>\n<p>When the challenge flow has been completed, get the\u00a0<code>transactionStatus<\/code>\u00a0from the\u00a0<code>completionEvent<\/code>\u00a0and pass this to your server.<\/p>\n<\/li>\n<li>\n<p>From your server, make a POST\u00a0<a href=\"https:\/\/docs.adyen.com\/api-explorer\/#\/Payment\/authorise3ds2\" class=\"codeLabel external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/authorise3ds2<\/a>\u00a0request specifying the\u00a0<code>transStatus<\/code>\u00a0generated by the SDK and the\u00a0<code>threeds2.threeDS2Token<\/code>.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Send challenge result'\" :id=\"'send-challenge-result-8739532704'\" :code-data=\"[{&quot;language&quot;:&quot;bash&quot;,&quot;tabTitle&quot;:&quot;curl&quot;,&quot;content&quot;:&quot;curl https:\\\/\\\/pal-test.adyen.com\\\/pal\\\/servlet\\\/Payment\\\/v68\\\/authorise3ds2 \\\\\\n-H 'x-api-key: ADYEN_API_KEY' \\\\\\n-H 'content-type: application\\\/json' \\\\\\n-d '{\\n   \\&quot;merchantAccount\\&quot;: \\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;,\\n   \\&quot;threeDS2Result\\&quot;: {\\n      \\&quot;transStatus\\&quot;: \\&quot;Y\\&quot;\\n   },\\n  \\&quot;threeDS2Token\\&quot;: \\&quot;BQABAQC2LEWucYNwQRzhH9c1\\\/hup5ZZa9HUehFbwdC86PAfhpGJ\\\/+...\\&quot;\\n}'&quot;},{&quot;language&quot;:&quot;java&quot;,&quot;tabTitle&quot;:&quot;Java&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Java API Library v26.3.0\\nimport com.adyen.Client;\\nimport com.adyen.enums.Environment;\\nimport com.adyen.model.payment.*;\\nimport java.time.OffsetDateTime;\\nimport java.util.*;\\nimport com.adyen.service.*;\\n\\nClient client = new Client(\\&quot;ADYEN_API_KEY\\&quot;, Environment.TEST);\\n\\n\\\/\\\/ Create the request object(s)\\nThreeDS2Result threeDS2Result2 = new ThreeDS2Result()\\n  .transStatus(\\&quot;Y\\&quot;);\\n\\nPaymentRequest3ds2 paymentRequest3ds2 = new PaymentRequest3ds2()\\n  .threeDS2Result(threeDS2Result2)\\n  .threeDS2Token(\\&quot;BQABAQC2LEWucYNwQRzhH9c1\\\/hup5ZZa9HUehFbwdC86PAfhpGJ\\\/+...\\&quot;)\\n  .merchantAccount(\\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;);\\n\\n\\\/\\\/ Send the request\\npaymentApi service = new paymentApi(client);\\nPaymentResult response = service.authorise3ds2(paymentRequest3ds2, null);&quot;},{&quot;language&quot;:&quot;php&quot;,&quot;tabTitle&quot;:&quot;PHP&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen PHP API Library v18.2.1\\nuse Adyen\\\\Client;\\nuse Adyen\\\\Environment;\\nuse Adyen\\\\Model\\\\Payments\\\\ThreeDS2Result;\\nuse Adyen\\\\Model\\\\Payments\\\\PaymentRequest3ds2;\\nuse Adyen\\\\Service\\\\Payments\\\\PaymentsApi;\\n\\n$client = new Client();\\n$client-&gt;setXApiKey(\\&quot;ADYEN_API_KEY\\&quot;);\\n$client-&gt;setEnvironment(Environment::TEST);\\n\\n\\n\\\/\\\/ Create the request object(s)\\n$threeDS2Result2 = new ThreeDS2Result();\\n$threeDS2Result2\\n  -&gt;setTransStatus(\\&quot;Y\\&quot;);\\n\\n$paymentRequest3ds2 = new PaymentRequest3ds2();\\n$paymentRequest3ds2\\n  -&gt;setThreeDS2Result($threeDS2Result2)\\n  -&gt;setThreeDS2Token(\\&quot;BQABAQC2LEWucYNwQRzhH9c1\\\/hup5ZZa9HUehFbwdC86PAfhpGJ\\\/+...\\&quot;)\\n  -&gt;setMerchantAccount(\\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;);\\n\\n\\\/\\\/ Send the request\\n$service = new PaymentsApi($client);\\n$response = $service-&gt;authorise3ds2($paymentRequest3ds2);&quot;},{&quot;language&quot;:&quot;cs&quot;,&quot;tabTitle&quot;:&quot;C#&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen .net API Library v17.0.0\\nusing Adyen;\\nusing Environment = Adyen.Model.Environment;\\nusing Adyen.Model;\\nusing Adyen.Model.Payment;\\nusing Adyen.Service;\\n\\nvar config = new Config()\\n{\\n    XApiKey = \\&quot;ADYEN_API_KEY\\&quot;,\\n    Environment = Environment.Test\\n};\\nvar client = new Client(config);\\n\\n\\\/\\\/ Create the request object(s)\\nThreeDS2Result threeDS2Result2 = new ThreeDS2Result\\n{\\n  TransStatus = \\&quot;Y\\&quot;\\n};\\n\\nPaymentRequest3ds2 paymentRequest3ds2 = new PaymentRequest3ds2\\n{\\n  ThreeDS2Result = threeDS2Result2,\\n  ThreeDS2Token = \\&quot;BQABAQC2LEWucYNwQRzhH9c1\\\/hup5ZZa9HUehFbwdC86PAfhpGJ\\\/+...\\&quot;,\\n  MerchantAccount = \\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;\\n};\\n\\n\\\/\\\/ Send the request\\nvar service = new PaymentService(client);\\nvar response = service.Authorise3ds2(paymentRequest3ds2);&quot;},{&quot;language&quot;:&quot;js&quot;,&quot;tabTitle&quot;:&quot;NodeJS (JavaScript)&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Node API Library v17.3.0\\n\\\/\\\/ Require the parts of the module you want to use\\nconst { Client, PaymentAPI } = require('@adyen\\\/api-library');\\n\\\/\\\/ Initialize the client object\\nconst client = new Client({apiKey: \\&quot;ADYEN_API_KEY\\&quot;, environment: \\&quot;TEST\\&quot;});\\n\\n\\\/\\\/ Create the request object(s)\\nconst paymentRequest3ds2 = {\\n  merchantAccount: \\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;,\\n  threeDS2Result: {\\n    transStatus: \\&quot;Y\\&quot;\\n  },\\n  threeDS2Token: \\&quot;BQABAQC2LEWucYNwQRzhH9c1\\\/hup5ZZa9HUehFbwdC86PAfhpGJ\\\/+...\\&quot;\\n}\\n\\n\\\/\\\/ Send the request\\nconst paymentAPI = new PaymentAPI(client);\\nconst response = paymentAPI.authorise3ds2(paymentRequest3ds2);&quot;},{&quot;language&quot;:&quot;go&quot;,&quot;tabTitle&quot;:&quot;Go&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Go API Library v10.4.0\\nimport (\\n  \\&quot;context\\&quot;\\n  \\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v9\\\/src\\\/common\\&quot;\\n  \\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v9\\\/src\\\/adyen\\&quot;\\n  \\&quot;github.com\\\/adyen\\\/adyen-go-api-library\\\/v9\\\/src\\\/payments\\&quot;\\n)\\nclient := adyen.NewClient(&amp;common.Config{\\n  ApiKey:      \\&quot;ADYEN_API_KEY\\&quot;,\\n  Environment: common.TestEnv,\\n})\\n\\n\\\/\\\/ Create the request object(s)\\nthreeDS2Result2 := payments.ThreeDS2Result{\\n  TransStatus: common.PtrString(\\&quot;Y\\&quot;),\\n}\\n\\npaymentRequest3ds2 := payments.PaymentRequest3ds2{\\n  ThreeDS2Result: &amp;threeDS2Result2,\\n  ThreeDS2Token: common.PtrString(\\&quot;BQABAQC2LEWucYNwQRzhH9c1\\\/hup5ZZa9HUehFbwdC86PAfhpGJ\\\/+...\\&quot;),\\n  MerchantAccount: \\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;,\\n}\\n\\n\\\/\\\/ Send the request\\nservice := client.Payments()\\nreq := service.PaymentsApi.Authorise3ds2Input().PaymentRequest3ds2(paymentRequest3ds2)\\nres, httpRes, err := service.PaymentsApi.Authorise3ds2(context.Background(), req)&quot;},{&quot;language&quot;:&quot;py&quot;,&quot;tabTitle&quot;:&quot;Python&quot;,&quot;content&quot;:&quot;# Adyen Python API Library v12.5.1\\nimport Adyen\\n\\nadyen = Adyen.Adyen()\\nadyen.client.xapikey = \\&quot;ADYEN_API_KEY\\&quot;\\nadyen.client.platform = \\&quot;test\\&quot; # The environment to use library in.\\n\\n# Create the request object(s)\\njson_request = {\\n  \\&quot;merchantAccount\\&quot;: \\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;,\\n  \\&quot;threeDS2Result\\&quot;: {\\n    \\&quot;transStatus\\&quot;: \\&quot;Y\\&quot;\\n  },\\n  \\&quot;threeDS2Token\\&quot;: \\&quot;BQABAQC2LEWucYNwQRzhH9c1\\\/hup5ZZa9HUehFbwdC86PAfhpGJ\\\/+...\\&quot;\\n}\\n\\n# Send the request\\nresult = adyen.payment.payments_api.authorise3ds2(request=json_request)&quot;},{&quot;language&quot;:&quot;rb&quot;,&quot;tabTitle&quot;:&quot;Ruby&quot;,&quot;content&quot;:&quot;# Adyen Ruby API Library v9.5.1\\nrequire \\&quot;adyen-ruby-api-library\\&quot;\\n\\nadyen = Adyen::Client.new\\nadyen.api_key = 'ADYEN_API_KEY'\\nadyen.env = :test # Set to \\&quot;live\\&quot; for live environment\\n\\n# Create the request object(s)\\nrequest_body = {\\n  :merchantAccount =&gt; 'YOUR_MERCHANT_ACCOUNT',\\n  :threeDS2Result =&gt; {\\n    :transStatus =&gt; 'Y'\\n  },\\n  :threeDS2Token =&gt; 'BQABAQC2LEWucYNwQRzhH9c1\\\/hup5ZZa9HUehFbwdC86PAfhpGJ\\\/+...'\\n}\\n\\n# Send the request\\nresult = adyen.payment.payments_api.authorise3ds2(request_body)&quot;},{&quot;language&quot;:&quot;ts&quot;,&quot;tabTitle&quot;:&quot;NodeJS (TypeScript)&quot;,&quot;content&quot;:&quot;\\\/\\\/ Adyen Node API Library v17.3.0\\n\\\/\\\/ Require the parts of the module you want to use\\nimport { Client, PaymentAPI, Types } from \\&quot;@adyen\\\/api-library\\&quot;;\\n\\\/\\\/ Initialize the client object\\nconst client = new Client({apiKey: \\&quot;ADYEN_API_KEY\\&quot;, environment: \\&quot;TEST\\&quot;});\\n\\n\\\/\\\/ Create the request object(s)\\nconst threeDS2Result2: Types.payment.ThreeDS2Result = {\\n  transStatus: \\&quot;Y\\&quot;\\n};\\n\\nconst paymentRequest3ds2: Types.payment.PaymentRequest3ds2 = {\\n  threeDS2Result: threeDS2Result2,\\n  threeDS2Token: \\&quot;BQABAQC2LEWucYNwQRzhH9c1\\\/hup5ZZa9HUehFbwdC86PAfhpGJ\\\/+...\\&quot;,\\n  merchantAccount: \\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;\\n};\\n\\n\\\/\\\/ Send the request\\nconst paymentAPI = new PaymentAPI(client);\\nconst response = paymentAPI.authorise3ds2(paymentRequest3ds2);&quot;}]\" :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<p>You'll receive\u00a0<strong>Authorised<\/strong>\u00a0as the\u00a0<code>resultCode<\/code>\u00a0if the payment was successful.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Response'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"additionalData\\\": {\\n        \\\"liabilityShift\\\": \\\"true\\\",\\n        \\\"authCode\\\": \\\"44402\\\",\\n        \\\"avsResult\\\": \\\"4 AVS not supported for this card type\\\",\\n        \\\"threeDOffered\\\": \\\"true\\\",\\n        \\\"refusalReasonRaw\\\": \\\"AUTHORISED\\\",\\n        \\\"authorisationMid\\\": \\\"1000\\\",\\n        \\\"acquirerAccountCode\\\": \\\"TestPmmAcquirerAccount\\\",\\n        \\\"cvcResult\\\": \\\"1 Matches\\\",\\n        \\\"avsResultRaw\\\": \\\"4\\\",\\n        \\\"threeDAuthenticated\\\": \\\"true\\\",\\n        \\\"cvcResultRaw\\\": \\\"M\\\",\\n        \\\"acquirerCode\\\": \\\"TestPmmAcquirer\\\",\\n        \\\"acquirerReference\\\": \\\"7CASOGMCCB4\\\"\\n    },\\n    \\\"pspReference\\\": \\\"8825495331860022\\\",\\n    \\\"resultCode\\\": \\\"Authorised\\\",\\n    \\\"authCode\\\": \\\"44402\\\"\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<\/ol>\n<h2 id=\"handling-android-app-links\">Handling Android App Links<\/h2>\n<ol>\n<li>\n<p>Copy the following code  to your app Manifest file. Replace the value of <code>android:host<\/code> from <code>{yourapp.com}<\/code> with your web domain name. Do not change any other configuration.<\/p>\n<p>Optional: You can specify another value for <code>android:pathPrefix<\/code> that will generate a unique App Link.<\/p>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Copy to your app Manifest file'\" :id=\"''\" :code-data='[{\"language\":\"XML\",\"tabTitle\":\"\",\"content\":\"\\t    &lt;activity\\n       android:name=\\\"com.adyen.threeds2.internal.ui.activity.ChallengeActivity\\\"\\n       android:exported=\\\"true\\\"\\n       tools:node=\\\"merge\\\"&gt;\\n       &lt;intent-filter\\n           android:autoVerify=\\\"true\\\"\\n           tools:targetApi=\\\"m\\\"&gt;\\n           &lt;action android:name=\\\"android.intent.action.VIEW\\\" \\\/&gt;\\n\\n           &lt;category android:name=\\\"android.intent.category.DEFAULT\\\" \\\/&gt;\\n           &lt;category android:name=\\\"android.intent.category.BROWSABLE\\\" \\\/&gt;\\n\\n           &lt;data\\n               android:host=\\\"{yourapp.com}\\\"\\n               android:pathPrefix=\\\"\\\/adyen3ds2\\\"\\n               android:scheme=\\\"https\\\" \\\/&gt;\\n       &lt;\\\/intent-filter&gt;\\n   &lt;\\\/activity&gt;\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<li>\n<p>Verify the App Link following <a href=\"https:\/\/developer.android.com\/training\/app-links\/verify-android-applinks\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Android documentation<\/a><\/p>\n<\/li>\n<\/ol>\n<h2 id=\"close-the-transaction\">Step 4: Close the transaction<\/h2>\n<p>A transaction instance can only be used once. Close every transaction when it is finished and clean up the <code>ThreeDS2Service.INSTANCE<\/code>, whether it was successful or not.<\/p>\n<div class=\"notices red\">\n<p>Do not skip this step. If you do not close a transaction, the following transactions can fail.<\/p>\n<\/div>\n<div data-component-wrapper=\"code-sample\">\n    <code-sample :title=\"'Close the Transaction'\" :id=\"''\" :code-data='[{\"language\":\"java\",\"tabTitle\":\"\",\"content\":\"\\t    mTransaction.close()\\n   ThreeDS2Service.INSTANCE.cleanup(applicationContext)\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<h2 id=\"ui-customizations\">UI customizations<\/h2>\n<h3 id=\"customize-the-sdk-theme\">Customize the SDK theme<\/h3>\n<p>The SDK inherits your app's theme to ensure the UI of the challenge flow fits your app's look and feel. You can override the default SDK theme to inherit from one of AppCompat's theme variants. To do this, add the following XML snippet to your <code>styles.xml<\/code> file.<\/p>\n<pre><code class=\"language-xml\">&lt;style name=\"ThreeDS2Theme\" parent=\"Theme.AppCompat.Light.DarkActionBar\"&gt;\n    &lt;!-- Customize the SDK theme here. --&gt;\n    &lt;item name=\"colorPrimary\"&gt;@color\/colorPrimary&lt;\/item&gt;\n    &lt;item name=\"colorPrimaryDark\"&gt;@color\/colorPrimaryDark&lt;\/item&gt;\n    &lt;item name=\"colorAccent\"&gt;@color\/colorAccent&lt;\/item&gt;\n&lt;\/style&gt;<\/code><\/pre>\n<h3 id=\"using-uicustomization-class\">Customize UI elements<\/h3>\n<p>If you require further UI customizations, the SDK provides some customization options through the\u00a0<code>UiCustomization<\/code>\u00a0class.<\/p>\n<p>To use the\u00a0<code>UiCustomization<\/code>\u00a0class, create an instance of\u00a0<code>UiCustomization<\/code>, configure the <a href=\"#customizable-ui-elements\">UI elements<\/a> that you want to customize, and pass it during initialization of the\u00a0<code>ThreeDS2Service.INSTANCE<\/code>.<\/p>\n<p>For example, to change the toolbar's title text and text color:<\/p>\n<div data-component-wrapper=\"code-sample\">\n    <code-sample :title=\"'Change toolbar text and text color'\" :id=\"''\" :code-data='[{\"language\":\"java\",\"tabTitle\":\"\",\"content\":\"ToolbarCustomization toolbarCustomization = new ToolbarCustomization();\\ntoolbarCustomization.setHeaderText(\\\"Secure Checkout\\\");\\ntoolbarCustomization.setTextColor(\\\"#FFFFFF\\\");\\n\\nUiCustomization uiCustomization = new UiCustomization();\\nuiCustomization.setToolbarCustomization(toolbarCustomization);\\n\\nThreeDS2Service.INSTANCE.initialize(getContext(), configParameters, null, uiCustomization);\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<h4>Customizable UI elements<\/h4>\n<div class=\"sc-notice info\"><div>\n<p>Refer to the <a href=\"https:\/\/adyen.github.io\/adyen-3ds2-android\/com\/adyen\/threeds2\/customization\/UiCustomization.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">UiCustomization<\/a> class reference documentation for a complete list of customizable properties.<\/p>\n<\/div><\/div>\n<p>You can also customize the following UI elements used in the challenge flow:<\/p>\n<table><colgroup><col style=\"width: 44%\"><col style=\"width: 55%\"><\/colgroup><thead><tr class=\"header\"><th>Customizable elements<\/th><th>Customizable properties<\/th><\/tr><\/thead><tbody><tr><td>\n<p>Body<\/p>\n<\/td><td>\n<ul><li>\n<p>Font size<\/p>\n<\/li><\/ul>\n<\/td><\/tr><tr><td>\n<p>Header<\/p>\n<\/td><td>\n<ul><li>\n<p>Text<\/p>\n<\/li><li>\n<p>Font color<\/p>\n<\/li><li>\n<p>Font size<\/p>\n<\/li><\/ul>\n<\/td><\/tr><tr><td>\n<p>Info items<\/p>\n<\/td><td>\n<ul><li>\n<p>Heading and info text<\/p>\n<\/li><li>\n<p>Heading and info font color<\/p>\n<\/li><li>\n<p>Heading and info font size<\/p>\n<\/li><li>\n<p>Expanded state indicator color<\/p>\n<\/li><li>\n<p>Highlighted background color<\/p>\n<\/li><\/ul>\n<\/td><\/tr><tr><td>\n<p>Input fields<\/p>\n<\/td><td>\n<ul><li>\n<p>Font size<\/p>\n<\/li><\/ul>\n<\/td><\/tr><tr><td>\n<p>Input fields header<\/p>\n<\/td><td>\n<ul><li>\n<p>Font size<\/p>\n<\/li><\/ul>\n<\/td><\/tr><tr><td>\n<p>Navigation bar<\/p>\n<\/td><td>\n<ul><li>\n<p>Text<\/p>\n<\/li><li>\n<p>Font color<\/p>\n<\/li><li>\n<p>Font size<\/p>\n<\/li><\/ul>\n<\/td><\/tr><tr><td>\n<p>Screen<\/p>\n<\/td><td>\n<ul><li>\n<p>Status bar background color<\/p>\n<\/li><\/ul>\n<\/td><\/tr><tr><td>\n<p>Continue\/Verify button<\/p>\n<\/td><td>\n<ul><li>\n<p>Font size<\/p>\n<\/li><\/ul>\n<\/td><\/tr><tr><td>\n<p>Cancel button<\/p>\n<\/td><td>\n<ul><li>\n<p>Font size<\/p>\n<\/li><li>\n<p>Highlighted background color<\/p>\n<\/li><\/ul>\n<\/td><\/tr><tr><td>\n<p>Resend button<\/p>\n<\/td><td>\n<ul><li>\n<p>Font size<\/p>\n<\/li><li>\n<p>Highlighted background color<\/p>\n<\/li><\/ul>\n<\/td><\/tr><\/tbody><\/table>\n<h2 id=\"testing-3d-secure-2\">Testing 3D Secure 2<\/h2>\n<p>Before going live, use the following card numbers and credentials to\u00a0test your integration.<\/p>\n<p>We recommend testing each\u00a0<strong>Card Type<\/strong>.<\/p>\n<p>To test how your integration handles different 3D Secure 2 authentication scenarios, use our test card numbers.<\/p>\n<p>All our test cards use the following expiry dates and security codes:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Expiry Date<\/th>\n<th style=\"text-align: left;\">CVC\/CVV<\/th>\n<th style=\"text-align: left;\">CID<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\">03\/2030<\/td>\n<td style=\"text-align: left;\">737<\/td>\n<td style=\"text-align: left;\">7373<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>When prompted for 3D Secure 2 text challenges, use the following credentials:<\/p>\n<ul>\n<li>For mobile, use password: <strong>1234<\/strong><\/li>\n<li>For web, use password: <strong>password<\/strong><\/li>\n<\/ul>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Card Type<\/th>\n<th style=\"text-align: left;\">Card Number<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\">Cartes Bancaires<\/td>\n<td style=\"text-align: left;\">4035 5014 2814 6300<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">Maestro <a href=\"#nocvc\">\n  <sup>1<\/sup>\n<\/a><\/td>\n<td style=\"text-align: left;\">5000 5500 0000 0029<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">Mastercard<\/td>\n<td style=\"text-align: left;\">5454 5454 5454 5454<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">Visa<\/td>\n<td style=\"text-align: left;\">4917 6100 0000 0000<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><a id=\"nocvc\"><\/a> <sup>1<\/sup> This card doesn't require a CVC.<\/p>\n<p>When you make a payment request with these cards, you'll receive the following result codes depending on your integration:<\/p>\n<ul>\n<li><strong>RedirectShopper<\/strong>: You'll receive this result code if you are using the <a href=\"\/pt\/online-payments\/classic-integrations\/classic-api-integration\/3d-secure-authentication\/3d-secure-1\">Redirect authentication<\/a>.<\/li>\n<li><strong>IdentifyShopper<\/strong>:  You'll receive this result code if you are using the <a href=\"\/pt\/online-payments\/classic-integrations\/classic-api-integration\/3d-secure-authentication\/native-3ds2\">Native authentication<\/a>.<\/li>\n<li><strong>ChallengeShopper<\/strong>: You might get this result code after you submit the 3D Secure 2 device fingerprinting result in a Native authentication, indicating a challenge flow.<\/li>\n<\/ul>\n<!-- list separator -->\n<p>To test the web-based flow where the device fingerprinting step is skipped (because the issuer's ACS has not configured a <code>threeDSMethodURL<\/code>), and you get a <strong>ChallengeShopper<\/strong> <code>resultCode<\/code> <em>immediately<\/em> after submitting the payment request, use the following card:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Card Type<\/th>\n<th style=\"text-align: left;\">Card Number<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\">Visa<\/td>\n<td style=\"text-align: left;\">4212 3456 7891 0006<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>To test the frictionless flow, specify in your payment request:<\/p>\n<ul>\n<li><code>amount.value<\/code>: <strong>12002<\/strong><\/li>\n<\/ul>\n<h4 id=\"app-based-integration\">App-based integration<\/h4>\n<p>To test different authentication scenarios for app-based integration, use the following test cards:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Card number<\/th>\n<th style=\"text-align: left;\">Authentication scenario<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\">5201 2855 6567 2311<\/td>\n<td style=\"text-align: left;\">Basic text authentication<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">5201 2874 9905 2008<\/td>\n<td style=\"text-align: left;\">Basic single select<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">5201 2815 9233 1633<\/td>\n<td style=\"text-align: left;\">Basic multi select<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">5201 2888 2269 6974<\/td>\n<td style=\"text-align: left;\">Basic out-of-band (OOB) authentication<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">5201 2895 0084 3268<\/td>\n<td style=\"text-align: left;\">HTML OOB authentication<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">5201 2861 5377 1465<\/td>\n<td style=\"text-align: left;\">App single select then text authentication<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4 id=\"other-scenarios\">Other scenarios<\/h4>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Card number<\/th>\n<th style=\"text-align: left;\">Scenario<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\">4199 3500 0000 0002<\/td>\n<td style=\"text-align: left;\">The card is not enrolled for 3D Secure transactions,<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">5201 2829 9900 5515<\/td>\n<td style=\"text-align: left;\">There was a technical error.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"see-also\">See also<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/Adyen\/adyen-3ds2-android\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Android SDK on GitHub<\/a><\/li>\n<li><a href=\"https:\/\/adyen.github.io\/adyen-3ds2-android\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Javadoc SDK Reference<\/a><\/li>\n<\/ul>","url":"https:\/\/docs.adyen.com\/pt\/online-payments\/classic-integrations\/classic-api-integration\/3d-secure-authentication\/native-3ds2\/android-sdk-integration","articleFields":{"description":"Support 3D Secure 2 authentication on your Android app.","id":"42831227","type":"page","_expandable":{"operations":""},"status":"current","last_edit_on":"14-07-2023 14:37","sitemap":{"priority":0.3},"parameters":{"anchor_new":"<a href=\/online-payments\/3d-secure\/native-3ds2\/android>Native 3D Secure 2 for Android<\/a>","parent_page":"Classic API (<code>\/authorise<\/code>)","new_desc":"integrating using our Checkout APIs"},"feedback_component":true,"filters_component":false},"algolia":{"url":"https:\/\/docs.adyen.com\/pt\/online-payments\/classic-integrations\/classic-api-integration\/3d-secure-authentication\/native-3ds2\/android-sdk-integration","title":"Android 3D Secure 2 SDK","content":"\nAdyen is no longer developing the Classic API integration\nThis page is for the Classic API (\/authorise) integration, which we no longer accept new integrations with. \nWe strongly recommend migrating to the newer Native 3D Secure 2 for Android integration. To use this newer integration, you must also migrate to the Checkout API.\n\n\nPSD2 complianceIf you are implementing 3D Secure to comply with PSD2 SCA, learn more from our comprehensive guide.\n\nThe Adyen 3DS2 Android SDK gets the device fingerprint and presents the challenge to your shopper. From your server, you need to send a payment request, the encrypted device fingerprint, and the challenge result to Adyen.\nIn a full 3D Secure 2 implementation, a payment can go through either a frictionless or a challenge authentication flow before it can be authorised.\nIf you only want to perform a 3D Secure 2 authentication and then authorise the payment later, refer to the Authentication-only documentation.\nHow it works\nHere's how a 3D Secure 2 challenge authentication flow works:\n\n  \n\n\nSubmit a payment request\u00a0with the required 3D Secure 2 objects to start the authentication process.\u00a0Build your implementation depending on the\u00a0resultCode\u00a0returned in the response. If the transaction is exempted from 3D Secure, you might get an Authorised result code.\nIf you receive an IdentifyShopper resultCode, get the 3D Secure 2 device fingerprint and send the encrypted device fingerprint information to Adyen. After you send the device fingerprint, it is possible that you receive an AuthorisedresultCode in the response. This means that the 3D Secure 2 authentication was frictionless, and the payment was authorised.\nIf you receive\u00a0ChallengeShopperresultCode, this means that the issuer requires further shopper interaction and you need to present a challenge to the shopper.\nAfter the 3D Secure 2 flow is complete, whether the transaction is successful or not, close the transaction and clean up the ThreeDS2Service.INSTANCE.\n\nThe payment might also be routed to 3D Secure 1, based on issuer performance. This is indicated by a\u00a0RedirectShopper\u00a0resultCode. If you do not want to automatically fall back to 3D Secure 1, contact our Support Team.\nTo test your integration, see\u00a0Testing 3D Secure 2.\nBefore\u00a0you begin\n\nAdyen 3DS2 AndroidSubscribe to our GitHub repository to get the latest updates and versions.\n\nBefore you begin to integrate, make sure you have followed the Get started with Adyen guide to:\n\nGet an overview of the steps needed to accept live payments.\nCreate your test account.\n\nAfter you have created your test account:\n\n\nGet your API Key. Save a copy, because you'll need it for API calls you make to the Adyen payments platform.\n\n\nInstall one of our\u00a0Libraries\u00a0to connect with the Adyen APIs.\n\n\nInstall the latest SDK version\u00a0either through Maven Central or our GitHub repository. You must use version 2.2.9 or later to trigger the 3D Secure 2 native flow.\n\n\n    \n        \n        \n    \n\n\n\n\nStep 1: Submit a\u00a0payment request\nCollect your shopper's card details then make a payment with a POST \/authorise request, and include the following:\n\n\n\nParameter name\nRequired\nDescription\n\n\n\n\ncard\n\nObject that contains the shopper's card details.\n\n\n threeDS2RequestData.deviceChannel\n\nSet to app.\n\n\nbrowserInfo\n\nObject that contains the userAgent and acceptHeader fields. Indicates that your integration can handle 3D Secure 1 redirect authentication in case the transaction is routed to 3D Secure 1. If your integration is unable to generate this information, you can send the same data as in the request below.\n\n\nsdkVersion\n\nWe recommend you use the ThreeDS2Service.INSTANCE.getSDKVersion() function to determine your 3DS2 sdkVersion. You can also get the sdkVersion from Github\n\n\n\n\nYou can send additional parameters for better authorization rates, and to increase the chance of a frictionless flow. You do not have to send all the additional parameters.  Send parameters that you know you can provide accurately, or that are mandatory in specific scenarios.\n\nHere is an example of how to make a request for a EUR&nbsp;150 purchase:\n\n    \n\n\nYou receive a response containing a resultCode of:\n\n\u00a0IdentifyShopper. This means that you need to perform the\u00a0Identify the shopper\u00a0flow. You also get the following parameters from the response, which you'll need to create a transaction in the SDK:\n\nadditionalData.threeds2.threeDS2DirectoryServerInformation.directoryServerId\nadditionalData.threeds2.threeDS2DirectoryServerInformation.publicKey\nadditionalData.threeds2.threeDS2DirectoryServerInformation.rootCertificates\nadditionalData.threeds2.threeDS2ResponseData.messageVersion\n\n\nWe recommend that you always get these values from the \/authorise response and pass them to the SDK.\n\nFor a complete list of resultCode values and the actions you need to take, see\u00a0Result codes.\n\nHere's an example of a response showing an IdentifyShopper result code:\n\n    \n\nSave additionalData.threeds2.threeDS2Token and include it in every request.\nStep 2: Get the 3D Secure 2 device fingerprint\nIf your server receives an\u00a0IdentifyShopper resultCode, start the 3D Secure 2\u00a0device fingerprinting process.\n\n\nCreate an instance of \n  ConfigParameters\n passing the directoryServerId, the publicKey and the rootCertificates parameters from the  \/authorise response or from your prefetched cached keys.\nConfigParameters configParameters = new AdyenConfigParameters.Builder(\n        {hint:The directoryServerId from the authorise response}directoryServerId{\/hint},\n        {hint:The publicKey from the authorise response}directoryServerPublicKey{\/hint},\n        {hint:The rootCertificates from the authorise response}directoryServerRootCertificates{\/hint} \/\/ null if using prefetched device fingerprinting keys.\n).build();\n\n\nUse \n  ThreeDS2Service.INSTANCE\n to create a transaction.\n\n\nWhen using Adyen 3DS2 Android SDK version 2.2.0 and later, you must pass the value of additionalData.threeds2.threeDS2ResponseData.messageVersion from the \/authorise response into createTransaction.\nFor more information about the latest SDK version, refer to Migrating to 3DS2 SDK version 2.2.0.\n\n\n\nKeep a reference to your\u00a0Transaction\u00a0instance until the transaction is complete.\n\n\n\n\n\n\nUse the \n  AuthenticationRequestParameters\n to get the device fingerprint information.\nAuthenticationRequestParameters authenticationRequestParameters = mTransaction.getAuthenticationRequestParameters();\nYou'll get the following information:\n\ntransaction.authenticationRequestParameters.deviceData\ntransaction.authenticationRequestParameters.SDKTransactionID\ntransaction.authenticationRequestParameters.SDKAppID\ntransaction.authenticationRequestParameters.SDKReferenceNumber\ntransaction.authenticationRequestParameters.SDKEphemeralPublicKey\ntransaction.authenticationRequestParameters.messageVersion\n\n\n\n\nFrom your server, make a POST\u00a0\/authorise3ds2\u00a0request to send the encrypted device fingerprint information to Adyen:\n\nsdkEncData: Device data\nsdkTransID:\u00a0SDK Transaction ID\nsdkAppID: SDK App ID\nsdkReferenceNumber: SDK Reference Number\nsdkEphemPubKey:  The SDK provides output as a string. Transform this string into a JSON object to send in your \/authorise3ds2 request.\nmessageVersion:  3D Secure 2 protocol version\n\nYou can send additional parameters for better authorization rates, and to increase the chance of a frictionless flow. You do not have to send all the additional parameters.  Send parameters that you know you can provide accurately, or that are mandatory in specific scenarios.\n\n\n\n\n\n\nYou receive a response containing a\u00a0resultCode. Some of the possible values for resultCode are:\n\nAuthorised\u00a0\u2013\u00a0Indicates that the\u00a03D Secure 2 authentication was frictionless, and the payment authorisation was successfully completed. This means that you can already proceed with the delivery of goods and services.\nChallengeShopper\u00a0\u2013 The issuer has requested further shopper interaction. This means that you'll have to perform the\u00a0challenge flow. You also get the following parameters from the response, which you'll need to start the challenge flow in the SDK:\n\nthreeds2.threeDS2ResponseData.threeDSServerTransID\nthreeds2.threeDS2ResponseData.acsTransID\nthreeds2.threeDS2ResponseData.acsReferenceNumber\nthreeds2.threeDS2ResponseData.acsSignedContent\nthreeds2.threeDS2Token\n\n\n\nFor a complete list of\u00a0resultCode\u00a0values and the actions that you need to take, see\u00a0Result codes.\n\nHere's an example of a challenge flow response:\n\n\n\n\n\nStep 3: Present a challenge\nIf your server receives a\u00a0ChallengeShopper resultCode, this means that the issuer would like to perform additional checks in order to verify that the shopper is indeed the cardholder.\n\n\nCreate an instance of \n  ChallengeParameters\n and pass the following:\n\n\nThe values from the \/authorise3ds2 response.\n\n\nThreeDSRequestorAppURL: This field is an optional field. If you use Adyen 3DS2 Android SDK version 2.2.12 and later, your ThreeDSRequestorAppURL should be an Android App Link. This is used to call your app after an out-of-band (OOB) authentication. Your app must handle the Android App Link. Supported in 3D Secure version 2.2.0 and later.\n\n\n\n\n\n\n\nPresent the challenge.\n\n\n\n\n\nWhen the challenge flow has been completed, get the\u00a0transactionStatus\u00a0from the\u00a0completionEvent\u00a0and pass this to your server.\n\n\nFrom your server, make a POST\u00a0\/authorise3ds2\u00a0request specifying the\u00a0transStatus\u00a0generated by the SDK and the\u00a0threeds2.threeDS2Token.\n\n\n\nYou'll receive\u00a0Authorised\u00a0as the\u00a0resultCode\u00a0if the payment was successful.\n\n\n\n\n\nHandling Android App Links\n\n\nCopy the following code  to your app Manifest file. Replace the value of android:host from {yourapp.com} with your web domain name. Do not change any other configuration.\nOptional: You can specify another value for android:pathPrefix that will generate a unique App Link.\n\n\n\n\n\nVerify the App Link following Android documentation\n\n\nStep 4: Close the transaction\nA transaction instance can only be used once. Close every transaction when it is finished and clean up the ThreeDS2Service.INSTANCE, whether it was successful or not.\n\nDo not skip this step. If you do not close a transaction, the following transactions can fail.\n\n\n    \n\nUI customizations\nCustomize the SDK theme\nThe SDK inherits your app's theme to ensure the UI of the challenge flow fits your app's look and feel. You can override the default SDK theme to inherit from one of AppCompat's theme variants. To do this, add the following XML snippet to your styles.xml file.\n&lt;style name=\"ThreeDS2Theme\" parent=\"Theme.AppCompat.Light.DarkActionBar\"&gt;\n    &lt;!-- Customize the SDK theme here. --&gt;\n    &lt;item name=\"colorPrimary\"&gt;@color\/colorPrimary&lt;\/item&gt;\n    &lt;item name=\"colorPrimaryDark\"&gt;@color\/colorPrimaryDark&lt;\/item&gt;\n    &lt;item name=\"colorAccent\"&gt;@color\/colorAccent&lt;\/item&gt;\n&lt;\/style&gt;\nCustomize UI elements\nIf you require further UI customizations, the SDK provides some customization options through the\u00a0UiCustomization\u00a0class.\nTo use the\u00a0UiCustomization\u00a0class, create an instance of\u00a0UiCustomization, configure the UI elements that you want to customize, and pass it during initialization of the\u00a0ThreeDS2Service.INSTANCE.\nFor example, to change the toolbar's title text and text color:\n\n    \n\nCustomizable UI elements\n\nRefer to the UiCustomization class reference documentation for a complete list of customizable properties.\n\nYou can also customize the following UI elements used in the challenge flow:\nCustomizable elementsCustomizable properties\nBody\n\n\nFont size\n\n\nHeader\n\n\nText\n\nFont color\n\nFont size\n\n\nInfo items\n\n\nHeading and info text\n\nHeading and info font color\n\nHeading and info font size\n\nExpanded state indicator color\n\nHighlighted background color\n\n\nInput fields\n\n\nFont size\n\n\nInput fields header\n\n\nFont size\n\n\nNavigation bar\n\n\nText\n\nFont color\n\nFont size\n\n\nScreen\n\n\nStatus bar background color\n\n\nContinue\/Verify button\n\n\nFont size\n\n\nCancel button\n\n\nFont size\n\nHighlighted background color\n\n\nResend button\n\n\nFont size\n\nHighlighted background color\n\n\nTesting 3D Secure 2\nBefore going live, use the following card numbers and credentials to\u00a0test your integration.\nWe recommend testing each\u00a0Card Type.\nTo test how your integration handles different 3D Secure 2 authentication scenarios, use our test card numbers.\nAll our test cards use the following expiry dates and security codes:\n\n\n\nExpiry Date\nCVC\/CVV\nCID\n\n\n\n\n03\/2030\n737\n7373\n\n\n\nWhen prompted for 3D Secure 2 text challenges, use the following credentials:\n\nFor mobile, use password: 1234\nFor web, use password: password\n\n\n\n\nCard Type\nCard Number\n\n\n\n\nCartes Bancaires\n4035 5014 2814 6300\n\n\nMaestro \n  1\n\n5000 5500 0000 0029\n\n\nMastercard\n5454 5454 5454 5454\n\n\nVisa\n4917 6100 0000 0000\n\n\n\n 1 This card doesn't require a CVC.\nWhen you make a payment request with these cards, you'll receive the following result codes depending on your integration:\n\nRedirectShopper: You'll receive this result code if you are using the Redirect authentication.\nIdentifyShopper:  You'll receive this result code if you are using the Native authentication.\nChallengeShopper: You might get this result code after you submit the 3D Secure 2 device fingerprinting result in a Native authentication, indicating a challenge flow.\n\n\nTo test the web-based flow where the device fingerprinting step is skipped (because the issuer's ACS has not configured a threeDSMethodURL), and you get a ChallengeShopper resultCode immediately after submitting the payment request, use the following card:\n\n\n\nCard Type\nCard Number\n\n\n\n\nVisa\n4212 3456 7891 0006\n\n\n\nTo test the frictionless flow, specify in your payment request:\n\namount.value: 12002\n\nApp-based integration\nTo test different authentication scenarios for app-based integration, use the following test cards:\n\n\n\nCard number\nAuthentication scenario\n\n\n\n\n5201 2855 6567 2311\nBasic text authentication\n\n\n5201 2874 9905 2008\nBasic single select\n\n\n5201 2815 9233 1633\nBasic multi select\n\n\n5201 2888 2269 6974\nBasic out-of-band (OOB) authentication\n\n\n5201 2895 0084 3268\nHTML OOB authentication\n\n\n5201 2861 5377 1465\nApp single select then text authentication\n\n\n\nOther scenarios\n\n\n\nCard number\nScenario\n\n\n\n\n4199 3500 0000 0002\nThe card is not enrolled for 3D Secure transactions,\n\n\n5201 2829 9900 5515\nThere was a technical error.\n\n\n\nSee also\n\nAndroid SDK on GitHub\nJavadoc SDK Reference\n","type":"page","locale":"pt","boost":14,"hierarchy":{"lvl0":"Home","lvl1":"Online payments","lvl2":"Classic integrations for Ecommerce","lvl3":"Classic API integration","lvl4":"3D Secure authentication","lvl5":"Native 3D Secure 2 authentication","lvl6":"Android 3D Secure 2 SDK"},"hierarchy_url":{"lvl0":"https:\/\/docs.adyen.com\/pt","lvl1":"https:\/\/docs.adyen.com\/pt\/online-payments","lvl2":"https:\/\/docs.adyen.com\/pt\/online-payments\/classic-integrations","lvl3":"https:\/\/docs.adyen.com\/pt\/online-payments\/classic-integrations\/classic-api-integration","lvl4":"https:\/\/docs.adyen.com\/pt\/online-payments\/classic-integrations\/classic-api-integration\/3d-secure-authentication","lvl5":"https:\/\/docs.adyen.com\/pt\/online-payments\/classic-integrations\/classic-api-integration\/3d-secure-authentication\/native-3ds2","lvl6":"\/pt\/online-payments\/classic-integrations\/classic-api-integration\/3d-secure-authentication\/native-3ds2\/android-sdk-integration"},"levels":7,"category":"Online Payments","category_color":"green","tags":["Android","Secure"]},"articleFiles":{"3ds2-android.png":"<img alt=\"\" src=\"https:\/\/docs.adyen.com\/user\/pages\/docs\/02.online-payments\/60.classic-integrations\/01.classic-api-integration\/03.3d-secure-authentication\/09.native-3ds2\/03.android-sdk-integration\/3ds2-android.png\" \/>","705651292.js":"<p alt=\"\">705651292.js<\/p>","send-challenge-result-8739532704.js":"<p alt=\"\">send-challenge-result-8739532704.js<\/p>","send-device-fingerprint-to-adyen-8737872206.js":"<p alt=\"\">send-device-fingerprint-to-adyen-8737872206.js<\/p>"}}
