Výsledky platby
Výsledok platby je reprezentovaný výčtom PaymentResult. Asynchrónne metódy processPayment(...) a processApplePayPayment(...) vracajú PaymentResult priamo, callback onResult v SecurePayButton a SecureApplePayButton je vždy volaný na hlavnom vlákne.
PaymentResult
V praxi rozlišujte tieto typy výsledku:
Prípad PaymentResult | Asociované hodnoty | Popis |
|---|---|---|
.paid(transId:) | String | Platba bola dokončená a potvrdená. |
.authorized(transId:) | String | Platba bola autorizovaná bankou (predautorizácia). |
.pending(transId:) | String | Platba sa stále spracováva (medzistav). |
.cancelled(errorReason:transId:) | String?, String | Platba bola zrušená alebo zamietnutá serverom. |
.failed(ComgateError) | ComgateError | Chyba na strane knižnice počas platobného procesu. |
Paid
Platba je úspešne dokončená.
case .paid(let transId):
// Platba dokončená
print("Paid: \(transId)")
Authorized
Platba bola autorizovaná (predautorizovaná) bankou. Ide o finálny stav. Zachytenie (settlement) platby vykoná obchodník samostatne pomocou štandardných endpointov /capturePreauth alebo /cancelPreauth.
case .authorized(let transId):
// Platba autorizovaná, čaká na zachytenie
print("Authorized: \(transId)")
Pending
Platba ešte nie je finálna, backend ju stále spracováva. Finálnym stavom bude .paid, .authorized alebo .cancelled.
case .pending(let transId):
// Čakáme na finálny stav
print("Pending: \(transId)")
Cancelled
Platba bola zrušená alebo zamietnutá serverom. Obsahuje identifikátor transakcie a voliteľný dôvod.
case .cancelled(let errorReason, let transId):
// Platba bola ukončená bez úhrady
print("Cancelled: \(errorReason ?? "-") (\(transId))")
Možné hodnoty errorReason
errorReason je raw value výčtu ErrorReason (môže byť nil, ak server hodnotu nedodá):
errorReason | Význam |
|---|---|
CUSTOMER_CLICK | Zrušené platiteľom. |
FRAUD_SUSPECTED | Podozrenie na podvod. |
ESHOP_CANCELLED | Zrušené obchodníkom. |
PROVIDER_REPORT | Zrušené poskytovateľom. |
PROVIDER_TIMEOUT | Vypršal časový limit poskytovateľa. |
CUSTOMER_TIMEOUT | Vypršal časový limit platby. |
ACS_TIMEOUT | Vypršal časový limit overenia. |
INVALID_CARDNO_EXPIRY | Chybne zadané číslo karty alebo dátum platnosti karty. |
INVALID_CVC | Chybne zadaný CVC / CVV kód. |
LIMIT_EXCEEDED | Limit karty bol prekročený. |
NO_FUNDS | Na účte nie je dostatočný zostatok. |
REJECTED_BY_BANK | Platba bola zamietnutá bankou. |
3DS_AUTH_FAIL | Overenie platby nebolo úspešné. |
NOT_SPECIFIED | Nešpecifikované. |
V dev režime (devMode = true) môžete tieto hodnoty simulovať pomocou parametra errorReason v PaymentParams. Pozri sekciu Simulácia chybového dôvodu.
Failed
Chyba na strane knižnice, ktorá nastala počas platobného procesu. Na rozdiel od .cancelled (kde server aktívne zamietol platbu) .failed značí, že k dokončeniu platby vôbec nedošlo — napr. sieťová chyba, neinicializovaná session a pod.
Asociovanou hodnotou je objekt ComgateError s machine-readable kódom (code) a ľudsky čitateľnou správou (message).
case .failed(let error):
let errorCode = error.code // napr. "PAYMENT_NETWORK_ERROR"
let errorMessage = error.message // napr. "Network error during payment."
// Zobrazenie chyby používateľovi
ComgateError
Všetky chyby sú definované ako case výčtu ComgateError. Každý case vystavuje:
code: String— strojovo čitateľný identifikátor chybymessage: String— ľudsky čitateľný popis v angličtine
Inicializácia
| Prípad | Kód | Popis |
|---|---|---|
.deviceRooted | DEVICE_ROOTED | Zariadenie je pravdepodobne jailbreaknuté alebo inak pozmenené. Inicializácia je zablokovaná na ochranu údajov karty. V devMode sa táto kontrola preskočí. |
.initNetworkError | INIT_NETWORK_ERROR | Inicializácia session zlyhala kvôli sieťovej chybe. |
.initUnauthorized | INIT_UNAUTHORIZED | Server vrátil HTTP 401 pri inicializácii — neplatná alebo expirovaná autorizácia. |
.initFailed | INIT_FAILED | Inicializácia session zlyhala (iný než sieťový dôvod). |
.applicationNotAllowed | APPLICATION_NOT_ALLOWED | Aplikácia nie je povolená pre použitie SDK (Bundle ID nie je v allow-liste). |
Spracovanie platby
| Prípad | Kód | Popis |
|---|---|---|
.sessionNotInitialized | SESSION_NOT_INITIALIZED | Session nebola inicializovaná. Zavolajte najprv initialize(). |
.invalidCardData | INVALID_CARD_DATA | Údaje karty nie sú platné. |
.missingCardholderName | MISSING_CARDHOLDER_NAME | Meno držiteľa karty nebolo poskytnuté. |
.paymentFailed | PAYMENT_FAILED | Platba zlyhala (iný než sieťový dôvod). |
.paymentNetworkError | PAYMENT_NETWORK_ERROR | Platobná požiadavka zlyhala kvôli sieťovej chybe. |
.paymentCreateFailed | PAYMENT_CREATE_FAILED | Vytvorenie platby zlyhalo. |
.pollingTimeout | POLLING_TIMEOUT | Kontrola stavu platby vypršala. |
.pollingNetworkError | POLLING_NETWORK_ERROR | Kontrola stavu platby zlyhala kvôli sieťovej chybe. |
.threeDSChallengeCancelled | THREE_DS_CHALLENGE_CANCELLED | 3D Secure challenge bola zrušená. |
.threeDSChallengeTimeout | THREE_DS_CHALLENGE_TIMEOUT | 3D Secure challenge vypršala. |
.threeDSFailed | THREE_DS_FAILED | 3D Secure autentifikácia zlyhala. |
Apple Pay
| Prípad | Kód | Popis |
|---|---|---|
.applePayNotConfigured | APPLE_PAY_NOT_CONFIGURED | Apple Pay nie je nakonfigurovaný. |
.applePayCancelled | APPLE_PAY_CANCELLED | Apple Pay bol zrušený používateľom. |
.applePayFailed | APPLE_PAY_FAILED | Apple Pay platba zlyhala. |
Validácia polí
| Prípad | Kód | Popis |
|---|---|---|
.invalidPan | INVALID_PAN | Neplatné číslo karty. |
.invalidExpiryMonth | INVALID_EXPIRY_MONTH | Neplatný mesiac exspirácie. |
.cardExpired | CARD_EXPIRED | Karta je po platnosti. |
.invalidCvv | INVALID_CVV | Neplatný CVV kód. |
.conflictingPaymentOptions | CONFLICTING_PAYMENT_OPTIONS | initRecurring a preauth nemôžu byť obaja true. |
.invalidPrice | INVALID_PRICE | price musí byť kladné celé číslo v najmenšej jednotke meny. |
SecurePaymentStatusView
Komponent SecurePaymentStatusView slúži na zobrazovanie stavových hlások platby (úspech, spracovanie, chyba). Pracuje s objektom PaymentStatusState, ktorý drží aktuálnu zobrazenú správu.
PaymentStatusState
| Vlastnosť / Metóda | Typ | Popis |
|---|---|---|
visible | Bool | true ak má byť view zobrazené (read-only, @Published). |
text | String | Aktuálny text (read-only, @Published). |
translation | Translation | Preklady použité pre automatické správy. Nastavte na session.translation. |
show(result:) | func show(result: PaymentResult) | Automaticky vyberie a zobrazí lokalizovanú správu pre daný výsledok. |
showError(_:) | func showError(_ message: String) | Zobrazí vlastnú chybovú správu. |
hide() | func hide() | Skryje view (text zostáva). |
clear() | func clear() | Skryje view a vyčistí text. |
Zobrazenie stavu z PaymentResult
@StateObject private var statusState = PaymentStatusState()
statusState.translation = session.translation
statusState.show(result: paymentResult)
// V SwiftUI:
SecurePaymentStatusView(state: statusState)
PaymentResult | Správanie |
|---|---|
.paid | Zobrazí lokalizovanú správu z Translation.statusPaid so zeleným štýlom (úspech). |
.authorized | Zobrazí lokalizovanú správu z Translation.statusAuthorized so zeleným štýlom (úspech). |
.pending | Zobrazí lokalizovanú správu z Translation.statusPending s oranžovým štýlom (spracovanie). |
.cancelled | Zobrazí errorReason s červeným štýlom (chyba). |
.failed | Zobrazí error.message s červeným štýlom (chyba). |
Skrytie view
statusState.clear() // skryje view a vyčistí text
statusState.hide() // iba skryje view, text zostáva
Štylizácia
Podrobnosti o štylizácii SecurePaymentStatusView prostredníctvom štruktúry PaymentStatusStyle nájdete v sekcii Štylizácia komponentov.
Kompletný príklad spracovania výsledkov
struct PaymentResultHandler: View {
@ObservedObject var session: ComgateSecureSession
@StateObject private var statusState = PaymentStatusState()
@State private var resultText = ""
@State private var resultVisible = false
func handle(_ result: PaymentResult) {
statusState.translation = session.translation
switch result {
case .paid(let t):
statusState.show(result: result)
resultVisible = true
resultText = "Platba dokončená\nTransId: \(t)"
case .authorized(let t):
statusState.show(result: result)
resultVisible = true
resultText = "Platba autorizovaná\nTransId: \(t)"
case .pending(let t):
statusState.show(result: result)
resultVisible = true
resultText = "Platba sa spracováva\nTransId: \(t)"
case .cancelled:
statusState.show(result: result)
resultVisible = false
case .failed(let err):
statusState.show(result: result)
resultVisible = false
print("Failed: \(err.code) — \(err.message)")
}
}
var body: some View {
VStack {
// ... (kartové polia, tlačidlo — pozri sekciu Údaje karty)
SecurePaymentStatusView(state: statusState)
if resultVisible {
Text(resultText)
.padding(.top, 8)
}
}
}
}