Skip to main content

Výsledky platby

Výsledek platby je reprezentován sealed třídou PaymentResult. Callback onPaymentResultSecurePayButton.setup()SecureGooglePayButton.setup() je vždy volán na hlavním vlákně (main thread).

PaymentResult

V praxi rozlišujte tieto typy výsledku:

Typ PaymentResultPopis
PaymentResult.PaidPlatba bola dokončena a potvrzena.
PaymentResult.AuthorizedPlatba bola autorizovaná bankou (pre-autorizácia).
PaymentResult.PendingPlatba se stále zpracovává (mezistav).
PaymentResult.CancelledPlatba bola zrušená alebo zamietnutá serverem.
PaymentResult.FailedChyba na strane knižnice počas platebního procesu.

Platba je úspěšně dokončená.

is PaymentResult.Paid -> {
val transId = result.transId
// Platba dokončena
}

Authorized

Platba bola autorizovaná (pre-autorizovaná) bankou. Ide o finálny stav. Zachytenie (settlement) platby vykoná obchodník samostatne pomocou štandardných endpointov /capturePreauth alebo /cancelPreauth.

is PaymentResult.Authorized -> {
val transId = result.transId
// Platba autorizovaná, čaká na zachytenie
}

PENDING

Platba ještě není finální, backend ji stále zpracovává. Finálnym stavom bude Paid, Authorized alebo Cancelled.

is PaymentResult.Pending -> {
val transId = result.transId
// Čekáme na finální stav
}

CANCELLED

Platba bola zrušená alebo zamietnutá serverem. Obsahuje identifikátor transakce a volitelný dôvod.

is PaymentResult.Cancelled -> {
val transId = result.transId
val reason = result.errorReason
// Platba bola ukončena bez úhrady
}

Ak je výsledek PaymentResult.Cancelled, obsahuje odpověď i errorReason. V SDK je tento dôvod dostupný jako PaymentResult.Cancelled.errorReason.

Možné hodnoty errorReason

errorReasonVýznam
CUSTOMER_CLICKZrušeno plátcem.
FRAUD_SUSPECTEDPodezření na podvod.
ESHOP_CANCELLEDZrušeno obchodníkem.
PROVIDER_REPORTZrušeno providerem.
PROVIDER_TIMEOUTVypršel časový limit poskytovatele.
CUSTOMER_TIMEOUTVypršel časový limit platby.
ACS_TIMEOUTVypršel časový limit pro ověření.
INVALID_CARDNO_EXPIRYChybně zadané číslo karty alebo datum platnosti karty.
INVALID_CVCChybně zadaný CVC / CVV kód.
LIMIT_EXCEEDEDLimit karty byl překročen.
NO_FUNDSNa účtu není dostatečný zůstatek.
REJECTED_BY_BANKPlatba bola zamietnutá bankou.
3DS_AUTH_FAILOvěření platby nebylo úspěšné.
NOT_SPECIFIEDNespecifikováno.
Testování chybových scénářů

dev režimu (devMode = true) můžete tieto hodnoty simulovat pomocí parametru errorReasonPaymentParams. Viz sekcii Simulace chybového dôvodu.

FAILED

Chyba na strane knižnice, která nastala počas platebního procesu. Na rozdíl od Cancelled (kde server aktivně zamítl platbu), Failed značí, že k dokončení platby vůbec nedošlo — napr. síťová chyba,...

Výsledek obsahuje objekt ComgateError s machine-readable kódem (code) a lidsky čitelnou zprávou (message).

is PaymentResult.Failed -> {
val errorCode = result.error.code // napr. "PAYMENT_NETWORK_ERROR"
val errorMessage = result.error.message // napr. "Payment request failed due to a network error"
// Zobrazení chyby používateľi
}

ComgateError

Všechny chyby jsou definovány jako podtypy sealed třídy ComgateError. Každý typ obsahuje:

  • code — strojově čitelný identifikátor chyby
  • message — lidsky čitelný popis v angličtině
