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.
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ášť.
- Android Studio / Java
- Xcode / Swift
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.
Pro prostředí iOS je 3DS SDK dostupné jako staticky sestavená knihovna ve formátu .xcframework
. Kromě hlavní knihovny ThreeDSSDK je vyžadována i knihovna CryptoSwift, která se používá pro šifrování přenášených dat. Níže uvedené odkazy obsahují potřebné binární soubory ke stažení.
Odkazy ke stažení
TODO: Doplnit Android odkazy.
TODO: Doplnit iOS 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.
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.
Pro správné fungování 3DS SDK je nutné knihovny fyzicky přidat do projektu a nakonfigurovat je v prostředí Xcode tak, aby byly dostupné při sestavování i běhu aplikace.
1. Přidání souborů do projektu
- Umístěte soubor
3ds-sdk-android-1.0.24.0.aar
do složkyapp/lib
vašeho projektu.
- Umístěte soubory
CryptoSwift-1.4.2.xcframework
aThreeDSSDK-1.0.16.xcframework
do vhodné složky ve vašem projektu (napříkladLibraries/ThreeDSSDK
). - V Xcode otevřete Project Navigator (zkratka
⌘+1
). Podrobnosti najdete v oficiální dokumentaci. - Klikněte pravým tlačítkem na cílovou složku projektu a vyberte:
Add Files to "Název Projektu"...
- Vyberte
CryptoSwift-1.4.2.xcframework
aThreeDSSDK-1.0.16.xcframework
a zaškrtněte:- ✅ Copy items if needed
- ✅ Add to targets: [váš hlavní target]
- Potvrďte kliknutím na Add.
2. Přidání knihovny do projektu
- V horním menu klikněte na File a zvolte Project Structure (zkratka
Ctrl+Alt+Shift+S
). - V levém panelu vyberte Dependencies a klikněte na svůj modul (obvykle
app
). - Klikněte na tlačítko
+
a zvolte JAR/AAR Dependency. - Do pole Step 1 zadejte relativní cestu ke knihovně v rámci modulu (např.
libs/3ds-sdk-android-1.0.24.0.aar
). - V poli Step 2 ponechte hodnotu implementation.
- Potvrďte kliknutím na OK
- 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ě.
Pokud se knihovnu nepodaří přidat nebo se vyskytne chyba, postupujte podle oficiální dokumentace pro Android Studio.
Nastavení probíhá v sekci „Frameworks, Libraries, and Embedded Content“.
- Klikněte na název projektu v levém horním rohu Xcode.
- V levém panelu vyberte svůj cílový target.
- V záložce General sjeďte dolů na sekci Frameworks, Libraries, and Embedded Content.
- Pokud
CryptoSwift-1.4.2.xcframework
aThreeDSSDK-1.0.16.xcframework
nejsou v seznamu, klikněte na tlačítko+
, vyhledejte jej a přidejte. - Ujistěte se, že možnost Embed & Sign je vybrána.
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;
Knihovnu je nyní možné v projektu importovat běžným způsobem:
// swift
import ThreeDSSDK
Fáze zpracování
Použití 3DS SDK v aplikaci probíhá ve třech navazujících fázích:
- Inicializace – aplikace inicializuje SDK a vytvoří požadavek na zahájení autentizace.
- 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.
- 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:
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.
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ů.
Před pokračvováním si vyberte programovací jazyk dakumentace. Příklady jsou buď v jazyce Swift nebo Java:
- Android Studio / Java
- Xcode / Swift
⚠️⚠️⚠️⚠️⚠️
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(...)
Parametr | Typ (detail v tooltip) | Popis |
---|---|---|
applicationContext | Context | Kontext Android aplikace |
configParameters | ConfigParameters | Parametry konfigurace SDK |
locale | String? | Kód jazyka pro UI (k hodnotě není přihlíženo) |
uiCustomization | UiCustomization? | 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()
.
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
.
Parametr | Typ (detail v tooltip) | Popis |
---|---|---|
group | String? | Skupina parametrů. Výchozí hodnota je "DEFAULT_GROUP" |
paramName | String | Název parametru |
paramValue | String? | Hodnota parametru |
Příklad použití metody addParam()
// java
ConfigParameters configParameters = new ConfigParameters();
configParameters.addParam("DEFAULT_GROUP", "log-level", "INFO");
// TODO - bude upřesněno
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ů
Font | android:fontFamily | android:textStyle |
---|---|---|
Roboto Thin | sans-serif-thin | brak |
Roboto Light | sans-serif-light | brak |
Roboto Regular | sans-serif | brak |
Roboto Bold | sans-serif | bold |
Roboto Medium | sans-serif-medium | brak |
Roboto Black | sans-serif-black | brak |
Roboto Condensed Light | sans-serif-condensed-light | brak |
Roboto Condensed Regular | sans-serif-condensed | brak |
Roboto Condensed Medium | sans-serif-condensed-medium | brak |
Roboto Condensed Bold | sans-serif-condensed | bold |
Noto Serif | serif | brak |
Noto Serif Bold | serif | bold |
Droid Sans Mono | monospace | brak |
Cutive Mono | serif-monospace | brak |
Coming Soon | casual | brak |
Dancing Script | cursive | brak |
Dancing Script Bold | cursive | bold |
Carrois Gothic SC | sans-serif-smallcaps | brak |
SDK podporuje všechna písma dostupná v dané verzi operačního systému. Je nutné uvést celý název písma – tedy jak font-family
, tak informaci o stylu (např. regular
, bold
nebo italic
).
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í.
Parametr | Typ (detail v tooltip) | Popis |
---|---|---|
Třída UiCustomization | ||
buttons | Map<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ě. |
label | LabelCustomization? | Definice vzhledu textových polí |
textBox | TextBoxCustomization? | Definice vzhledu pole pro zadávání hesla |
toolbar | ToolbarCustomization? | Definice vzhledu záhlaví |
Třída ButtonCustomization | ||
textColor | String? | Barva textu tlačítka (formát: HEX ) |
backgroundColor | String? | Barva pozadí (formát: HEX ) |
textFontSize | Barva textu tlačítka (formát: HEX ) | |
cornerRadius | Poloměr zaoblení | |
Třída LabelCustomization | ||
textColor | String? | Barva textu (formát: HEX ) |
textFontSize | Velikost textu | |
headingTextColor | String? | Barva textu záhlaví (formát: HEX ) |
headingTextFontSize | Velikost písma | |
Třída TextBoxCustomization | ||
textColor | String? | Barva textu (formát: HEX ) |
textFontSize | Velikost písma | |
borderColor | String? | Barva ohraničení (formát: HEX ) |
borderWidth | Tloušťka ohraničení | |
cornerRadius | Poloměr zaoblení | |
Třída ToolbarCustomization | ||
textColor | String? | Barva textu (formát: HEX ) |
textFontSize | Velikost písma | |
backgroundColor | String? | Barva pozadí (formát: HEX ) |
headerText | String? | Text záhlaví |
buttonText | String? | 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);
// swift
var configParameters: ConfigParameters = ConfigParameters()
try configParameters.addParam(nil, "sdkAppID", appInstanceId.uuidString)
try configParameters.addParam(nil, "licence", "super-valid-license")
let threeDS2Service: ThreeDS2Service = ThreeDS2ServiceFactory.createService()
try threeDS2Service.initialize(configParameters, nil, nil)
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
.
Parametr | Typ | Popis |
---|---|---|
directoryServerID | String | Identifikátor Directory Serveru. Pro kartu Visa použijte "A000000003" , pro Mastercard: "A000000004" |
messageVersion | String? | 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");
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
.
// swift
import ThreeDSSDK
// Visa: A000000003
// Mastercard: A000000004
let transaction = try threeDS2Service.createTransaction("A000000004", "2.2.0")
// TODO
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 Apple Pay. Jedná se o klíč 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
:
Parametr | Typ | Popis |
---|---|---|
SDKTransactionID | String | Unikátní identifikátor transakce vygenerovaný SDK. Je jedinečný pro každou transakci a slouží k propojení požadavků a odpovědí. |
DeviceData | String | Šifrovaný řetězec obsahující informace o zařízení uživatele (např. fingerprint zařízení, bezpečnostní metriky). |
SDKEphemeralPublicKey | String | Efemé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. |
SDKAppID | String | Identifikátor mobilní aplikace integrující SDK, poskytovaný dodavatelem řešení. |
SDKReferenceNumber | String | Referenční číslo SDK, jednoznačně identifikující dodavatele SDK (přidělené organizací EMVCo). |
MessageVersion | String | Verze 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();
// swift
import ThreeDSSDK
let authParams = 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.
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:
Parametr | Typ | Popis |
---|---|---|
Datová struktura ARes | ||
transStatus | String | Určuje, zda je vyžadováno dal ší ověření (challenge), nebo ne (frictionless). Možné hodnoty:
|
acsTransactionID | String | Identifikátor transakce na straně ACS |
acsReferenceNumber | String | Referenční číslo ACS |
acsSignedContent | String | Podepsaná data od ACS potřebná k zahájení challenge |
authenticationValue | String | Kryptografická hodnota potvrzující výsledek ověření (v případě frictionless) |
eci | String | Elektronický ukazatel ověření (Electronic Commerce Indicator) |
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()
.
Ú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".
Metoda transaction.doChallenge(...)
musí být volána pouze v případě, že má být provedeno ověření formou challenge (transStatus
je "C"
).
Parametr | Typ | Popis |
---|---|---|
currentActivity | Activity | Aktivita zpracovávající Challenge |
challengeParameters | ChallengeParameters | Podrobnosti challenge (ARes) |
challengeStatusReceiver | ChallengeStatusReceiver | Callback pro informování aplikace o stavu challenge |
timeOut | Integer | 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
Parametr | Typ | Popis |
---|---|---|
acsTransactionID | String | Identifikátor transakce na straně ACS |
acsReferenceNumber | String | Referenční číslo ACS |
acsSignedContent | String | Podepsaný obsah ACS |
Třída ChallengeStatusReceiver
Parametr | Typ | Parametry metody | Popis |
---|---|---|---|
completed() | Function | CompletionEvent | Když 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() | Function | ProtocolErrorEvent | Když SDK obdrží chybu související s protokolem EMV 3‑D Secure. |
runtimeError() | Function | RuntimeErrorEvent | Když 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);
// swift
let challengeParameters = ChallengeParameters()
challengeParameters.setAcsTransactionID(aRes.acsTransactionID)
challengeParameters.setAcsRefNumber(aRes.acsReferenceNumber)
challengeParameters.setAcsSignedContent(aRes.acsSignedContent)
class CSR: ChallengeStatusReceiver {
func completed(_ completionEvent: CompletionEvent) {
print("Challenge completed")
}
func cancelled() {
print("Challenge cancelled")
}
func timedout() {
print("Challengetimedout")
}
func protocolError(_ protocolErrorEvent: ProtocolErrorEvent) {
print("Challenge error with protocolError")
}
func runtimeError(_ runtimeErrorEvent: RuntimeErrorEvent) {
print("Challenge error with runtimeError")
}
}
let challengeStatusReceiver = CSR()
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()
// swift
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.
Parametr | Typ | Popis |
---|---|---|
applicationContext | Context | Kontext Android aplikace |
// java
import android.content.Context;
Context applicationContext = getApplicationContext();
threeDS2Service.cleanup(applicationContext);
// swift
threeDS2Service.cleanup()
Celkový příklad
- Android Studio / Java
- Xcode / Swift
// 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);
// swift
import UIKit
import PassKit
import ThreeDSSDK
var configParameters: ConfigParameters = ConfigParameters()
try configParameters.addParam(nil, "sdkAppID", appInstanceId.uuidString)
try configParameters.addParam(nil, "licence", "super-valid-license")
let threeDS2Service: ThreeDS2Service = ThreeDS2ServiceFactory.createService()
try threeDS2Service.initialize(configParameters, nil, nil)
// Visa: A000000003
// Mastercard: A000000004
let transaction = try threeDS2Service.createTransaction("A000000004", "2.2.0")
let authParams = transaction.getAuthenticationRequestParameters()
// DIY: make init request to Comgate API with aReq
// DIY: make process request to Comgate API to get ARes data
// Note: "aResData" are returned in your payment processing method
let aRes = try JSONDecoder().decode(ApiResponse.self, from: aResData)
let challengeParameters = ChallengeParameters()
challengeParameters.setAcsTransactionID(aRes.acsTransactionID)
challengeParameters.setAcsRefNumber(aRes.acsReferenceNumber)
challengeParameters.setAcsSignedContent(aRes.acsSignedContent)
class CSR: ChallengeStatusReceiver {
func completed(_ completionEvent: CompletionEvent) {
print("Challenge completed")
}
func cancelled() {
print("Challenge cancelled")
}
func timedout() {
print("Challengetimedout")
}
func protocolError(_ protocolErrorEvent: ProtocolErrorEvent) {
print("Challenge error with protocolError")
}
func runtimeError(_ runtimeErrorEvent: RuntimeErrorEvent) {
print("Challenge error with runtimeError")
}
}
let challengeStatusReceiver = CSR()