Přeskočit na hlavní obsah

MVP ukázka

Tato stránka ukazuje minimální funkční implementaci Mobilního SDK — kompletní příklad, který integruje karetní platby, Apple Pay, 3D Secure autentizaci, overlay indikátoru načítání a zobrazení výsledku platby v jediné SwiftUI obrazovce.

Cílem je poskytnout přehledný výchozí bod při integraci SDK do vlastní aplikace. Detailní popis jednotlivých komponent a konfiguračních možností naleznete v navazujících sekcích dokumentace.

Co MVP obsahuje

  • Inicializaci session (ComgateSecureSession) včetně konfigurace 3D Secure
  • Formulář se Secure Fields pro karetní platbu (číslo karty, datum expirace, CVV, jméno držitele)
  • Tlačítko pro karetní platbu (SecurePayButton)
  • Tlačítko pro Apple Pay (SecureApplePayButton)
  • Overlay indikátoru načítání (.secureLoadingOverlay)
  • Zobrazení výsledku platby (SecurePaymentStatusView)

Zdrojový kód

import SwiftUI
import ComgateSDK

@main
struct MvpDemoApp: App {
@StateObject private var session = ComgateSecureSession(
checkoutId: "<CHECKOUT_ID>",
applePayMerchantIdentifier: "merchant.<YOUR_MERCHANT_ID>",
applePayDisplayName: "<MERCHANT_NAME>",
threeDSConfig: ThreeDSConfig(
uiCustomization: ThreeDSUiCustomization(
toolbarStyle: ThreeDSToolbarStyle(headerText: "<APP_NAME>")
),
challengeTimeoutMinutes: 5
),
translation: .forCurrentLocale()
)

var body: some Scene {
WindowGroup {
PaymentScreen(session: session)
.task {
if case .notInitialized = session.state {
try? await session.initialize()
}
}
}
}
}

@MainActor
final class CollectorHolder: ObservableObject {
let collector: SecureCardDataCollector
init(pan: SecurePanFieldState, expiry: SecureExpiryFieldState, cvv: SecureCvvFieldState) {
self.collector = secureCardDataCollector(pan: pan, expiry: expiry, cvv: cvv)
}
}

struct PaymentScreen: View {
@ObservedObject var session: ComgateSecureSession

@StateObject private var panState: SecurePanFieldState
@StateObject private var expiryState: SecureExpiryFieldState
@StateObject private var cvvState: SecureCvvFieldState
@StateObject private var nameState: SecureFullNameFieldState
@StateObject private var statusState = PaymentStatusState()
@StateObject private var holder: CollectorHolder

init(session: ComgateSecureSession) {
self._session = ObservedObject(wrappedValue: session)
let pan = SecurePanFieldState()
let expiry = SecureExpiryFieldState()
let cvv = SecureCvvFieldState()
let name = SecureFullNameFieldState()
_panState = StateObject(wrappedValue: pan)
_expiryState = StateObject(wrappedValue: expiry)
_cvvState = StateObject(wrappedValue: cvv)
_nameState = StateObject(wrappedValue: name)
_holder = StateObject(wrappedValue: CollectorHolder(pan: pan, expiry: expiry, cvv: cvv))
}

private var collector: SecureCardDataCollector { holder.collector }

private func params() -> PaymentParams {
try! PaymentParams(
email: "test@example.com",
price: 100,
curr: "CZK",
country: "CZ",
label: "Test payment",
refId: "mvp-001"
)
}

private func handle(_ result: PaymentResult) {
statusState.translation = session.translation
statusState.show(result: result)
}

var body: some View {
ScrollView {
VStack(spacing: 12) {
SecureFullNameField(state: nameState)
SecurePanField(state: panState)
SecureExpiryField(state: expiryState)
SecureCvvField(state: cvvState)

SecurePayButton(
session: session,
collector: collector,
paymentParams: params,
onResult: handle
)

SecureApplePayButton(
session: session,
paymentParams: params,
onResult: handle
)

SecurePaymentStatusView(state: statusState)
}
.padding(.horizontal, 20)
.padding(.top, 60)
}
.onAppear {
panState.translation = session.translation
expiryState.translation = session.translation
cvvState.translation = session.translation
nameState.translation = session.translation
nameState.attachTo(session)
}
.onDisappear { nameState.detachFrom(session) }
.secureLoadingOverlay(session: session)
}
}