Skip to main content

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 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

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 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)
}
}
}
}