Tema
/
Mobiliosios programėlės KOTLIN
Pamoka 12 / 14 Stripe mokėjimas ~50 min

Papildyk CartViewModel.kt — mokėjimas dviem etapais

Kodo stulpelyje — pilnas CartViewModel.kt. Nuo 3 pamokos jis augo: 3 → in-memory krepšelis, 9 → placeOrder, 10 → staliukas. Dabar — mokėjimas dviem etapais. Atkreipk dėmesį į tvarką: startPayment() tik gauna clientSecret; užsakymas (placeOrder) įrašomas tik completeOrder() metu, kai Stripe patvirtino mokėjimą.

CartEvent gauna mokėjimo įvykius:

sealed interface CartEvent {
    // ...ankstesni (AddItem, RemoveItem, ...)
    data object Checkout : CartEvent            // paspaudė „Pay"
    data object PaymentSucceeded : CartEvent    // Stripe: pavyko
    data object PaymentCanceled : CartEvent     // vartotojas atšaukė
    data class PaymentFailed(val message: String?) : CartEvent
    data object ClearOrderPlaced : CartEvent
}

PicaApi gauna endpoint'ą (serveris nustato sumą centais):

@POST("create-payment-intent")
suspend fun createPaymentIntent(@Body request: PaymentIntentRequest): PaymentIntentResponse

@Serializable data class PaymentIntentRequest(@SerialName("amount_cents") val amountCents: Int)
@Serializable data class PaymentIntentResponse(@SerialName("client_secret") val clientSecret: String)

Ir Koinas — CartViewModel dabar turi tris priklausomybes:

// cartModule
single { OrderRepository(get()) }
viewModel { CartViewModel(get(), get(), get()) }   // OrderRepository, PicaApi, TableSession

PaymentConfiguration paleidžiama vieną kartą PicaApplication.onCreate (prieš bet kokį PaymentSheet):

PaymentConfiguration.init(applicationContext, "pk_test_...")   // tavo Stripe publishable raktas

Patarimas. Kodėl startPayment ir completeOrder — atskiri? Nes tarp jų yra vartotojo veiksmas (kortelės įvedimas PaymentSheet) ir tinklo kelionė pas Stripe. ViewModel negali „laukti" mokėjimo eilutėje — jis paleidžia PaymentSheet (per clientSecret) ir reaguoja į rezultatą kaip į naują įvykį (PaymentSucceeded). Klasikinis asinchroninis UI srautas.