Sukurk CartUiState.kt — client secret ir PaymentSheet
Kodo stulpelyje — CartUiState.kt. Naujas laukas clientSecret yra jungiklis: kai jis tampa ne null, ekranas parodo PaymentSheet. totalCents — suma Stripe formatu (centais).
Kaip clientSecret virsta mokėjimo langu? CartScreen naudoja Stripe composable'us:
// 1) paruošiam PaymentSheet ir aprašom, ką daryti su rezultatu
val paymentSheet = rememberPaymentSheet { result ->
when (result) {
is PaymentSheetResult.Completed -> viewModel.onEvent(CartEvent.PaymentSucceeded)
is PaymentSheetResult.Canceled -> viewModel.onEvent(CartEvent.PaymentCanceled)
is PaymentSheetResult.Failed -> viewModel.onEvent(CartEvent.PaymentFailed(result.error.message))
}
}
// 2) kai atsiranda clientSecret → parodom mokėjimo langą
LaunchedEffect(state.clientSecret) {
state.clientSecret?.let { secret ->
paymentSheet.presentWithPaymentIntent(
secret,
PaymentSheet.Configuration(merchantDisplayName = "Pica")
)
}
}
// 3) užsakymas įrašytas → snackbar ir grįžtam
LaunchedEffect(state.orderPlaced) {
if (state.orderPlaced) {
snackbarHostState.showSnackbar("Payment complete! 🍕")
viewModel.onEvent(CartEvent.ClearOrderPlaced)
onOrderPlaced()
}
}
Visas ciklas: Checkout → startPayment() → clientSecret → LaunchedEffect parodo PaymentSheet → vartotojas įveda kortelę → Completed → PaymentSucceeded → completeOrder() → orderPlaced → snackbar.
Patikrink. Testinis režimas, testinė kortelė 4242 4242 4242 4242, bet kokia ateities data, bet koks CVC:
1. Krepšelis → „Pay" → trumpai ⟳ (kuriamas PaymentIntent).
2. Iškyla Stripe PaymentSheet → įvedi 4242… → „Pay €X".
3. „Payment complete! 🍕" → užsakymas atsiranda istorijoje (status „paid"/„created").
Spąstai (inicijavimas). Jei
PaymentConfiguration.init(...)nepaleisiApplication.onCreate(arba paleisi poPaymentSheet), programa lūžta:java.lang.IllegalStateException: PaymentConfiguration was not initialized. Call PaymentConfiguration.init(context, publishableKey)
PaymentSheetbe publishable rakto nežino, į kurią Stripe paskyrą kreiptis. Inicijuok vieną kartą, anksti —Applicationklasėje (ten pat, kurstartKoin).