Přeskočit na hlavní obsah

3D Secure

3D Secure je bezpečnostní protokol určený k ověření identity držitele platební karty při online platbách. Cílem je snížit riziko zneužití karty a zvýšit bezpečnost plateb na internetu. Je základním nástrojem pro splnění požadavků na Strong Customer Authentication (SCA) podle směrnice PSD2.

Jak funguje?

Po zadání údajů o kartě může být držitel přesměrován do rozhraní své banky, kde proběhne ověření totožnosti jedním z následujících způsobů:

  • jednorázovým SMS kódem,
  • biometricky (např. otisk prstu nebo rozpoznání obličeje),
  • potvrzením v mobilní aplikaci banky.

Proces autentizace probíhá v reálném čase a klade důraz na zachování vysoké úrovně zabezpečení při co nejmenším zásahu do uživatelského komfortu.

Proč implementovat?

Implementace 3D Secure je nezbytná pro splnění požadavků směrnice PSD2 na silné ověření zákazníka (SCA). Bez jejího zavedení může být platba bankou zákazníka zamítnuta.

  • Ochrana proti podvodům – významně snižuje pravděpodobnost neoprávněného použití platební karty.
  • Přenesení odpovědnosti – u autentizovaných transakcí bývá odpovědnost za případné zneužití obvykle přenesena z obchodníka na banku držitele karty.
  • Soulad s legislativou – ve většině evropských zemí je použití 3D Secure povinné.
  • Zvýšení důvěry zákazníků – přítomnost bezpečnostních prvků zvyšuje důvěryhodnost platebního procesu.
Informace

V závislosti na nastavení banky držitele může být uživatel vyzván k interakci, nebo může autentizace proběhnout automaticky bez jeho účasti („frictionless“).

3DS SDK

Pro integraci 3D Secure ve vaší mobilní aplikaci je nutné použít knihovnu 3DS SDK, která zajišťuje bezpečné provedení autentizace podle specifikace EMV® 3-D Secure 2. Knihovna zprostředkovává komunikaci mezi aplikací, 3DS serverem a Access Control Serverem (ACS) a umožňuje provádět ověření zákazníka přímo v aplikaci, bez nutnosti přesměrování do externího prohlížeče.

Implementace se liší podle platformy, na které je mobilní aplikace vyvíjena. Knihovna 3DS SDK je aktuálně dostupná ve variantách pro iOS (Swift) a Android (Java). Následující části popisují postup integrace pro každé prostředí zvlášť.

