Přeskočit na hlavní obsah

Instalace a inicializace

Ke stažení

Knihovna je distribuována jako AAR artefakt společně s POM souborem závislostí. Stáhněte si verzi, kterou chcete integrovat:

VerzeAARPOM
1.0.0comgateSdk-1.0.0.aarcomgateSdk-1.0.0.pom

Přidání knihovny do projektu

Doporučený postup integrace:

  1. Umístěte stažený AAR soubor do projektu (typicky do složky app/libs).
  2. Přidejte AAR jako závislost aplikace.
  3. Zajistěte dostupnost závislostí uvedených v POM souboru.

Příklad základního přidání AAR v build.gradle.kts:

dependencies {
implementation(files("libs/comgateSdk-1.0.0.aar"))
}
Informace

POM soubor ke stažení obsahuje deklarované závislosti knihovny. Při integraci vždy vycházejte z dvojice AAR + POM stejné verze.

Upozornění

Knihovna vyžaduje compileSdk 34minSdk 28. Ověřte, že konfigurace vaší aplikace splňuje tyto požadavky.

Konfigurace AndroidManifest.xml

Knihovna ve svém manifestu automaticky deklaruje potřebná oprávnění a komponenty. Ujistěte se, že vaše aplikace má povolení pro přístup k internetu:

<uses-permission android:name="android.permission.INTERNET" />

Pro využití Google Pay je v manifestu knihovny automaticky registrován meta-data záznam:

<meta-data
android:name="com.google.android.gms.wallet.api.enabled"
android:value="true" />

Vytvoření session

Třída ComgateSecureSession je hlavním vstupním bodem pro práci s knihovnou. Session zajišťuje:

  • interní bezpečnostní inicializaci,
  • inicializaci 3D Secure,
  • zpracování karetních plateb a Google Pay plateb.

Parametry konstruktoru

ParametrTypPovinnýPopis
checkoutIdStringIdentifikátor Checkout SDK propojení. Získáte v klientském portálu Comgate.
contextContextAndroid kontext aplikace (typicky applicationContext).
threeDSConfigThreeDSConfigKonfigurace 3D Secure (UI, timeout, verze protokolu). Podrobnosti v sekci Karetní data - 3D Secure.
lifecycleOwnerLifecycleOwnerVlastník životního cyklu (např. Activity/Fragment). Session se zaregistruje jako observer a při onDestroy() automaticky uvolní zdroje.
devModeBooleanZapíná vývojový/testovací režim (např. dev SSL). Ovlivňuje také prostředí Google Pay — true přepne na testovací prostředí (TEST), false na produkční (PRODUCTION). Výchozí false.
googleMerchantIdString?Google Pay Merchant ID. Povinný pro Google Pay v produkci.
googleMerchantNameString?Název obchodníka zobrazený v Google Pay platebním dialogu.
translationTranslationPřeklady textů komponent. Výchozí Translation.English.
langString?Kód jazyka (BCP 47 / ISO 639-1) odesílaný s platebním požadavkem (např. "cs", "en"). Pokud není zadán, použije se jazyk zařízení (je-li podporován). Dostupné kódy viz ComgateSecureSession.supportedLanguageCodes.
onInitialized((Result<Unit>) -> Unit)?Volitelný callback pro automatickou inicializaci session z konstruktoru.
Informace

Síťová infrastruktura a komunikace jsou interně řízené knihovnou. Při standardní integraci není potřeba nic měnit.

Inicializace

Doporučený způsob inicializace je předat callback onInitialized přímo do konstruktoru ComgateSecureSession.

Android context se předává přímo do konstruktoru, kde je interně uložen (application context). Samostatné volání initializeContext(...) již není potřeba.

class MainActivity : AppCompatActivity() {

private lateinit var session: ComgateSecureSession

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

session = ComgateSecureSession(
checkoutId = "váš-checkout-id",
context = applicationContext,
threeDSConfig = ThreeDSConfig(), // výchozí 3DS konfigurace
lifecycleOwner = this,
onInitialized = { result ->
result.onSuccess {
// Session je připravena - lze zpracovávat platby
}.onFailure { e ->
// Chyba inicializace
Log.e("Payment", "Init failed: ${e.message}")
}
}
)

setContent {
MaterialTheme {
Surface(modifier = Modifier.fillMaxSize()) {
// Váš platební formulář — viz sekce Karetní data
}
}
}
}

}
Informace

Callback onInitialized (i callback metody initialize) je volán na hlavním vlákně (main thread). Můžete v něm přímo aktualizovat UI.

Ruční inicializace (alternativa)

Pokud potřebujete inicializaci spustit později, lze volat initialize() ručně. Preferovaný způsob je suspendovatelná funkce volaná z coroutine:

