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
startPaymentircompleteOrder— atskiri? Nes tarp jų yra vartotojo veiksmas (kortelės įvedimasPaymentSheet) ir tinklo kelionė pas Stripe. ViewModel negali „laukti" mokėjimo eilutėje — jis paleidžiaPaymentSheet(perclientSecret) ir reaguoja į rezultatą kaip į naują įvykį (PaymentSucceeded). Klasikinis asinchroninis UI srautas.