Přidání SDK do projektu

    Pro prostředí Android je 3DS SDK dostupné jako archiv ve formátu .aar. Narozdíl od iOS není pro Android potřeba přidávat žádnou další knihovnu.

    Odkazy ke stažení

      Upozornění

      TODO: Doplnit Android odkazy.

      Přidání knihovny do projektu

        Pro správné fungování 3DS SDK je nutné knihovnu fyzicky přidat do projektu a nakonfigurovat je v projektu tak, aby byly dostupné při sestavování i běhu aplikace.

        Tip

        V následujících ukázkách předpokládáme, že výchozím modulem pro zpracování plateb je app. Používáte-li jiný modul, upravte cesty podle potřeby.

        1. Přidání souborů do projektu
          1. Umístěte soubor 3ds-sdk-android-1.0.24.0.aar do složky app/lib vašeho projektu.
          2. Přidání knihovny do projektu
            1. V horním menu klikněte na File a zvolte Project Structure (zkratka Ctrl+Alt+Shift+S).
            2. V levém panelu vyberte Dependencies a klikněte na svůj modul (obvykle app).
            3. Klikněte na tlačítko + a zvolte JAR/AAR Dependency.
            4. Do pole Step 1 zadejte relativní cestu ke knihovně v rámci modulu (např. libs/3ds-sdk-android-1.0.24.0.aar).
            5. V poli Step 2 ponechte hodnotu implementation.
            6. Potvrďte kliknutím na OK
            7. V dialogu Project Structure klikněte na OK nebo Apply.

            Po úspěšném připojení knihovny by se měl v levém panelu Project v části External Libraries zobrazit záznam o knihovně.

            Poznámka

            Pokud se knihovnu nepodaří přidat nebo se vyskytne chyba, postupujte podle oficiální dokumentace pro Android Studio.

            3. Import a použití knihovny

              Knihovnu je nyní možné v projektu importovat běžným způsobem:

              // java
              import com.visiona.threedsecure.sdk.android.ThreeDS2ServiceImpl;

              Fáze zpracování

              Použití 3DS SDK v aplikaci probíhá ve třech navazujících fázích:

              1. Inicializace – aplikace inicializuje SDK a vytvoří požadavek na zahájení autentizace.
              2. Založení transakce – prostřednictvím API Comgate se vytvoří nová transakce na základě iniciačních parametrů a vrátí se konfigurační data od ACS.
              3. Autentizace – aplikace předá získané parametry zpět SDK, které automaticky provede autentizaci držitele karty podle specifikace 3D Secure.

              Podrobný návod každého kroku včetně konkrétních implementačních příkladů naleznete v sekci Zpracování platby, kde jsou jednotlivé kroky chronologicky seřazeny dle průběhu integrace.

              Sekvenční diagram

              Níže uvedený sekvenční diagram znázorňuje základní tok při použití 3DS SDK v mobilní aplikaci:

              Upozornění

              Diagram má pouze ilustrativní charakter a znázorňuje použití 3DS SDK – jeho podoba se nemusí plně shodovat se skutečnou strukturou 3DS SDK API. Podrobnosti k implementaci budou uvedeny v sekci Zpracování platby.

              Průběh použití 3DS SDK

              Popis rozhraní 3DS SDK

              Rozhraní 3DS SDK definuje sadu metod, které jsou potřebné k provedení autentizace držitele karty v souladu se specifikací EMV® 3-D Secure 2. V následujících částech je uvedena podrobná dokumentace všech klíčových metod a parametrů.

              Tip

              Před pokračvováním si vyberte programovací jazyk dakumentace. Příklady jsou buď v jazyce Swift nebo Java:

              Upozornění

              ⚠️⚠️⚠️⚠️⚠️
              Code samples uvedené níže jsou zatím dostupné pouze ve verzi pro Android.
              Swift bude přidán po poskytnutí detailů od partnera.
              ⚠️⚠️⚠️⚠️⚠️

              Metoda initialize(...)

              Před zahájením transakce je nutné inicializovat knihovnu. Tato fáze zahrnuje předání konfiguračních parametrů knihovny, identifikátorů Directory Serverů, certifikátů CA, klíčů potřebných k šifrování údajů o zařízení (DeviceData) a informací o vzhledu obrazovky s ověřením.

              K inicializaci knihovny je třeba použít metodu initialize(...) z implementace třídy ThreeDS2Service a předat jí příslušné parametry.

              Parametry initialize(...)

              ParametrTyp (detail v tooltip)Popis
              applicationContextContextKontext Android aplikace
              configParametersConfigParametersParametry konfigurace SDK
              localeString?Kód jazyka pro UI (k hodnotě není přihlíženo)
              uiCustomizationUiCustomization?Třída obsahující údaje o vzhledu obrazovky pro ověření

              Třída Context

              Context představuje systémovou entitu dostupnou za běhu aplikace, která poskytuje informace o aktuálním stavu aplikace a jejím prostředí.

              Třída ConfigParameters

              Pro správnou inicializaci je nutné vytvořit objekt třídy ConfigParameters a předat mu parametry pomocí metody addParam().

              Tip

              Pro zobrazení diagnostických informací o činnosti 3DS SDK je možné nastavit parametr s názvem log-level s hodnotami "NONE", "WARN", "INFO" nebo "DEBUG", které určují rozsah vypisovaných údajů.

              Metoda addParam()

              Metoda addParam() slouží k přidání parametrů do objektu ConfigParameters.

              ParametrTyp (detail v tooltip)Popis
              groupString?Skupina parametrů. Výchozí hodnota je "DEFAULT_GROUP"
              paramNameStringNázev parametru
              paramValueString?Hodnota parametru
              Příklad použití metody addParam()
                // java
                ConfigParameters configParameters = new ConfigParameters();
                configParameters.addParam("DEFAULT_GROUP", "log-level", "INFO");

                Parametr locale

                Metoda initialize(...) přijímá volitelný parametr locale, avšak jazyk uživatelského rozhraní bude vždy nastaven podle aktuálního jazyka operačního systému zařízení uživatele. Pokud je to nutné, je hodnotu je vhondé nastavit na null.

                Třída UiCustomization

                Knihovna umožňuje omezenou konfiguraci vzhledu ověřovací obrazovky. Lze upravit mimo jiné: barvu a text tlačítek, barvu záhlaví, jeho text a velikost.

                Pro přizpůsobení vzhledu ověřovací obrazovky je třeba vytvořit objekt UiCustomization a nakonfigurovat jej podle vlastních požadavků.

                Změna fontů

                  SDK podporuje nativní fonty zabudované v Android SDK. Pro správné fungování je nutné uvést název fontu podle prostředního sloupce v dokumentaci.

                  Seznam fontů
                  Fontandroid:fontFamilyandroid:textStyle
                  Roboto Thinsans-serif-thinbrak
                  Roboto Lightsans-serif-lightbrak
                  Roboto Regularsans-serifbrak
                  Roboto Boldsans-serifbold
                  Roboto Mediumsans-serif-mediumbrak
                  Roboto Blacksans-serif-blackbrak
                  Roboto Condensed Lightsans-serif-condensed-lightbrak
                  Roboto Condensed Regularsans-serif-condensedbrak
                  Roboto Condensed Mediumsans-serif-condensed-mediumbrak
                  Roboto Condensed Boldsans-serif-condensedbold
                  Noto Serifserifbrak
                  Noto Serif Boldserifbold
                  Droid Sans Monomonospacebrak
                  Cutive Monoserif-monospacebrak
                  Coming Sooncasualbrak
                  Dancing Scriptcursivebrak
                  Dancing Script Boldcursivebold
                  Carrois Gothic SCsans-serif-smallcapsbrak
                  Změna vzhledu ověřovací obrazovky

                  Vzhled ověřovací obrazovky je definován záhlavím, tlačítky, textovými poli a poli pro zadávání hesla. Každý z těchto prvků má sadu konkrétních vlastností.

                  ParametrTyp (detail v tooltip)Popis
                  Třída UiCustomization
                  buttonsMap<String, ButtonCustomization>?Definice vzhledu tlačítek. Klíč v mapě může nabývat hodnot: "SUBMIT", "CONTINUE", "NEXT", "CANCEL", "RESEND".
                  Klíč označuje konkrétní tlačítko a jeho vzled je definován v hodnotě.
                  labelLabelCustomization?Definice vzhledu textových polí
                  textBoxTextBoxCustomization?Definice vzhledu pole pro zadávání hesla
                  toolbarToolbarCustomization?Definice vzhledu záhlaví
                  Třída ButtonCustomization
                  textColorString?Barva textu tlačítka (formát: HEX)
                  backgroundColorString?Barva pozadí (formát: HEX)
                  textFontSizeBarva textu tlačítka (formát: HEX)
                  cornerRadiusPoloměr zaoblení
                  Třída LabelCustomization
                  textColorString?Barva textu (formát: HEX)
                  textFontSizeVelikost textu
                  headingTextColorString?Barva textu záhlaví (formát: HEX)
                  headingTextFontSizeVelikost písma
                  Třída TextBoxCustomization
                  textColorString?Barva textu (formát: HEX)
                  textFontSizeVelikost písma
                  borderColorString?Barva ohraničení (formát: HEX)
                  borderWidthTloušťka ohraničení
                  cornerRadiusPoloměr zaoblení
                  Třída ToolbarCustomization
                  textColorString?Barva textu (formát: HEX)
                  textFontSizeVelikost písma
                  backgroundColorString?Barva pozadí (formát: HEX)
                  headerTextString?Text záhlaví
                  buttonTextString?Text tlačítka „Zrušit“

                  Příklad implementace initialize(...)

                    // java
                    import android.content.Context;
                    import com.visiona.threedsecure.sdk.android.ThreeDS2ServiceImpl;
                    import com.visiona.threedsecure.sdk.android.emvco.ConfigParameters;
                    import com.visiona.threedsecure.sdk.android.emvco.customization.ButtonCustomization;
                    import com.visiona.threedsecure.sdk.android.emvco.customization.TextBoxCustomization;
                    import com.visiona.threedsecure.sdk.android.emvco.customization.ToolbarCustomization;
                    import com.visiona.threedsecure.sdk.android.emvco.customization.UiCustomization;
                    import com.visiona.threedsecure.sdk.android.emvco.customization.LabelCustomization;

                    Context applicationContext = getApplicationContext();

                    ConfigParameters configParameters = new ConfigParameters();
                    configParameters.addParam("DEFAULT_GROUP", "log-level", "INFO");

                    UiCustomization uiCustomization = new UiCustomization();

                    ButtonCustomization buttonCustomization = new ButtonCustomization();
                    buttonCustomization.setTextColor("#000000");
                    buttonCustomization.setCornerRadius(5);
                    buttonCustomization.setBackgroundColor("#ffffff");
                    buttonCustomization.setTextFontSize(15);
                    LabelCustomization labelCustomization = new LabelCustomization();
                    labelCustomization.setTextFontSize(15);
                    labelCustomization.setTextColor("#000000");
                    labelCustomization.setHeadingTextColor("#ffffff");
                    labelCustomization.setHeadingTextFontSize(20);
                    TextBoxCustomization textBoxCustomization = new TextBoxCustomization();
                    textBoxCustomization.setTextColor("#000000");
                    textBoxCustomization.setCornerRadius(5);
                    textBoxCustomization.setTextFontSize(15);
                    textBoxCustomization.setBorderColor("#000000");
                    textBoxCustomization.setBorderWidth(2);
                    ToolbarCustomization toolbarCustomization = new ToolbarCustomization();
                    toolbarCustomization.setTextColor("#000000");
                    toolbarCustomization.setBackgroundColor("#ffffff");
                    toolbarCustomization.setTextFontSize(15);
                    toolbarCustomization.setButtonText("Zrušit...");
                    toolbarCustomization.setHeaderText("Záhlaví");

                    // možnosti tlačítek: "SUBMIT", "CONTINUE", "NEXT", "CANCEL", "RESEND"
                    uiCustomization.setButtonCustomization(buttonCustomization, "CONTINUE");
                    uiCustomization.setLabelCustomization(labelCustomization);
                    uiCustomization.setTextBoxCustomization(textBoxCustomization);
                    uiCustomization.setToolbarCustomization(toolbarCustomization);

                    ThreeDS2Service threeDS2Service = new ThreeDS2ServiceImpl();
                    threeDS2Service.initialize(applicationContext, configParameters, null, uiCustomization);

                    Metoda createTransaction(...)

                    Pro zahájení platebního procesu je třeba vytvořit objekt Transaction, který reprezentuje konkrétní transakci. Transakce se vytváří pomocí volání metody threeDS2Service.createTransaction(...) na dříve vytvořeném objektu ThreeDS2Service.

                    ParametrTypPopis
                    directoryServerIDStringIdentifikátor Directory Serveru. Pro kartu Visa použijte "A000000003", pro Mastercard: "A000000004"
                    messageVersionString?Verze protokolu 3DS. Vždy použijte "2.2.0"
                    Příklad implementace createTransaction(...)
                      // java
                      import com.visiona.threedsecure.sdk.android.emvco.Transaction;

                      // Visa: A000000003
                      // Mastercard: A000000004
                      Transaction transaction = threeDS2Service.createTransaction("A000000003", "2.2.0");
                      Tip

                      Typ karty použitý plátcem lze zjistit při vytváření objektu paymentDetails na základě informací získaných společně s platebním tokenem, které byly vygenerovány službou Google Pay. Konkrétně se jedná o hodnotu klíče network.

                      Metoda getAuthenticationRequestParameters()


                      Po vytvoření objektu Transaction v SDK je dalším krokem získání parametrů potřebných k inicializaci procesu ověření v systému 3D Secure. Je třeba zavolat metodu transaction.getAuthenticationRequestParameters() na dříve vytvořeném objektu transakce.

                      Tato metoda nevyžaduje žádné dodatečné argumenty a jejím výsledkem je objekt AuthenticationRequestParameters:

                      ParametrTypPopis
                      SDKTransactionIDStringUnikátní identifikátor transakce vygenerovaný SDK. Je jedinečný pro každou transakci a slouží k propojení požadavků a odpovědí.
                      DeviceDataStringŠifrovaný řetězec obsahující informace o zařízení uživatele (např. fingerprint zařízení, bezpečnostní metriky).
                      SDKEphemeralPublicKeyStringEfemérní veřejný klíč SDK (ve formátu JSON Web Key), používaný 3DS serverem a ACS k navázání zabezpečené komunikace se SDK v dalších krocích.
                      SDKAppIDStringIdentifikátor mobilní aplikace integrující SDK, poskytovaný dodavatelem řešení.
                      SDKReferenceNumberStringReferenční číslo SDK, jednoznačně identifikující dodavatele SDK (přidělené organizací EMVCo).
                      MessageVersionStringVerze protokolu 3‑D Secure, kterou SDK využívá. Umožňuje serveru určit, zda je verze protokolu na straně serveru a klienta vzájemně kompatibilní.
                      Příklad implementace getAuthenticationRequestParameters()
                        // java
                        import com.visiona.threedsecure.sdk.android.emvco.AuthenticationRequestParameters;
                        AuthenticationRequestParameters aReq = transaction.getAuthenticationRequestParameters();

                        Předání parametrů na Comgate API

                        Následuje předání získaných parametrů na Comgate API, které je zpracuje a vrátí odpověď od ACS. Tato odpověď, obsahuje také data označovaná jako ARes, které nesou doplňující informace potřebné pro rozhodnutí, zda bude autentizační proces pokračovat bez interakce plátce (tzv. frictionless), nebo bude vyžadována jeho účast při autentizaci.

                        Data ARes slouží jako vstup pro metodu doChallenge(), která sama provede autentizaci v případě, že nelze použít režim frictionless.

                        Tip

                        Detailní popis API a konkrétní způsob použití je uveden v sekci Zpracování platby.

                        Údaje obdržené v odpovědi typu ARes ze strany Directory Serveru:

                        ParametrTypPopis
                        Datová struktura ARes
                        transStatusStringUrčuje, zda je vyžadováno další ověření (challenge), nebo ne (frictionless). Možné hodnoty:
                        • "Y" - ověřeno (platba pokračuje "frictionless", 3DS SDK již není potřeba)
                        • "C" - vyžadováno ověření (nutné použít doChallenge())
                        • "N" - neověřeno (transakce zamítnuta a proces končí)
                        acsTransactionIDStringIdentifikátor transakce na straně ACS
                        acsReferenceNumberStringReferenční číslo ACS
                        acsSignedContentStringPodepsaná data od ACS potřebná k zahájení challenge
                        authenticationValueStringKryptografická hodnota potvrzující výsledek ověření (v případě frictionless)
                        eciStringElektronický ukazatel ověření (Electronic Commerce Indicator)
                        Nebezpečí

                        TODO - example a konexe na API

                        Pokud typu ARes označuje nutnost provedení dodatečného ověření (transStatus je "C"), je třeba využít obdržená data (acsTransactionID, acsReferenceNumber, acsSignedContent) k vytvoření objektu ChallengeParameters a poté zahájit challenge pomocí metody doChallenge().

                        Informace

                        Úloha 3DS SDK končí, pokud zpráva typu ARes vrátí jiný stav transakce (transStatus) než "C", např. "Y" nebo "N". V takovém případě by měla dané stavy zpracovat aplikace.

                        Metoda doChallenge(...)

                        Metoda transaction.doChallenge(...) je zodpovědná za zahájení procesu autentizace s účastí plátce tzv. "challenge".

                        Upozornění

                        Metoda transaction.doChallenge(...) musí být volána pouze v případě, že má být provedeno ověření formou challenge (transStatus je "C").

                        ParametrTypPopis
                        currentActivityActivityAktivita zpracovávající Challenge
                        challengeParametersChallengeParametersPodrobnosti challenge (ARes)
                        challengeStatusReceiverChallengeStatusReceiverCallback pro informování aplikace o stavu challenge
                        timeOutInteger

                        Interval časového limitu (minuty)

                        Tip

                        Interval během kterého musí být challenge dokončen. Organizace EMVCo doporučuje, aby časový interval nebyl kratší než 5 minut.

                        Třída Activity

                        Třída Activity představuje systémovou komponentu definující uživatelské rozhraní. Jako parametr se očekává odkaz na aktivitu, která zajistí zpracování autentizační výzvy (challenge).

                        Třída ChallengeParameters

                        ParametrTypPopis
                        acsTransactionIDStringIdentifikátor transakce na straně ACS
                        acsReferenceNumberStringReferenční číslo ACS
                        acsSignedContentStringPodepsaný obsah ACS

                        Třída ChallengeStatusReceiver

                        ParametrTypParametry metodyPopis
                        completed()FunctionCompletionEventKdyž byl proces ověření dokončen.
                        cancelled()FunctionžádnéKdyž držitel karty zvolí možnost zrušení transakce na ověřovací obrazovce.
                        timedout()FunctionžádnéKdyž proces ověření dosáhne nebo překročí časový limit nastavený při volání metody doChallenge.
                        protocolError()FunctionProtocolErrorEventKdyž SDK obdrží chybu související s protokolem EMV 3‑D Secure.
                        runtimeError()FunctionRuntimeErrorEventKdyž SDK narazí na libovolnou chybu během procesu ověření. Chybu jinou než tu, kterou zpracovává metoda protocolError().
                        Příklad implementace onChallenge(...)
                          // java
                          import com.visiona.threedsecure.sdk.android.ChallengeStatusReceiver;
                          import com.visiona.threedsecure.sdk.android.emvco.event.CompletionEvent;
                          import com.visiona.threedsecure.sdk.android.emvco.event.ProtocolErrorEvent;
                          import com.visiona.threedsecure.sdk.android.emvco.event.RuntimeErrorEvent;
                          import com.visiona.threedsecure.sdk.android.emvco.ChallengeParameters;

                          // ChallengeParameters
                          ChallengeParameters challengeParameters = new ChallengeParameters();
                          challengeParameters.setAcsTransactionID(aRes.acsTransactionID);
                          challengeParameters.setAcsRefNumber(aRes.acsReferenceNumber);
                          challengeParameters.setAcsSignedContent(aRes.acsSignedContent);

                          // ChallengeStatusReceiver
                          ChallengeStatusReceiver challengeStatusReceiver = new ChallengeStatusReceiver() {
                          @Override
                          public void completed(CompletionEvent sdkCompletionEvent) {
                          Log.d("3DS-SDK", "Challenge completed");
                          }

                          @Override
                          public void cancelled() {
                          Log.d("3DS-SDK", "Challenge cancelled");
                          }

                          @Override
                          public void timedout() {
                          Log.d("3DS-SDK", "Challenge timedout");
                          }

                          @Override
                          public void protocolError(ProtocolErrorEvent protocolErrorEvent) {
                          Log.d("3DS-SDK", "Challenge error with protocolError");
                          }

                          @Override
                          public void runtimeError(RuntimeErrorEvent runtimeErrorEvent) {
                          Log.d("3DS-SDK", "Challenge error with runtimeError");
                          }
                          };

                          transaction.doChallenge(activity, challengeParameters, challengeStatusReceiver, 5);

                          Metoda close()

                          Správná implementace SDK vyžaduje uvolnění prostředků.

                          Volání této metody by mělo proběhnout po každém transakčním procesu, který vyžadoval ověření pomocí metody doChallenge().

                            // java
                            transaction.close()

                            Metoda cleanup(...)

                            Správná implementace SDK vyžaduje uvolnění prostředků.

                            Volání této metody by mělo proběhnout pouze jednou v průběhu všech pokusů o placení v rámci jedné relace aplikace, nikoliv po každé transakci. Například po úplném ukončení aplikace, zavření aktivity nebo přechodu aplikace do režimu spánku.

                            ParametrTypPopis
                            applicationContextContextKontext Android aplikace
                              // java
                              import android.content.Context;

                              Context applicationContext = getApplicationContext();
                              threeDS2Service.cleanup(applicationContext);

                              Celkový příklad

                              // java
                              import android.content.Context;
                              import org.json.JSONObject;
                              import android.util.Log;

                              import com.visiona.threedsecure.sdk.android.emvco.ConfigParameters;
                              import com.visiona.threedsecure.sdk.android.ThreeDS2ServiceImpl;
                              import com.visiona.threedsecure.sdk.android.emvco.ThreeDS2Service;
                              import com.visiona.threedsecure.sdk.android.emvco.Transaction;
                              import com.visiona.threedsecure.sdk.android.emvco.AuthenticationRequestParameters;
                              import com.visiona.threedsecure.sdk.android.emvco.ChallengeParameters;
                              import com.visiona.threedsecure.sdk.android.ChallengeStatusReceiver;
                              import com.visiona.threedsecure.sdk.android.emvco.event.CompletionEvent;
                              import com.visiona.threedsecure.sdk.android.emvco.event.ProtocolErrorEvent;
                              import com.visiona.threedsecure.sdk.android.emvco.event.RuntimeErrorEvent;

                              Context applicationContext = getApplicationContext();

                              ConfigParameters configParameters = new ConfigParameters();
                              configParameters.addParam("DEFAULT_GROUP", "log-level", "INFO");

                              ThreeDS2Service threeDS2Service = new ThreeDS2ServiceImpl();
                              threeDS2Service.initialize(applicationContext, configParameters, null, null);

                              // Visa: A000000003
                              // Mastercard: A000000004
                              Transaction transaction = threeDS2Service.createTransaction("A000000003", "2.2.0");
                              AuthenticationRequestParameters aReq = transaction.getAuthenticationRequestParameters();

                              // DIY: make init request to Comgate API with aReq
                              // DIY: make process request to Comgate API to get ARes data

                              JSONObject processResponse = new JSONObject("{ ... response data ... }");
                              JSONObject aRes = processResponse.getJSONObject("ares");

                              ChallengeParameters challengeParameters = new ChallengeParameters();
                              challengeParameters.setAcsTransactionID(aRes.getString("acsTransactionID"));
                              challengeParameters.setAcsRefNumber(aRes.getString("acsReferenceNumber"));
                              challengeParameters.setAcsSignedContent(aRes.getString("acsSignedContent"));

                              ChallengeStatusReceiver challengeStatusReceiver = new ChallengeStatusReceiver() {
                              @Override
                              public void completed(CompletionEvent sdkCompletionEvent) {
                              Log.d("3DS-SDK", "Challenge completed");
                              transaction.close();
                              }

                              @Override
                              public void cancelled() {
                              Log.d("3DS-SDK", "Challenge cancelled");
                              transaction.close();
                              }

                              @Override
                              public void timedout() {
                              Log.d("3DS-SDK", "Challenge timedout");
                              transaction.close();
                              }

                              @Override
                              public void protocolError(ProtocolErrorEvent protocolErrorEvent) {
                              Log.d("3DS-SDK", "Challenge error with protocolError");
                              transaction.close();
                              }

                              @Override
                              public void runtimeError(RuntimeErrorEvent runtimeErrorEvent) {
                              Log.d("3DS-SDK", "Challenge error with runtimeError");
                              transaction.close();
                              }
                              };

                              // při ukončení aplikace, aktivity, případně přechodu aplikace do režimu spánku
                              threeDS2Service.cleanup(applicationContext);