val session = ComgateSecureSession(
checkoutId = "váš-checkout-id",
context = applicationContext,
threeDSConfig = ThreeDSConfig(),
lifecycleOwner = this
)

// Doporučené — suspend fun volaná z coroutine
lifecycleScope.launch {
val result = session.initialize()
result.onSuccess {
// Session je připravena
}.onFailure { e ->
// Chyba inicializace
}
}

Stav session (SessionState)

ComgateSecureSession vystavuje property sessionState typu SessionState, která v každém okamžiku popisuje aktuální fázi životního cyklu session. Pro jednoduché kontroly (true/false) je k dispozici také zkratka isInitialized.

Stavy

StavKdy platí
SessionState.NotInitializedSession byla právě vytvořena nebo byl zavolán cleanup() (lifecycle destroy). initialize() zatím nebyla volána.
SessionState.Initializinginitialize() právě probíhá — probíhá síťová komunikace a inicializace 3DS SDK.
SessionState.ReadyInicializace úspěšně dokončena. Session je připravena zpracovávat platby.
SessionState.Failed(error)Inicializace selhala. Property error (typ ComgateError) nese konkrétní příčinu. Session lze znovu inicializovat voláním initialize().

Typický životní cyklus

NotInitialized → Initializing → Ready
↘ Failed → Initializing → Ready (opakovaný pokus)
Ready → NotInitialized (lifecycle destroy)

Vlastnosti session

VlastnostTypPopis
sessionStateSessionStateAktuální stav session (viz tabulka výše).
isInitializedBooleanZkratka: true právě tehdy, když sessionState == SessionState.Ready.

Použití v UI (Compose)

Přečtením session.sessionState lze granulárně reagovat na každý stav a zobrazovat příslušný UI prvek:

val scope = rememberCoroutineScope()

// Composable reagující na stav session
when (session.sessionState) {
SessionState.NotInitialized -> {
Button(onClick = { scope.launch { session.initialize() } }) {
Text("Inicializovat")
}
}
SessionState.Initializing -> {
CircularProgressIndicator()
}
SessionState.Ready -> {
// Platební formulář je připraven
PaymentForm(session = session)
}
is SessionState.Failed -> {
val error = (session.sessionState as SessionState.Failed).error
Text("Chyba inicializace: ${error.message}")
Button(onClick = { scope.launch { session.initialize() } }) {
Text("Zkusit znovu")
}
}
}

Chyby při inicializaci

Stav SessionState.Failed nese ComgateError s popisem příčiny. Nejčastější chyby při inicializaci:

ChybaKódPopis
ComgateError.DeviceRootedDEVICE_ROOTEDZařízení je pravděpodobně rootované nebo jinak pozměněné. Inicializace je zablokovaná za účelem ochrany karetních dat. V devMode se tato kontrola přeskočí.
ComgateError.InitNetworkErrorINIT_NETWORK_ERRORSíťová chyba při stahování konfigurace.
ComgateError.InitUnauthorizedINIT_UNAUTHORIZEDServer vrátil HTTP 401 při inicializaci — neplatná nebo expirovaná autorizace.
ComgateError.InitFailedINIT_FAILEDInicializace selhala z jiného důvodu (např. neplatná odpověď serveru).
ComgateError.ApplicationNotAllowedAPPLICATION_NOT_ALLOWEDPackage name aplikace není na seznamu povolených aplikací.
Informace

Callback předaný do initialize() (nebo onInitialized) a přechod stavu na Ready/Failed jsou vždy doručeny na hlavním vlákně. sessionState lze bezpečně číst z jakéhokoli vlákna (property je označena jako @Volatile), ale UI aktualizace provádějte vždy na hlavním vlákně.

Překlady (lokalizace)

Texty komponent lze lokalizovat pomocí Translation.

  • Překlady se předávají do ComgateSecureSession parametrem translation
  • Lze použít vestavěný preset nebo vlastní instanci Translation
  • Uživatelsky nastavitelné jsou pouze tyto klíče:
KlíčPopis
panLabelLabel nad polem pro číslo karty (PAN).
expiryLabelLabel nad polem pro datum platnosti.
cvvLabelLabel nad polem pro CVV kód.
fullNameLabelLabel nad polem pro jméno držitele karty.
panHintPlaceholder text v poli pro číslo karty (PAN).
expiryHintPlaceholder text v poli pro datum platnosti (např. MM/RR).
cvvHintPlaceholder text v poli pro CVV kód.
fullNameHintPlaceholder text v poli pro jméno držitele karty.
panInvalidErrorChybová zpráva zobrazená pod PAN polem při zadání neplatného čísla karty.
expiryInvalidMonthErrorChybová zpráva zobrazená pod polem expirace při zadání neplatného měsíce (např. 13).
expiryExpiredErrorChybová zpráva zobrazená pod polem expirace, když je karta prošlá.
fullNameRequiredErrorChybová zpráva zobrazená pod polem jména, pokud není vyplněno.
payButtonTextText platebního tlačítka v klidovém (aktivním) stavu.
payButtonProcessingTextText platebního tlačítka během zpracování platby.
statusPaidZpráva zobrazená v SecurePaymentStatusView při úspěšné platbě.
statusPendingZpráva zobrazená v SecurePaymentStatusView, když platba čeká na finální stav.
loadingProcessingTextText zobrazený v SecureLoadingView (překryvná vrstva) během zpracování platby.
threeDSCancelButtonText tlačítka pro zrušení v dialogu 3D Secure ověření.

