Skip to main content

Výsledky platby

Výsledok platby je reprezentovaný výčtom PaymentResult. Asynchrónne metódy processPayment(...)processApplePayPayment(...) vracajú PaymentResult priamo, callback onResultSecurePayButtonSecureApplePayButton je vždy volaný na hlavnom vlákne.

PaymentResult

V praxi rozlišujte tieto typy výsledku:

Prípad PaymentResultAsociované hodnotyPopis
.paid(transId:)StringPlatba bola dokončená a potvrdená.
.authorized(transId:)StringPlatba bola autorizovaná bankou (predautorizácia).
.pending(transId:)StringPlatba sa stále spracováva (medzistav).
.cancelled(errorReason:transId:)String?, StringPlatba bola zrušená alebo zamietnutá serverom.
.failed(ComgateError)ComgateErrorChyba na strane knižnice počas platobného procesu.

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á):

errorReasonVýznam
CUSTOMER_CLICKZrušené platiteľom.
FRAUD_SUSPECTEDPodozrenie na podvod.
ESHOP_CANCELLEDZrušené obchodníkom.
PROVIDER_REPORTZrušené poskytovateľom.
PROVIDER_TIMEOUTVypršal časový limit poskytovateľa.
CUSTOMER_TIMEOUTVypršal časový limit platby.
ACS_TIMEOUTVypršal časový limit overenia.
INVALID_CARDNO_EXPIRYChybne zadané číslo karty alebo dátum platnosti karty.
INVALID_CVCChybne zadaný CVC / CVV kód.
LIMIT_EXCEEDEDLimit karty bol prekročený.
NO_FUNDSNa účte nie je dostatočný zostatok.
REJECTED_BY_BANKPlatba bola zamietnutá bankou.
3DS_AUTH_FAILOverenie platby nebolo úspešné.
NOT_SPECIFIEDNešpecifikované.
Testovanie chybových scenárov

dev režime (devMode = true) môžete tieto hodnoty simulovať pomocou parametra errorReasonPaymentParams. 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 chyby
  • message: String — ľudsky čitateľný popis v angličtine
Inicializácia
PrípadKódPopis
.deviceRootedDEVICE_ROOTEDZariadenie je pravdepodobne jailbreaknuté alebo inak pozmenené. Inicializácia je zablokovaná na ochranu údajov karty. V devMode sa táto kontrola preskočí.
.initNetworkErrorINIT_NETWORK_ERRORInicializácia session zlyhala kvôli sieťovej chybe.
.initUnauthorizedINIT_UNAUTHORIZEDServer vrátil HTTP 401 pri inicializácii — neplatná alebo expirovaná autorizácia.
.initFailedINIT_FAILEDInicializácia session zlyhala (iný než sieťový dôvod).
.applicationNotAllowedAPPLICATION_NOT_ALLOWEDAplikácia nie je povolená pre použitie SDK (Bundle ID nie je v allow-liste).
Spracovanie platby
PrípadKódPopis
.sessionNotInitializedSESSION_NOT_INITIALIZEDSession nebola inicializovaná. Zavolajte najprv initialize().
.invalidCardDataINVALID_CARD_DATAÚdaje karty nie sú platné.
.missingCardholderNameMISSING_CARDHOLDER_NAMEMeno držiteľa karty nebolo poskytnuté.
.paymentFailedPAYMENT_FAILEDPlatba zlyhala (iný než sieťový dôvod).
.paymentNetworkErrorPAYMENT_NETWORK_ERRORPlatobná požiadavka zlyhala kvôli sieťovej chybe.
.paymentCreateFailedPAYMENT_CREATE_FAILEDVytvorenie platby zlyhalo.
.pollingTimeoutPOLLING_TIMEOUTKontrola stavu platby vypršala.
.pollingNetworkErrorPOLLING_NETWORK_ERRORKontrola stavu platby zlyhala kvôli sieťovej chybe.
.threeDSChallengeCancelledTHREE_DS_CHALLENGE_CANCELLED3D Secure challenge bola zrušená.
.threeDSChallengeTimeoutTHREE_DS_CHALLENGE_TIMEOUT3D Secure challenge vypršala.
.threeDSFailedTHREE_DS_FAILED3D Secure autentifikácia zlyhala.
Apple Pay
PrípadKódPopis
.applePayNotConfiguredAPPLE_PAY_NOT_CONFIGUREDApple Pay nie je nakonfigurovaný.
.applePayCancelledAPPLE_PAY_CANCELLEDApple Pay bol zrušený používateľom.
.applePayFailedAPPLE_PAY_FAILEDApple Pay platba zlyhala.
Validácia polí
PrípadKódPopis
.invalidPanINVALID_PANNeplatné číslo karty.
.invalidExpiryMonthINVALID_EXPIRY_MONTHNeplatný mesiac exspirácie.
.cardExpiredCARD_EXPIREDKarta je po platnosti.
.invalidCvvINVALID_CVVNeplatný CVV kód.
.conflictingPaymentOptionsCONFLICTING_PAYMENT_OPTIONSinitRecurring a preauth nemôžu byť obaja true.
.invalidPriceINVALID_PRICEprice 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ódaTypPopis
visibleBooltrue ak má byť view zobrazené (read-only, @Published).
textStringAktuálny text (read-only, @Published).
translationTranslationPreklady 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)
PaymentResultSprávanie
.paidZobrazí lokalizovanú správu z Translation.statusPaid so zeleným štýlom (úspech).
.authorizedZobrazí lokalizovanú správu z Translation.statusAuthorized so zeleným štýlom (úspech).
.pendingZobrazí lokalizovanú správu z Translation.statusPending s oranžovým štýlom (spracovanie).
.cancelledZobrazí errorReason s červeným štýlom (chyba).
.failedZobrazí 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)
}
}
}
}