Inicializace
KódPopis
DEVICE_ROOTEDZariadenie je pravdepodobne rootované alebo inak pozmenené. Inicializácia je zablokovaná za účelom ochrany kartových dát. V devMode sa táto kontrola preskočí.
INIT_NETWORK_ERRORInicializace session selhala kvůli síťové chybě.
INIT_UNAUTHORIZEDServer vrátil HTTP 401 pri inicializácii — neplatná alebo expirovaná autorizácia.
INIT_FAILEDInicializace session selhala (jiný než síťový dôvod).
APPLICATION_NOT_ALLOWEDAplikace není povolena pro použitie SDK (package name není na allow-listu).
Zpracování platby
KódPopis
SESSION_NOT_INITIALIZEDSession nebola inicializována. Zavolejte nejprve initialize().
INVALID_CARD_DATAKartové údaje nejsou validní.
MISSING_CARDHOLDER_NAMEJméno držitele karty nebylo poskytnuto.
PAYMENT_FAILEDPlatba selhala (jiný než síťový dôvod).
PAYMENT_NETWORK_ERRORPlatební požadavek selhal kvůli síťové chybě.
PAYMENT_CREATE_FAILEDVytvorenie platby selhalo.
POLLING_TIMEOUTKontrola stavu platby vypršela.
POLLING_NETWORK_ERRORKontrola stavu platby selhala kvůli síťové chybě.
Google Pay
KódPopis
GOOGLE_PAY_NOT_CONFIGUREDGoogle Pay není nakonfigurován.
GOOGLE_PAY_FAILEDGoogle Pay platba selhala.
Validácia polí
KódPopis
INVALID_PANNeplatné číslo karty.
INVALID_EXPIRY_MONTHNeplatný měsíc expirace.
CARD_EXPIREDKarta je expirovaná.
INVALID_CVVNeplatný CVV kód.

SecurePaymentStatusView

Komponenta SecurePaymentStatusView slouží k zobrazování stavových hlášek platby (úspěch, spracovania, chyba). Začíná ve skrytém stavu (GONE) a zobrazí se po zavolání showStatus().

Zobrazení stavu z PaymentResult

Metoda showStatus(PaymentResult) automaticky rozpozná typ výsledku a zobrazí odpovídající styl:

val statusState = rememberPaymentStatusState()

// Automatické mapování PaymentResult na stavovou zprávu
statusState.showStatus(paymentResult)

// V Composable:
SecurePaymentStatusView(state = statusState)
PaymentResultChování
PaidZobrazí lokalizovanou zprávu „Paid“ se zeleným stylem (úspěch).
AuthorizedZobrazí lokalizovanú správu „Authorized" so zeleným štýlom (úspech).
PendingZobrazí lokalizovanou zprávu „Processing" s oranžovým stylem (spracovania).
CancelledZobrazí errorReason s červeným stylem (chyba).
FailedZobrazí error.message s červeným stylem (chyba).

Skrytí view

statusState.clear()

Stylizace

Podrobnosti o stylizaci SecurePaymentStatusView prostredníctvom update bloku, setter metod a XML atribútů nájdete v sekcii Stylizace komponent.

Kompletný príklad spracovania výsledků

@Composable
private fun PaymentResultHandler(session: ComgateSecureSession) {
val statusState = rememberPaymentStatusState()
var resultText by remember { mutableStateOf("") }
var resultVisible by remember { mutableStateOf(false) }

// ... (karetní pole, kolektor, tlačidlo — viz sekce Kartové údaje)

// Spracovanie výsledku platby:
fun handlePaymentResult(result: PaymentResult) {
when (result) {
is PaymentResult.Paid -> {
statusState.showStatus(result)
resultVisible = true
resultText = "Platba dokončena\nTransId: ${result.transId ?: "-"}"
}

is PaymentResult.Authorized -> {
statusState.showStatus(result)
resultVisible = true
resultText = "Platba autorizovaná\nTransId: ${result.transId}"
}

is PaymentResult.Pending -> {
statusState.showStatus(result)
resultVisible = true
resultText = "Platba se zpracovává\nTransId: ${result.transId ?: "-"}"
}

is PaymentResult.Cancelled -> {
resultVisible = false
statusState.showStatus(result)
// Volitelne: Toast.makeText(context, "Platba zrušená: ${result.errorReason ?: "bez detailu"}", Toast.LENGTH_LONG).show()
}

is PaymentResult.Failed -> {
resultVisible = false
statusState.showStatus(result)
Log.w("PaymentResult", "Failed: ${result.error.code}${result.error.message}")
// Volitelne: Toast.makeText(context, "Chyba: ${result.error.message}", Toast.LENGTH_LONG).show()
}
}
}

Column(modifier = Modifier.fillMaxWidth()) {
SecurePaymentStatusView(
state = statusState,
modifier = Modifier.fillMaxWidth()
)

if (resultVisible) {
Text(
text = resultText,
modifier = Modifier.padding(top = 8.dp)
)
}
}
}