Aktuálně dostupné překlady

PřekladHodnota
AngličtinaTranslation.English
BulharštinaTranslation.Bulgarian
ČeštinaTranslation.Czech
DánštinaTranslation.Danish
EstonštinaTranslation.Estonian
FinštinaTranslation.Finnish
FrancouzštinaTranslation.French
ChorvatštinaTranslation.Croatian
ItalštinaTranslation.Italian
LitevštinaTranslation.Lithuanian
LotyšštinaTranslation.Latvian
MaďarštinaTranslation.Hungarian
NěmčinaTranslation.German
NizozemštinaTranslation.Dutch
NorštinaTranslation.Norwegian
PolštinaTranslation.Polish
PortugalštinaTranslation.Portuguese
RumunštinaTranslation.Romanian
RuštinaTranslation.Russian
ŘečtinaTranslation.Greek
SlovenštinaTranslation.Slovak
SlovinštinaTranslation.Slovenian
ŠpanělštinaTranslation.Spanish
ŠvédštinaTranslation.Swedish
UkrajinštinaTranslation.Ukrainian
VietnamštinaTranslation.Vietnamese
val translation = Translation(
panLabel = "Číslo karty",
expiryLabel = "Platnost",
cvvLabel = "CVC/CVV",
fullNameLabel = "Jméno držitele",
panHint = "Číslo karty",
expiryHint = "MM/RR",
cvvHint = "CVV",
fullNameHint = "Jméno a příjmení",
panInvalidError = "Neplatné číslo karty",
expiryInvalidMonthError = "Neplatný měsíc",
expiryExpiredError = "Karta je expirovaná",
fullNameRequiredError = "Vyplňte jméno držitele",
payButtonText = "Zaplatit",
payButtonProcessingText = "Zpracovávám...",
statusPaid = "Zaplaceno",
statusPending = "Zpracovává se",
loadingProcessingText = "Zpracovávám platbu…",
threeDSCancelButton = "Zrušit"
)

val session = ComgateSecureSession(
checkoutId = "váš-checkout-id",
context = applicationContext,
threeDSConfig = ThreeDSConfig(),
translation = translation,
lifecycleOwner = this
)

Příklad s vestavěným překladem:

val session = ComgateSecureSession(
checkoutId = "váš-checkout-id",
context = applicationContext,
threeDSConfig = ThreeDSConfig(),
translation = Translation.Czech,
lifecycleOwner = this
)

Při použití rozdělených polí (SecurePanField, SecureExpiryField, SecureCvvField) se texty aplikují přes session a použité komponenty knihovny.

Pro jednotlivá pole lze překlady labelů dále přepsat lokálně přes labelText. Pokud nechcete label zobrazit vůbec, nastavte showLabel = false (v Compose) nebo app:secureFieldShowLabel="false" (v XML).

Kódy podporovaných jazyků

ComgateSecureSession.supportedLanguageCodes vrací abecedně seřazený seznam BCP 47 / ISO 639-1 kódů jazyků, pro které knihovna obsahuje vestavěný překlad. Tento seznam lze využít k naplnění výběru jazyka v UI nebo ke zjištění, zda je jazyk zařízení podporován.

Aktuálně dostupné kódy: bg, cs, da, de, el, en, es, et, fi, fr, hr, hu, it, lt, lv, nl, no, pl, pt, ro, ru, sk, sl, sv, uk, vi

Příklad — automatická detekce jazyka zařízení s fallbackem na angličtinu:

val deviceLang = Locale.getDefault().language.lowercase()
val resolvedLang = deviceLang
.takeIf { it in ComgateSecureSession.supportedLanguageCodes }
?: "en"

val session = ComgateSecureSession(
checkoutId = "váš-checkout-id",
context = applicationContext,
threeDSConfig = ThreeDSConfig(),
translation = Translation.forLanguageCode(resolvedLang),
lang = resolvedLang,
lifecycleOwner = this
)

Příklad — naplnění výběru jazyka v UI a propojení s překladem:

// Získání seznamu podporovaných kódů
val languageCodes = ComgateSecureSession.supportedLanguageCodes

// Po výběru jazyka uživatelem
val selectedCode = "sk"
val translation = Translation.forLanguageCode(selectedCode)