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

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: CheckoutstartPayment()clientSecretLaunchedEffect parodo PaymentSheet → vartotojas įveda kortelę → CompletedPaymentSucceededcompleteOrder()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(...) nepaleisi Application.onCreate (arba paleisi po PaymentSheet), programa lūžta:

java.lang.IllegalStateException: PaymentConfiguration was not initialized.
Call PaymentConfiguration.init(context, publishableKey)

PaymentSheet be publishable rakto nežino, į kurią Stripe paskyrą kreiptis. Inicijuok vieną kartą, anksti — Application klasėje (ten pat, kur startKoin).