Kartové údaje
Kartové platby probíhají prostredníctvom zabezpečených vstupních komponent — Secure Fields. Tieto komponenty zajišťují bezpečné zadávanie, validaci a ochranu karetních údajov. Hostitelská aplikace nikdy nemá přístup k citlivým údajovm v nechráněné podobě.
Secure Fields
Knižnica poskytuje čtyři komponenty pro zadávanie údajov v platebním formuláři:
SecurePanField
Pole pro zadání čísla karty (PAN — Primary Account Number).
- Prijíma iba číslice
- Automaticky detekuje karetní síť (Visa, Mastercard)
- Formátuje číslo karty s mezerami dle kartové siete (napr.
4111 1111 1111 1111) - Omezuje délku vstupu podle detekované kartové siete
- Validuje číslo karty pomocí Luhnova algoritmu
- Podporuje systémový autofill
- Sprístupňuje vlastnosť
last4— poslední 4 číslice karty (bezpečné pro zobrazení v UI)
import cz.comgate.sdk.compose.*
val panState = rememberSecurePanFieldState()
SecurePanField(
state = panState,
modifier = Modifier.fillMaxWidth()
)
SecureExpiryField
Pole pro zadání data expirace karty.
- Prijíma iba číslice
- Automaticky formátuje vstup ve tvaru MM/YY
- Validuje měsíc (1–12) a kontroluje, zda karta není expirovaná
- Podporuje autofill ve formátech MMYY i MMYYYY
val expiryState = rememberSecureExpiryFieldState()
SecureExpiryField(
state = expiryState,
modifier = Modifier.fillMaxWidth()
)
SecureCvvField
Pole pro zadání bezpečnostního kódu karty (CVV/CVC).
- Prijíma iba číslice
- Délka se automaticky přizpůsobuje detekované karetní síti
- Validuje minimální požadovanou délku
val cvvState = rememberSecureCvvFieldState()
SecureCvvField(
state = cvvState,
modifier = Modifier.fillMaxWidth()
)
SecureFullNameField
Pole pro zadání jména a příjmení plátce.
- Prijíma textový vstup (vrátane mezer)
- Podporuje systémový autofill jména
- Je validní pri neprázdné hodnotě
- Po připojení k
ComgateSecureSessionse jeho hodnota automaticky použije jakofullName
import androidx.compose.runtime.DisposableEffect
import cz.comgate.sdk.compose.*
val fullNameState = rememberSecureFullNameFieldState()
DisposableEffect(session) {
fullNameState.attachTo(session)
onDispose { fullNameState.detachFrom(session) }
}
SecureFullNameField(
state = fullNameState,
modifier = Modifier.fillMaxWidth()
)
PaymentParams.fullName má vždy přednost před hodnotou z SecureFullNameField — ak je fullName v PaymentParams vyplnený, pole SecureFullNameField není vyžadováno. Ak je fullName prázdny, použije se hodnota z připojeného pole. Ak je prázdné obojí, platba selže s chybou MISSING_CARDHOLDER_NAME.
Společné vlastnosťi
Všechny Secure Fields (SecurePanField, SecureExpiryField, SecureCvvField, SecureFullNameField) sdílejí tieto vlastnosťi a metody:
| Vlastnost / Metoda | Typ | Popis |
|---|---|---|
isFieldValid | Boolean | Aktuální stav validace pole (read-only). |
onValidationChanged | (Boolean) -> Unit | Callback volaný pri změně validačního stavu. |
showLabel | Boolean | Zobrazení labelu nad poľom. Predvolené true. Nastavte false pro skrytí labelu. |
labelText | String? | Vlastní text labelu. Ak je null, použije se predvolené přeložený label podle session.translation. |
setHint(hint) | String | Nastaví placeholder text. |
setEnabled(enabled) | Boolean | Povolí/zakáže pole. |
clear() | — | Vymaže obsah pole a resetuje validaci. |
Labely vstupních polí
Každé pole má label nad vstupem (SecurePanField, SecureExpiryField, SecureCvvField, SecureFullNameField).
- Predvolený text labelu se bere z
session.translation - Label lze skryť přes
showLabel = false - Predvolené překlad lze přepsat přes
labelText
SecurePanField(
state = panState,
modifier = Modifier.fillMaxWidth(),
update = {
showLabel = true
labelText = "Číslo platební karty"
}
)
SecureCardDataCollector
SecureCardDataCollector propojuje tři samostatná Secure Fields a sleduje ich celkový validační stav. Je vyžadován pro spracovania platby.
import cz.comgate.sdk.compose.*
// Stav polí — raw kartové údaje zůstávají uvnitř SDK
val panState = rememberSecurePanFieldState()
val expiryState = rememberSecureExpiryFieldState()
val cvvState = rememberSecureCvvFieldState()
// Kolektor propojující pole a sledující celkovou validaci
val collector = rememberSecureDataCollector(
panState = panState,
expiryState = expiryState,
cvvState = cvvState,
onValidationChanged = { isValid ->
// isValid je true, když jsou všetky tri polia validné
}
)
Předávání focusu mezi poli
rememberSecureDataCollector ve predvoleném stavu automaticky odovzdáva focus mezi poli v pořadí:
PAN -> Expirace -> CVV
K přesunu dojde ve chvíli, kdy je aktuální pole kompletně vyplněné a validní.
val collector = rememberSecureDataCollector(
panState = panState,
expiryState = expiryState,
cvvState = cvvState,
autoAdvanceFocus = true // vychozi hodnota
)
Ak chcete focus řídit sami, vypněte automatiku:
val collector = rememberSecureDataCollector(
panState = panState,
expiryState = expiryState,
cvvState = cvvState,
autoAdvanceFocus = false
)
Pri implementaci pomocí Android View můžete odovzdávaní focusu zapojit ručně přes nextSecureField:
panField.nextSecureField = expiryField
expiryField.nextSecureField = cvvField
| Vlastnost / Metoda | Typ | Popis |
|---|---|---|
isValid | Boolean | true ak jsou všetky tri polia validné. |
onValidationChanged | (Boolean) -> Unit | Callback volaný pri zmene validačného stavu ktoréhokoľvek poľa. |
SecurePayButton
SecurePayButton je predpripravené platební tlačidlo, které se automaticky integruje se session a kolektorem:
- Automaticky se aktivuje/deaktivuje podle validačního stavu karetních polí
- Tlačítko zůstane deaktivované, dokud není session úspěšně inicializována
- Po kliknutí zahájí spracovania platby prostredníctvom
ComgateSecureSession - Během spracovania zobrazuje shimmer sweep animaci přes tlačidlo (animaci lze vypnout)
- Vrací výsledek platby přes callback
Nastavenie tlačidla
Composable SecurePayButton přijímá parametry session, kolektoru, callbacku a provideru platebních parametrů:
import cz.comgate.sdk.compose.*
SecurePayButton(
session = session,
collector = collector,
onPaymentResult = { result ->
// Spracovanie výsledku platby
},
paymentParamsProvider = {
PaymentParams(
email = "zakaznik@example.com",
price = 100,
curr = "CZK",
label = "Názov platby",
refId = "ref-123",
fullName = "Jan Novák",
country = "CZ", // volitelné
expirationTime = "1h", // volitelné
billingAddrCity = "Hradec Králové", // volitelné
billingAddrStreet = "Jiráskova 115", // volitelné
billingAddrPostalCode = "50304", // volitelné
billingAddrCountry = "CZ" // volitelné
)
},
modifier = Modifier.fillMaxWidth()
)
Parametr paymentParamsProvider je lambda, která je zavolaná v okamihu kliknutí na tlačidlo. Díky tomu lze dynamicky číst aktuální hodnoty z UI (napr. částku z textového pole).
PaymentParams
| Parametr | Typ | Povinný | Popis |
|---|---|---|---|
email | String | Ano | E-mailová adresa plátce. |
price | Int | Ano | Částka platby v haléřích/centech (napr. 10000 = 100,00 CZK). |
curr | String | Ano | Kód měny — ISO 4217 (napr. "CZK", "EUR"). Viz PaymentParams.supportedCurrencies pre úplý zoznam. |
label | String | Ano | Krátký popis produktu (1–16 znaků). |
refId | String | Ano | Variabilní symbol alebo číslo objednávky (vaše interní ID). |
fullName | String | Podmíněně | Jméno a příjmení plátce. Ak je neprázdny, má přednost před hodnotou z SecureFullNameField. Ak je prázdny, použije se hodnota z připojeného SecureFullNameField (tehdy povinného). Ak je prázdné obojí, platba selže s chybou MISSING_CARDHOLDER_NAME. |
country | String | Ne | Kód země dle ISO 3166-1 alpha-2 (napr. "CZ", "SK"). Predvolené: "CZ". Akákoľvek hodnota mimo zoznamu je pred odoslaním normalizovaná na "ALL". Hodnota sa odovzdáva tiež do platobného dialógu Google Pay. Viz PaymentParams.supportedCountries pre úplný zoznam. |
account | String? | Ne | Identifikátor bankovního účtu klienta v systému Comgate. |
name | String? | Ne | Identifikátor produktu (zobrazí se v denním CSV jako „Produkt"). |
preauth | Boolean? | Ne | Označí platbu jako předautorizaci — rezervuje prostředky na kartě bez okamžitého stržení. true — předautorizace, null — predvolené chování. Nelze kombinovat s initRecurring = true. |
initRecurring | Boolean? | Ne | Označí platbu jako první v sérii opakovaných plateb. true — iniciální rekurentní platba, null — predvolené chování. Nelze kombinovat s preauth = true. |
expirationTime | String? | Ne | Doba expirace platby (napr. "30m", "3h", "5d"). Rozsah: 30 minut — 7 dní. |
dynamicExpiration | Boolean? | Ne | Dynamická expirace platby (true pro zapnutí). |
billingAddrCity | String? | Ne | Fakturační adresa — město. |
billingAddrStreet | String? | Ne | Fakturační adresa — ulice. |
billingAddrPostalCode | String? | Ne | Fakturační adresa — PSČ. |
billingAddrCountry | String? | Ne | Fakturační adresa — kód země (ISO 3166-1 alpha-2). |
delivery | String? | Ne | Způsob doručení ("HOME_DELIVERY", "PICKUP", "ELECTRONIC_DELIVERY"). |
homeDeliveryCity | String? | Ne | Doručovací adresa — město (jen pri delivery = "HOME_DELIVERY"). |
homeDeliveryStreet | String? | Ne | Doručovací adresa — ulice (jen pri delivery = "HOME_DELIVERY"). |
homeDeliveryPostalCode | String? | Ne | Doručovací adresa — PSČ (jen pri delivery = "HOME_DELIVERY"). |
homeDeliveryCountry | String? | Ne | Doručovací adresa — kód země (jen pri delivery = "HOME_DELIVERY"). |
category | String? | Ne | Kategorie produktu ("PHYSICAL_GOODS_ONLY", "OTHER"). |
require3ds | Boolean? | Ne | Pouze v dev režimu (devMode = true). Vynucuje typ 3DS průběhu na testovacím serveru. true — vynutí průběh s challenge, false — vynutí frictionless průběh (bez challenge), null — server rozhodne sám. V produkci ignorováno. |
errorReason | ErrorReason? | Ne | Pouze v dev režimu (devMode = true). Simuluje konkrétní dôvod zamítnutí alebo selhania platby. Hodnota (vrátane null) je vždy odovzdaná serveru pri dev módu. V produkci ignorováno. Viz ErrorReason. |