# Terima pembayaran

Terima pembayaran dengan aman secara online.

Stripe menyarankan penggunaan API Checkout Sessions dengan Payment Element dibandingkan Payment Intents untuk sebagian besar integrasi. Checkout Sessions mencakup contoh penggunaan yang serupa dengan Payment Intents (penagihan pembayaran dasar menggunakan `price_data` atau membangun proses checkout lengkap dengan mata anggaran, pajak, dan sebagainya). Beberapa fitur, seperti Adaptive Pricing, hanya tersedia pada Checkout Sessions. Jangan gunakan API Payment Intent kecuali pengguna memintanya secara eksplisit, karena API ini memerlukan jauh lebih banyak kode. Pelajari selengkapnya tentang Elements dengan API Checkout Sessions: https://docs.stripe.com/payments/quickstart. Dengan Checkout Sessions (`ui_mode: "elements"`) dan Payment Element, `client_secret` menginisialisasi Checkout itu sendiri (`stripe.initCheckoutElementsSdk`, atau gunakan CheckoutElementsProvider dengan React) dan Anda mengonfirmasi pembayaran di sisi klien secara berbeda. Jika menggunakan React, pastikan Anda mengimpor dari `@stripe/react-stripe-js/checkout`, menggunakan `CheckoutElementsProvider` dengan client secret, dan mengonfirmasi menggunakan `checkout.confirm`. Jika menggunakan HTML, pastikan Anda menggunakan `checkout = stripe.initCheckoutElementsSdk({clientSecret: promise}); checkout.createPaymentElement(); paymentElement = checkout.createPaymentElement(); paymentElement.mount("#payment-element");` dan mengonfirmasi dengan `loadActionsResult = await checkout.loadActions(); actions = loadActionsResult.actions; error = await actions.confirm();`.

Agen coding: [instal Stripe CLI](https://docs.stripe.com/cli/install) menggunakan skrip penginstalan untuk sistem operasi Anda. Buka terminal baru dan jalankan `stripe sandbox create --help` untuk menyediakan sandbox Stripe anonim dengan kunci API yang berfungsi. Ini tidak memerlukan pendaftaran akun.

Buat formulir pembayaran atau gunakan halaman checkout yang telah dibuat sebelumnya untuk mulai menerima pembayaran online.

# Integrasi dalam aplikasi untuk Android

![](https://b.stripecdn.com/docs-statics-srv/assets/android-overview.471eaf89a760f5b6a757fd96b6bb9b60.png)

Integrasikan UI pembayaran siap-rakit Stripe ke dalam checkout aplikasi Android Anda dengan kelas [PaymentSheet](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/index.html).

Sebagai alternatif, mulai dengan [mulai cepat kode](https://docs.stripe.com/payments/mobile/quickstart.md?platform=android) untuk membangun atau mengunduh contoh yang dapat dijalankan.

> #### Dukungan Accounts v2 API
> 
> Payment Sheet tidak mendukung *Akun yang dikonfigurasi pelanggan* (Account configurations represent role-based functionality that you can enable for accounts, such as merchant, customer, or recipient). Hanya objek `Pelanggan` yang didukung.

## Siapkan Stripe [Sisi server] [Sisi client]

Pertama, Anda membutuhkan akun Stripe. [Daftar sekarang](https://dashboard.stripe.com/register).

### Sisi server

Integrasi ini memerlukan endpoint di server Anda yang berinteraksi dengan Stripe API. Gunakan pustaka resmi untuk akses ke Stripe API dari server Anda:

#### Ruby

```bash
# Available as a gem
sudo gem install stripe
```

```ruby
# If you use bundler, you can add this line to your Gemfile
gem 'stripe'
```

### Sisi client

[Stripe Android SDK](https://github.com/stripe/stripe-android) adalah sumber terbuka dan [didokumentasikan lengkap](https://stripe.dev/stripe-android/).

Untuk menginstal SDK, tambahkan `stripe-android``ke blok`dependencies` file [app/build.gradle](https://developer.android.com/studio/build/dependencies) Anda:

#### Kotlin

```kotlin
plugins {
    id("com.android.application")
}

android { ... }

dependencies {
  // ...

  // Stripe Android SDK
  implementation("com.stripe:stripe-android:23.26.0")
  // Include the financial connections SDK to support US bank account as a payment method
  implementation("com.stripe:financial-connections:23.26.0")
}
```

> Untuk detail mengenai rilis SDK terbaru dan versi sebelumnya, lihat halaman [Rilis](https://github.com/stripe/stripe-android/releases) di GitHub. Untuk menerima notifikasi bila rilis baru diterbitkan, [lihat rilis untuk repositori](https://docs.github.com/en/github/managing-subscriptions-and-notifications-on-github/configuring-notifications#configuring-your-watch-settings-for-an-individual-repository).

## Aktifkan metode pembayaran

Lihat [pengaturan metode pembayaran](https://dashboard.stripe.com/settings/payment_methods) dan aktifkan metode pembayaran yang ingin Anda dukung. Anda membutuhkan setidaknya satu metode pembayaran yang diaktifkan untuk membuat *PaymentIntent* (The Payment Intents API tracks the lifecycle of a customer checkout flow and triggers additional authentication steps when required by regulatory mandates, custom Radar fraud rules, or redirect-based payment methods).

Secara default, Stripe mengaktifkan kartu dan metode pembayaran umum lainnya yang dapat membantu menjangkau lebih banyak pelanggan, tetapi sebaiknya aktifkan metode pembayaran tambahan yang relevan untuk bisnis dan pelanggan Anda. Lihat [Dukungan metode pembayaran](https://docs.stripe.com/payments/payment-methods/payment-method-support.md) untuk dukungan produk dan metode pembayaran, dan [halaman skema biaya](https://stripe.com/pricing/local-payment-methods) kami untuk mengetahui biayanya.

## Tambahkan endpoint [Sisi server]

> #### Catatan
> 
> Untuk menampilkan PaymentSheet sebelum membuat PaymentIntent, lihat [Kumpulkan detail pembayaran sebelum membuat Intent](https://docs.stripe.com/payments/accept-a-payment-deferred.md?type=payment).

Integrasi ini menggunakan tiga objek API Stripe:

1. [PaymentIntent](https://docs.stripe.com/api/payment_intents.md): Stripe menggunakannya untuk mewakili maksud Anda menagih pembayaran dari pelanggan, yang melacak upaya charge dan perubahan status pembayaran selama proses.
2. (Opsional) [Pelanggan](https://docs.stripe.com/api/customers.md): Untuk menyiapkan metode pembayaran untuk pembayaran mendatang, Anda harus melampirkannya ke pelanggan. Buat objek untuk mewakili pelanggan Anda ketika mereka membuat akun dengan bisnis Anda. Jika pelanggan Anda melakukan pembayaran sebagai tamu, Anda dapat membuat objek `Customer` sebelum pembayaran dan mengaitkannya dengan representasi internal Anda sendiri untuk akun pelanggan nantinya.
3. (Opsional) [CustomerSession](https://docs.stripe.com/api/customer_sessions.md): Informasi pada objek yang mewakili pelanggan Anda bersifat sensitif, dan tidak dapat diambil secara langsung dari aplikasi. `CustomerSession` memberikan SDK akses dengan cakupan sementara ke `Customer` dan memberikan [opsi konfigurasi](https://docs.stripe.com/api/customer_sessions/create.md#create_customer_session-components) tambahan.

> Jika Anda tidak pernah menyimpan kartu untuk pelanggan, Anda dapat menghilangkan objek `Customer` dan objek `CustomerSession` dari integrasi Anda.

Karena alasan keamanan, aplikasi Anda tidak dapat membuat objek ini. Sebagai gantinya, tambahkan endpoint di server Anda yang:

1. Mengambil objek `Customer` atau membuat yang baru.
2. Membuat [CustomerSession](https://docs.stripe.com/api/customer_sessions.md) untuk `Customer`.
3. Membuat `PaymentIntent` dengan [amount](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-amount), [currency](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-currency), dan [customer](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-customer).
4. Mengembalikan *Client Secret* (The client secret is a unique key returned from Stripe as part of a PaymentIntent. This key lets the client access important fields from the PaymentIntent (status, amount, currency) while hiding sensitive ones (metadata, customer)) `PaymentIntent`, `client_secret` `CustomerSession`, ID `Customer`, dan [kunci yang dapat dipublikasikan](https://dashboard.stripe.com/apikeys) Anda ke aplikasi Anda.

Tetapkan `Customer` yang sama pada `PaymentIntent` yang Anda tetapkan pada `CustomerSession`.

Metode pembayaran yang ditampilkan kepada pelanggan selama proses checkout juga disertakan dalam PaymentIntent. Anda dapat mengizinkan Stripe menarik metode pembayaran dari pengaturan Dashboard atau Anda dapat mencantumkannya secara manual. Terlepas dari opsi yang Anda pilih, ketahui mata uang yang diteruskan di PaymentIntent memfilter metode pembayaran yang ditampilkan kepada pelanggan. Misalnya, jika Anda meneruskan `eur` pada PaymentIntent dan mengaktifkan OXXO di Dashboard, OXXO tidak akan ditampilkan kepada pelanggan karena OXXO tidak mendukung pembayaran `eur`.

Kecuali jika integrasi Anda memerlukan opsi berbasis kode untuk menawarkan metode pembayaran, Stripe merekomendasikan opsi otomatis. Hal ini karena Stripe mengevaluasi mata uang, pembatasan metode pembayaran, dan parameter lainnya untuk menentukan daftar metode pembayaran yang didukung. Metode pembayaran yang meningkatkan konversi serta yang paling relevan dengan mata uang dan lokasi pelanggan akan diprioritaskan.

#### Kelola metode pembayaran dari Dashboard

Anda dapat mengelola metode pembayaran dari [Dashboard](https://dashboard.stripe.com/settings/payment_methods). Stripe membuat `PaymentIntent` menggunakan metode pembayaran yang memenuhi syarat yang telah Anda konfigurasi, berdasarkan faktor-faktor seperti jumlah transaksi, mata uang, dan alur pembayaran. Jika Anda tidak ingin menggunakan Dashboard, atau jika Anda ingin menentukan metode pembayaran yang diizinkan secara manual, Anda dapat menggunakan parameter `allowed_payment_method_types`.

#### curl

```bash
# Create a Customer (use an existing Customer ID if this is a returning customer)
curl https://api.stripe.com/v1/customers \
  -u <<YOUR_SECRET_KEY>>: \
  -X "POST" \
  -H "Stripe-Account: {{CONNECTED_ACCOUNT_ID}}"

# Create a CustomerSession for the Customer
curl https://api.stripe.com/v1/customer_sessions \
  -u <<YOUR_SECRET_KEY>>: \
  -X "POST" \
  -d "customer"="{{CUSTOMER_ID}}" \
  -d "components[mobile_payment_element][enabled]"=true \
  -d "components[mobile_payment_element][features][payment_method_save]"=enabled \
  -d "components[mobile_payment_element][features][payment_method_redisplay]"=enabled \
  -d "components[mobile_payment_element][features][payment_method_remove]"=enabled

# Create a PaymentIntent
curl https://api.stripe.com/v1/payment_intents \
  -u <<YOUR_SECRET_KEY>>: \
  -X "POST" \
  -d "customer"="{{CUSTOMER_ID}}" \
  -d "amount"=1099 \
  -d "currency"="eur" \

  -d "automatic_payment_methods[enabled]"=true \
```

#### Cantumkan metode pembayaran secara manual

#### curl

```bash
# Create a Customer (use an existing Customer ID if this is a returning customer)
curl https://api.stripe.com/v1/customers \
  -u <<YOUR_SECRET_KEY>>: \
  -X "POST" \
  -H "Stripe-Account: {{CONNECTED_ACCOUNT_ID}}"

# Create a CustomerSession for the Customer
curl https://api.stripe.com/v1/customer_sessions \
  -u <<YOUR_SECRET_KEY>>: \
  -X "POST" \
  -d "customer"="{{CUSTOMER_ID}}" \
  -d "components[mobile_payment_element][enabled]"=true \
  -d "components[mobile_payment_element][features][payment_method_save]"=enabled \
  -d "components[mobile_payment_element][features][payment_method_redisplay]"=enabled \
  -d "components[mobile_payment_element][features][payment_method_remove]"=enabled

# Create a PaymentIntent
curl https://api.stripe.com/v1/payment_intents \
  -u <<YOUR_SECRET_KEY>>: \
  -X "POST" \
  -d "customer"="{{CUSTOMER_ID}}" \
  -d "amount"=1099 \
  -d "currency"="eur" \
  -d "allowed_payment_method_types[]"="bancontact" \
  -d "allowed_payment_method_types[]"="card" \
  -d "allowed_payment_method_types[]"="ideal" \
  -d "allowed_payment_method_types[]"="klarna" \
  -d "allowed_payment_method_types[]"="sepa_debit" \
```

> Setiap metode pembayaran perlu mendukung mata uang yang diteruskan di PaymentIntent dan bisnis Anda perlu berlokasi di salah satu negara yang didukung oleh setiap metode pembayaran. Lihat halaman [Opsi integrasi metode pembayaran](https://docs.stripe.com/payments/payment-methods/integration-options.md) untuk detail selengkapnya tentang apa yang didukung.

## Kumpulkan detail pembayaran [Sisi client]

Sebelum menampilkan Payment Element seluler, halaman checkout Anda harus:

- Tampilkan produk yang sedang dibeli dan jumlah totalnya
- Kumpulkan informasi pengiriman yang diperlukan menggunakan [Address Element](https://docs.stripe.com/elements/address-element.md?platform=android)
- Sertakan tombol checkout untuk menyajikan UI Stripe

#### Jetpack Compose

[Inisialisasi](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/-builder/index.html) instance `PaymentSheet` di dalam `onCreate` Aktivitas checkout Anda, yang meneruskan metode untuk menangani hasil.

```kotlin
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import com.stripe.android.paymentsheet.PaymentSheet
import com.stripe.android.paymentsheet.PaymentSheetResult

@Composable
fun App() {
  val paymentSheet = remember { PaymentSheet.Builder(::onPaymentSheetResult).build() }
}

private fun onPaymentSheetResult(paymentSheetResult: PaymentSheetResult) {
  // implemented in the next steps
}
```

Selanjutnya, ambil PaymentIntent Client Secret, Client Secret Sesi Pelanggan, ID Pelanggan, dan kunci yang dapat diterbitkan dari titik akhir yang Anda buat di langkah sebelumnya. Atur kunci yang dapat dipublikasikan menggunakan `PaymentConfiguration` dan simpan yang lain untuk digunakan saat Anda menunjukkan PaymentSheet.

```kotlin
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalContext
import com.stripe.android.PaymentConfiguration
import com.stripe.android.paymentsheet.PaymentSheet
import com.stripe.android.paymentsheet.PaymentSheetResult

@Composable
fun App() {
  val paymentSheet = remember { PaymentSheet.Builder(::onPaymentSheetResult) }.build()
  val context = LocalContext.current
  var customerConfig by remember { mutableStateOf<PaymentSheet.CustomerConfiguration?>(null) }
  varpaymentIntentClientSecret by remember { mutableStateOf<String?>(null) }

  LaunchedEffect(context) {
    // Make a request to your own server and retrieve payment configurations
    val networkResult = ...
    if (networkResult.isSuccess) {
paymentIntentClientSecret = networkResult.paymentIntent
        customerConfig = PaymentSheet.CustomerConfiguration.createWithCustomerSession(
          id = networkResult.customer,
          clientSecret = networkResult.customerSessionClientSecret
        )
        PaymentConfiguration.init(context, networkResult.publishableKey)
    }
  }
}

private fun onPaymentSheetResult(paymentSheetResult: PaymentSheetResult) {
  // implemented in the next steps
}
```

Bila pelanggan mengetuk tombol checkout Anda, panggil [presentWithPaymentIntent](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/index.html#1814490530%2FFunctions%2F2002900378) untuk menyajikan lembar pembayaran. Setelah pelanggan menyelesaikan pembayaran, lembaran akan menutup dan [PaymentSheetResultCallback](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet-result-callback/index.html) dipanggil dengan [PaymentSheetResult](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet-result/index.html).

```kotlin

import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalContext
import com.stripe.android.PaymentConfiguration
import com.stripe.android.paymentsheet.PaymentSheet
import com.stripe.android.paymentsheet.PaymentSheetResult

@Composable
fun App() {
  val paymentSheet = remember { PaymentSheet.Builder(::onPaymentSheetResult) }.build()
  val context = LocalContext.current
  var customerConfig by remember { mutableStateOf<PaymentSheet.CustomerConfiguration?>(null) }
  var paymentIntentClientSecret by remember { mutableStateOf<String?>(null) }

  LaunchedEffect(context) {
    // Make a request to your own server and retrieve payment configurations
    val networkResult = ...
    if (networkResult.isSuccess) {
        paymentIntentClientSecret = networkResult.paymentIntent
        customerConfig = PaymentSheet.CustomerConfiguration.createWithCustomerSession(
          id = networkResult.customer,
          clientSecret = networkResult.customerSessionClientSecret
        )
        PaymentConfiguration.init(context, networkResult.publishableKey)
    }
  }

  Button(
    onClick = {
      val currentConfig = customerConfig
      val currentClientSecret =paymentIntentClientSecret

      if (currentConfig != null && currentClientSecret != null) {
        presentPaymentSheet(paymentSheet, currentConfig, currentClientSecret)
      }
    }
  ) {
    Text("Checkout")
  }
}

private fun presentPaymentSheet(
  paymentSheet: PaymentSheet,
  customerConfig: PaymentSheet.CustomerConfiguration,
paymentIntentClientSecret: String
) {
  paymentSheet.presentWithPaymentIntent(
paymentIntentClientSecret,
    PaymentSheet.Configuration.Builder(merchantDisplayName = "My merchant name")
      .customer(customerConfig)
      // Set `allowsDelayedPaymentMethods` to true if your business handles
      // delayed notification payment methods like US bank accounts.
      .allowsDelayedPaymentMethods(true)
      .build()
  )
}

private fun onPaymentSheetResult(paymentSheetResult: PaymentSheetResult) {
  when(paymentSheetResult) {
    is PaymentSheetResult.Canceled -> {
      print("Canceled")
    }
    is PaymentSheetResult.Failed -> {
      print("Error: ${paymentSheetResult.error}")
    }
    is PaymentSheetResult.Completed -> {
      // Display for example, an order confirmation screen
      print("Completed")
    }
  }
}
```

#### Tampilan (Klasik)

[Inisialisasikan](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/index.html#-394860221%2FConstructors%2F2002900378) instance `PaymentSheet` di dalam `onCreate` Aktivitas checkout Anda, yang meneruskan metode untuk menangani hasil.

#### Kotlin

```kotlin
import com.stripe.android.paymentsheet.PaymentSheet

class CheckoutActivity : AppCompatActivity() {
  lateinit var paymentSheet: PaymentSheet

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    paymentSheet = PaymentSheet.Builder(::onPaymentSheetResult).build(this)
  }

  fun onPaymentSheetResult(paymentSheetResult: PaymentSheetResult) {
    // implemented in the next steps
  }
}
```

Selanjutnya, ambil PaymentIntent Client Secret, Client Secret Sesi Pelanggan, ID Pelanggan, dan kunci yang dapat diterbitkan dari titik akhir yang Anda buat di langkah sebelumnya. Atur kunci yang dapat dipublikasikan menggunakan `PaymentConfiguration` dan simpan yang lain untuk digunakan saat Anda menunjukkan PaymentSheet.

#### Kotlin

```kotlin
import com.stripe.android.paymentsheet.PaymentSheet

class CheckoutActivity : AppCompatActivity() {
  lateinit var paymentSheet: PaymentSheet
  lateinit var customerConfig: PaymentSheet.CustomerConfiguration
  lateinit varpaymentIntentClientSecret: String

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    paymentSheet = PaymentSheet.Builder(::onPaymentSheetResult).build(this)
    lifecycleScope.launch {
      // Make a request to your own server and retrieve payment configurations
      val networkResult = MyBackend.getPaymentConfig()
      if (networkResult.isSuccess) {
paymentIntentClientSecret = networkResult.paymentIntent
        customerConfig = PaymentSheet.CustomerConfiguration.createWithCustomerSession(
          id = networkResult.customer,
          clientSecret = networkResult.customerSessionClientSecret
        )
        PaymentConfiguration.init(context, networkResult.publishableKey)
      }
    }
  }

  fun onPaymentSheetResult(paymentSheetResult: PaymentSheetResult) {
    // implemented in the next steps
  }
}
```

Bila pelanggan mengetuk tombol checkout Anda, panggil [presentWithPaymentIntent](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/index.html#1814490530%2FFunctions%2F2002900378) untuk menyajikan lembar pembayaran. Setelah pelanggan menyelesaikan pembayaran, lembaran akan menutup dan [PaymentSheetResultCallback](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet-result-callback/index.html) dipanggil dengan [PaymentSheetResult](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet-result/index.html).

#### Kotlin

```kotlin
// ...
class CheckoutActivity : AppCompatActivity() {
  lateinit var paymentSheet: PaymentSheet
  lateinit var customerConfig: PaymentSheet.CustomerConfiguration
  lateinit var paymentIntentClientSecret: String
  // ...
  fun presentPaymentSheet() {
    paymentSheet.presentWithPaymentIntent(
paymentIntentClientSecret,
      PaymentSheet.Configuration.Builder(merchantDisplayName = "My merchant name")
        .customer(customerConfig)
        // Set `allowsDelayedPaymentMethods` to true if your business handles
        // delayed notification payment methods like US bank accounts.
        .allowsDelayedPaymentMethods(true)
        .build()
    )
  }

  fun onPaymentSheetResult(paymentSheetResult: PaymentSheetResult) {
    when(paymentSheetResult) {
      is PaymentSheetResult.Canceled -> {
        print("Canceled")
      }
      is PaymentSheetResult.Failed -> {
        print("Error: ${paymentSheetResult.error}")
      }
      is PaymentSheetResult.Completed -> {
        // Display for example, an order confirmation screen
        print("Completed")
      }
    }
  }
}
```

Mengatur `allowsDelayedPaymentMethods` ke true memungkinkan metode pembayaran [pemberitahuan tertunda](https://docs.stripe.com/payments/payment-methods.md#payment-notification) seperti rekening bank AS. Untuk metode pembayaran ini, status pembayaran finalnya tidak diketahui bila `PaymentSheet` selesai, dan berhasil atau gagal sebagai gantinya nanti. Jika Anda mendukung jenis pembayaran ini, informasikan kepada pelanggan bahwa pesanannya telah dikonfirmasi dan hanya memenuhi pesanan (misalnya, mengirim produknya) bila pembayaran berhasil.

## Tangani kejadian pascapembayaran [Sisi server]

Stripe mengirim kejadian [payment_intent.succeeded](https://docs.stripe.com/api/events/types.md#event_types-payment_intent.succeeded) ketika selesai pembayaran. Gunakan [alat webhook Dashboard](https://dashboard.stripe.com/webhooks) atau ikuti [panduan webhook](https://docs.stripe.com/webhooks/quickstart.md) untuk menerima kejadian ini dan menjalankan tindakan, seperti mengirim email konfirmasi pesanan kepada pelanggan Anda, mencatat penjualan di database, atau memulai alur kerja pengiriman.

Dengarkan kejadian ini daripada menunggu callback dari client. Di client, pelanggan dapat menutup jendela browser atau keluar dari aplikasi sebelum callback mengeksekusi, dan klien jahat dapat memanipulasi respons. Penyiapan integrasi untuk mendengarkan kejadian asinkron memungkinkan Anda menyetujui [berbagai tipe metode pembayaran](https://stripe.com/payments/payment-methods-guide) dengan satu integrasi tunggal.

Selain menangani kejadian `payment_intent.succeeded`, kami merekomendasikan penanganan kejadian ini yang lain ketika menagih pembayaran dengan Payment Element:

| Kejadian                                                                                                                        | Keterangan                                                                                                                                                                                                                                                                                 | Tindakan                                                                                                                                                                                           |
| ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [payment_intent.succeeded](https://docs.stripe.com/api/events/types.md?lang=php#event_types-payment_intent.succeeded)           | Dikirim bila pelanggan berhasil menyelesaikan pembayaran.                                                                                                                                                                                                                                  | Kirimi pelanggan konfirmasi pesanan dan *penuhi* (Fulfillment is the process of providing the goods or services purchased by a customer, typically after payment is collected) pesanan mereka.     |
| [payment_intent. pemrosesan](https://docs.stripe.com/api/events/types.md?lang=php#event_types-payment_intent.processing)        | Dikirim bila pelanggan berhasil memprakarsai pembayaran, tetapi pembayaran itu belum selesai. Kejadian ini paling umum dikirim saat pelanggan memprakarsai debit bank. Kejadian diikuti dengan kejadian `payment_intent.succeeded` atau `payment_intent.payment_failed` di masa mendatang. | Kirimi pelanggan konfirmasi pesanan yang menunjukkan bahwa pembayaran mereka menunggu penyelesaian. Untuk barang digital, Anda mungkin ingin memenuhi pesanan sebelum menunggu pembayaran selesai. |
| [payment_intent.payment_failed](https://docs.stripe.com/api/events/types.md?lang=php#event_types-payment_intent.payment_failed) | Dikirim bila pelanggan mencoba melakukan pembayaran, tetapi pembayaran itu gagal.                                                                                                                                                                                                          | Jika transisi pembayaran dilakukan dari `processing` menjadi `payment_failed`, tawarkan upaya lain untuk membayar kepada pelanggan.                                                                |

## Coba integrasi

#### Kartu

| Nomor kartu         | Skenario                                                                                                                                                                                                                                                                                     | Cara mencoba                                                                                                         |
| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| 4242424242424242    | Pembayaran kartu berhasil dan tidak memerlukan autentikasi.                                                                                                                                                                                                                                  | Isilah formulir kartu kredit menggunakan nomor kartu kredit dengan sembarang tanggal kedaluwarsa, CVC, dan kode pos. |
| 4000002500003155    | Pembayaran kartu memerlukan *autentikasi* (Strong Customer Authentication (SCA) is a regulatory requirement in effect as of September 14, 2019, that impacts many European online payments. It requires customers to use two-factor authentication like 3D Secure to verify their purchase). | Isilah formulir kartu kredit menggunakan nomor kartu kredit dengan sembarang tanggal kedaluwarsa, CVC, dan kode pos. |
| 4000000000009995    | Kartu ini ditolak dengan kode penolakan seperti `insufficient_funds`.                                                                                                                                                                                                                        | Isilah formulir kartu kredit menggunakan nomor kartu kredit dengan sembarang tanggal kedaluwarsa, CVC, dan kode pos. |
| 6205500000000000004 | Kartu UnionPay memiliki panjang variabel 13–19 angka.                                                                                                                                                                                                                                        | Isilah formulir kartu kredit menggunakan nomor kartu kredit dengan sembarang tanggal kedaluwarsa, CVC, dan kode pos. |

#### Pengarahan ulang bank

| Metode pembayaran | Skenario                                                                                                                                                                                                  | Cara mencoba                                                                                                                                                                                           |
| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Bancontact, iDEAL | Pelanggan Anda gagal melakukan autentikasi di halaman pengarahan ulang untuk metode pembayaran dengan notifikasi segera dan berbasis pengarahan ulang.                                                    | Pilih sembarang metode pembayaran berbasis pengarahan ulang, isilah detail yang diperlukan, dan konfirmasikan pembayaran. Kemudian klik **Gagalkan pembayaran percobaan** di halaman pengarahan ulang. |
| Pay by Bank       | Pelanggan Anda berhasil membayar menggunakan metode pembayaran dengan [notifikasi tertunda](https://docs.stripe.com/payments/payment-methods.md#payment-notification) dan berbasis pengarahan ulang.      | Pilih metode pembayaran, isilah detail yang diperlukan, dan konfirmasikan pembayaran. Kemudian klik **Selesaikan pembayaran percobaan** di halaman pengarahan ulang.                                   |
| Pay by Bank       | Pelanggan Anda gagal melakukan autentikasi di halaman pengarahan ulang untuk metode pembayaran dengan notifikasi tertunda dan berbasis pengarahan ulang.                                                  | Pilih metode pembayaran, isilah detail yang diperlukan, dan konfirmasikan pembayaran. Kemudian klik **Gagalkan pembayaran percobaan** di halaman pengarahan ulang.                                     |
| BLIK              | Pembayaran BLIK gagal dalam berbagai cara — kegagalan langsung (misalnya, kode kedaluwarsa atau tidak valid), kesalahan tertunda (bank menolak) atau waktu habis (pelanggan tidak merespons tepat waktu). | Gunakan pola email untuk [menyimulasikan berbagai kegagalan.](https://docs.stripe.com/payments/blik/accept-a-payment.md#simulate-failures)                                                             |

#### Debit bank

| Metode pembayaran   | Skenario                                                                                         | Cara mencoba                                                                                                                                                                                                              |
| ------------------- | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Debit Langsung SEPA | Pelanggan Anda berhasil membayar dengan Debit Langsung SEPA.                                     | Isilah formulir menggunakan nomor akun `AT321904300235473204`. Transisi PaymentIntent yang telah dikonfirmasi awalnya menjadi sedang diproses, kemudian akan berubah menjadi status berhasil setelah tiga menit kemudian. |
| Debit Langsung SEPA | Transisi status maksud pembayaran pelanggan dari `processing` menjadi `requires_payment_method`. | Isilah formulir menggunakan nomor akun `AT861904300235473202`.                                                                                                                                                            |

Lihat [Pengujian](https://docs.stripe.com/testing.md) untuk mendapatkan informasi tambahan untuk menguji integrasi Anda.

## Optional: Enable Link

Aktifkan Link di [Setelan Metode pembayaran](https://dashboard.stripe.com/settings/payment_methods) untuk memungkinkan pelanggan Anda menyimpan dan menggunakan kembali informasi pembayaran mereka dengan aman menggunakan tombol checkout ekspres satu klik Link.

### Teruskan email pelanggan Anda ke Mobile Payment Element

Link mengautentikasi pelanggan menggunakan alamat email mereka. Stripe merekomendasikan untuk mengisi informasi sebanyak mungkin untuk merampingkan proses checkout.

Untuk mengisikan otomatis nama pelanggan, alamat email, dan nomor telepon, berikan `defaultBillingDetails` dengan informasi pelanggan Anda ketika menginisialisasi `PaymentSheet.Configuration`.

#### Kotlin

```kotlin
val configuration = PaymentSheet.Configuration.Builder(merchantDisplayName = "Example, Inc.")
  .defaultBillingDetails(
    PaymentSheet.BillingDetails(
        name = "Jenny Rosen",
        email = "jenny.rosen@example.com",
        phone = "888-888-8888"
    )
  )
  .build()
```

### Tangani proses keluar pengguna

`Lembar Pembayaran` menyimpan beberapa informasi secara lokal untuk mengingat apakah pengguna telah menggunakan Link dalam aplikasi. Untuk menghapus status internal `Lembar Pembayaran`, panggil `Lembar Pembayaran.resetPelanggan()` saat pengguna keluar.

#### Kotlin

```kotlin
class MyActivity: Activity {

  fun onLogoutButtonClicked() {
    PaymentSheet.resetCustomer(this)
    // Other logout logic required by your app
  }
}
```

## Optional: Aktifkan Google Pay

### Siapkan integrasi Anda

Untuk menggunakan Google Pay, pertama aktifkan Google Pay API dengan menambahkan yang berikut ini ke tag `<application>` **AndroidManifest.xml** Anda:

```xml
<application>
  ...
  <meta-data
    android:name="com.google.android.gms.wallet.api.enabled"
    android:value="true" />
</application>
```

Untuk detail selengkapnya, lihat [Siapkan Google Pay API](https://developers.google.com/pay/api/android/guides/setup) untuk Android dari Google Pay.

### Tambahkan Google Pay

Untuk menambahkan Google Pay ke integrasi Anda, teruskan [PaymentSheet.GooglePayConfiguration](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/-google-pay-configuration/index.html) bersama lingkungan Google Pay Anda (produksi atau percobaan) dan [kode negara bisnis Anda](https://dashboard.stripe.com/settings/account) saat memprakarsai [PaymentSheet.Configuration](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/-configuration/index.html).

#### Kotlin

```kotlin
val googlePayConfiguration = PaymentSheet.GooglePayConfiguration(
  environment = PaymentSheet.GooglePayConfiguration.Environment.Test,
  countryCode = "US",
  currencyCode = "USD" // Required for Setup Intents, optional for Payment Intents
)
val configuration = PaymentSheet.Configuration.Builder(merchantDisplayName = "My merchant name")
  .googlePay(googlePayConfiguration)
  .build()
```

### Google Pay percobaan

Google mengizinkan Anda melakukan pembayaran melalui [Rangkaian kartu percobaan](https://developers.google.com/pay/api/android/guides/resources/test-card-suite). Rangkaian kartu percobaan ini mendukung penggunaan [kartu percobaan](https://docs.stripe.com/testing.md) Stripe.

Anda harus menguji Google Pay menggunakan perangkat Android fisik, bukan perangkat simulasi, di negara yang mendukung Google Pay. Masuk ke Akun Google pada perangkat percobaan Anda dengan kartu asli yang disimpan di Google Wallet.

## Optional: Aktifkan pemindaian kartu

Untuk mengaktifkan dukungan pemindaian kartu, [minta akses produksi](https://developers.google.com/pay/api/android/guides/test-and-deploy/request-prod-access) ke Google Pay API dari [Google Pay dan Wallet Console](https://pay.google.com/business/console?utm_source=devsite&utm_medium=devsite&utm_campaign=devsite).

- Jika Anda telah mengaktifkan Google Pay, fitur pemindaian kartu secara otomatis tersedia di UI kami pada perangkat yang memenuhi syarat. Untuk mempelajari selengkapnya tentang perangkat yang memenuhi syarat, lihat [kendala API Google Pay](https://developers.google.com/android/reference/com/google/android/gms/wallet/PaymentsClient#getPaymentCardRecognitionIntent%28com.google.android.gms.wallet.PaymentCardRecognitionIntentRequest%29)
- **Penting:** Fitur pemindaian kartu hanya muncul di versi yang ditandatangani dengan kunci penandatanganan yang sama yang terdaftar di [Google Pay & Wallet Console](https://pay.google.com/business/console). Pembuatan percobaan atau debug menggunakan kunci penandatanganan yang berbeda (misalnya, pembuatan yang didistribusikan melalui Firebase App Tester) tidak akan menampilkan opsi **Pindai kartu**. Untuk mencoba pemindaian kartu di versi pra-rilis, Anda harus:
  - Menandatangani build pengujian Anda dengan kunci penandatanganan produksi Anda
  - Menambahkan sidik jari kunci penandatanganan pengujian Anda ke Google Pay dan Wallet Console

Jika aplikasi Anda tidak didukung Google Pay, Anda dapat menggunakan pemindai kartu Stripe.

> Pemindai kartu Stripe saat ini tersedia dalam pratinjau publik.

Untuk mengaktifkan dukungan pemindaian kartu, tambahkan `stripecardscan` ke dalam blok `dependencies` dari file [app/build.gradle](https://developer.android.com/studio/build/dependencies) Anda:

#### Groovy

```groovy
implementation 'com.stripe:stripecardscan:23.26.0'
```

## Optional: Aktifkan pembayaran ACH

Untuk mengaktifkan pembayaran debit ACH, sertakan Financial Connections sebagai dependensi bagi aplikasi Anda.

[Stripe Android SDK](https://github.com/stripe/stripe-android) adalah sumber terbuka dan [didokumentasikan lengkap](https://stripe.dev/stripe-android/).

Untuk menginstal SDK, tambahkan `financial-connections``ke blok`dependencies` file [app/build.gradle](https://developer.android.com/studio/build/dependencies) Anda:

#### Kotlin

```kotlin
plugins {
    id("com.android.application")
}

android { ... }

dependencies {
  // ...

  // Financial Connections Android SDK
  implementation("com.stripe:financial-connections:23.26.0")
}
```

> Untuk detail mengenai rilis SDK terbaru dan versi sebelumnya, lihat halaman [Rilis](https://github.com/stripe/stripe-android/releases) di GitHub. Untuk menerima notifikasi bila rilis baru diterbitkan, [lihat rilis untuk repositori](https://docs.github.com/en/github/managing-subscriptions-and-notifications-on-github/configuring-notifications#configuring-your-watch-settings-for-an-individual-repository).

## Optional: Sesuaikan lembaran

Semua penyesuaian dikonfigurasi menggunakan objek [PaymentSheet.Configuration](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/-configuration/index.html).

### Penampilan

Sesuaikan warna, font, dan lainnya agar sesuai dengan tampilan dan nuansa aplikasi Anda dengan menggunakan [API penampilan](https://docs.stripe.com/elements/appearance-api/mobile.md?platform=android).

### Tata letak metode pembayaran

Konfigurasikan tata letak metode pembayaran di lembaran menggunakan [paymentMethodLayout](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/-configuration/-builder/index.html#2123253356%2FFunctions%2F2002900378). Anda dapat menampilkannya secara horizontal, vertikal, atau membiarkan Stripe mengoptimalkan tata letak secara otomatis.
![](https://b.stripecdn.com/docs-statics-srv/assets/android-mpe-payment-method-layouts.3bcfe828ceaad1a94e0572a22d91733f.png)

#### Kotlin

```kotlin
PaymentSheet.Configuration.Builder("Example, Inc.")
  .paymentMethodLayout(PaymentSheet.PaymentMethodLayout.Automatic)
  .build()
```

### Kumpulkan alamat pengguna

Kumpulkan alamat tagihan atau pengiriman lokal dan internasional dari pelanggan Anda menggunakan [Address Element](https://docs.stripe.com/elements/address-element.md?platform=android).

### Nama tampilan bisnis

Tentukan nama bisnis yang dilihat pelanggan dengan mengatur [merchantDisplayName](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/-configuration/index.html#-191101533%2FProperties%2F2002900378). Secara default, ini adalah nama aplikasi Anda.

#### Kotlin

```kotlin
PaymentSheet.Configuration.Builder(
  merchantDisplayName = "My app, Inc."
).build()
```

### Mode gelap

Secara default `PaymentSheet` beradaptasi otomatis dengan pengaturan penampilan skala-sistem pengguna (mode terang dan gelap). Anda dapat mengubahnya dengan mengatur mode terang atau gelap di aplikasi Anda:

#### Kotlin

```kotlin
// force dark
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
// force light
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
```

### Detail tagihan default

Untuk mengatur nilai default bagi detail tagihan yang dikumpulkan di lembar pembayaran, konfigurasikan properti `defaultBillingDetails`. `PaymentSheet` akan melengkapi bidang-bidangnya dengan nilai yang Anda berikan.

#### Kotlin

```kotlin
val address = PaymentSheet.Address(country = "US")
val billingDetails = PaymentSheet.BillingDetails(
  address = address,
  email = "foo@bar.com"
)
val configuration = PaymentSheet.Configuration.Builder(merchantDisplayName = "Merchant, Inc.")
  .defaultBillingDetails(billingDetails)
  .build()
```

### Konfigurasikan pengumpulan detail tagihan

Gunakan `BillingDetailsCollectionConfiguration` untuk menentukan cara Anda ingin mengumpulkan detail penagihan di PaymentSheet.

Anda dapat mengumpulkan nama, email, nomor telepon, dan alamat pelanggan.

Pengumpulan alamat lengkap mencakup isi otomatis yang disediakan oleh Stripe untuk negara yang didukung, tanpa memerlukan penyiapan tambahan.

> Dengan menggunakan pelengkapan otomatis, Anda setuju untuk mematuhi [Kebijakan Penggunaan yang Dapat Diterima Google Maps Platform](https://cloud.google.com/maps-platform/terms/aup). Jika Anda melanggar kebijakan ini, Stripe mungkin menonaktifkan pelengkapan otomatis atau mengambil tindakan lain yang diperlukan.

Jika Anda ingin melampirkan detail tagihan default ke objek PaymentMethod sekalipun bidang tersebut tidak dikumpulkan di UI, atur `billingDetailsCollectionConfiguration.attachDefaultsToPaymentMethod` ke `true`.

#### Kotlin

```kotlin
val billingDetails = PaymentSheet.BillingDetails(
  email = "foo@bar.com"
)
val billingDetailsCollectionConfiguration = BillingDetailsCollectionConfiguration(
  attachDefaultsToPaymentMethod = true,
  name = BillingDetailsCollectionConfiguration.CollectionMode.Always,
  email = BillingDetailsCollectionConfiguration.CollectionMode.Never,
  address = BillingDetailsCollectionConfiguration.AddressCollectionMode.Full,
)
val configuration = PaymentSheet.Configuration.Builder(merchantDisplayName = "Merchant, Inc.")
  .defaultBillingDetails(billingDetails)
  .billingDetailsCollectionConfiguration(billingDetailsCollectionConfiguration)
  .build()
```

> Konsultasikan dengan penasihat hukum mengenai undang-undang yang berlaku untuk mengumpulkan informasi. Hanya kumpulkan nomor telepon jika Anda memerlukannya untuk transaksi.

## Optional: Selesaikan pembayaran di UI Anda

Anda dapat menyajikan Lembar Pembayaran untuk hanya mengumpulkan detail metode pembayaran dan menyelesaikan pembayaran kembali di UI aplikasi Anda. Hal ini akan berguna jika Anda memiliki tombol beli custom atau memerlukan langkah tambahan setelah detail pembayaran dikumpulkan.
![](https://b.stripecdn.com/docs-statics-srv/assets/android-multi-step.84d8a0a44b1baa596bda491322b6d9fd.png)

> Contoh integrasi [tersedia di GitHub kami](https://github.com/stripe/stripe-android/blob/master/paymentsheet-example/src/main/java/com/stripe/android/paymentsheet/example/samples/ui/paymentsheet/custom_flow/CustomFlowActivity.kt).

1. Pertama, inisialisasikan [PaymentSheet.FlowController](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/-flow-controller/index.html) alih-alih `PaymentSheet` menggunakan salah satu metode [Builder](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/-flow-controller/-builder/index.html).

#### Android (Kotlin)

```kotlin
class CheckoutActivity : AppCompatActivity() {
  private lateinit var flowController: PaymentSheet.FlowController

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val flowController = PaymentSheet.FlowController.Builder(
      resultCallback = ::onPaymentSheetResult,
      paymentOptionResultCallback = ::onPaymentOption,
    ).build(this)
  }
}
```

1. Selanjutnya, panggil `configureWithPaymentIntent` dengan kunci objek Stripe yang diambil dari back end Anda dan perbarui UI Anda dalam callback menggunakan [getPaymentOption()](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/-flow-controller/index.html#-2091462043%2FFunctions%2F2002900378). Ini berisi gambar dan label yang mewakili metode pembayaran yang saat ini dipilih pelanggan.

#### Android (Kotlin)

```kotlin
flowController.configureWithPaymentIntent(
  paymentIntentClientSecret = paymentIntentClientSecret,
  configuration = PaymentSheet.Configuration.Builder("Example, Inc.")
    .customer(PaymentSheet.CustomerConfiguration(
      id = customerId,
      ephemeralKeySecret = ephemeralKeySecret
    ))
    .build()
) { isReady, error ->
  if (isReady) {
    // Update your UI using `flowController.getPaymentOption()`
  } else {
    // handle FlowController configuration failure
  }
}
```

1. Berikutnya, panggil [presentPaymentOptions](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/-flow-controller/index.html#449924733%2FFunctions%2F2002900378) untuk mengumpulkan detail pembayaran. Saat pelanggan selesai, lembaran akan menutup dan memanggil [paymentOptionCallback](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-option-callback/index.html) yang diteruskan sebelumnya di `create`. Implementasikan metode ini untuk memperbarui UI Anda dengan `paymentOption` yang dikembalikan.

#### Android (Kotlin)

```kotlin
// ...
  flowController.presentPaymentOptions()
// ...
  private fun onPaymentOption(paymentOptionResult: PaymentOptionResult) {
    val paymentOption = paymentOptionResult.paymentOption
    if (paymentOption != null) {
      paymentMethodButton.text = paymentOption.label
      paymentMethodButton.setCompoundDrawablesRelativeWithIntrinsicBounds(
        paymentOption.drawableResourceId,
        0,
        0,
        0
      )
    } else {
      paymentMethodButton.text = "Select"
      paymentMethodButton.setCompoundDrawablesRelativeWithIntrinsicBounds(
        null,
        null,
        null,
        null
      )
    }
  }
```

1. Terakhir, panggil [confirm](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet/-flow-controller/index.html#-479056656%2FFunctions%2F2002900378) untuk menyelesaikan pembayaran. Saat pelanggan selesai, lembaran akan menutup dan memanggil [paymentResultCallback](https://stripe.dev/stripe-android/paymentsheet/com.stripe.android.paymentsheet/-payment-sheet-result-callback/index.html#237248767%2FFunctions%2F2002900378) yang diteruskan sebelumnya di `create`.

#### Android (Kotlin)

```kotlin
  // ...
    flowController.confirmPayment()
  // ...

  private fun onPaymentSheetResult(
    paymentSheetResult: PaymentSheetResult
  ) {
    when (paymentSheetResult) {
      is PaymentSheetResult.Canceled -> {
        // Payment canceled
      }
      is PaymentSheetResult.Failed -> {
        // Payment Failed. See logcat for details or inspect paymentSheetResult.error
      }
      is PaymentSheetResult.Completed -> {
        // Payment Complete
      }
    }
  }
```

Mengatur `allowsDelayedPaymentMethods` ke true memungkinkan metode pembayaran [pemberitahuan tertunda](https://docs.stripe.com/payments/payment-methods.md#payment-notification) seperti rekening bank AS. Untuk metode pembayaran ini, status pembayaran finalnya tidak diketahui bila `PaymentSheet` selesai, dan berhasil atau gagal sebagai gantinya nanti. Jika Anda mendukung jenis pembayaran ini, informasikan kepada pelanggan bahwa pesanannya telah dikonfirmasi dan hanya memenuhi pesanan (misalnya, mengirim produknya) bila pembayaran berhasil.

## Optional: Aktifkan pengumpulan kembali CVC pada konfirmasi

Instruksi berikut untuk mengumpulkan kembali CVC kartu tersimpan selama konfirmasi PaymentIntent beranggapan bahwa integrasi Anda mencakup hal berikut:

- Pembuatan PaymentIntents sebelum mengumpulkan detail pembayaran

### Perbarui parameter pembuatan maksud

Untuk mengumpulkan kembali CVC ketika mengonfirmasikan pembayaran, sertakan `require_cvc_recollection` selama pembuatan PaymentIntent.

#### curl

```bash
# Create a Customer (use an existing Customer ID if this is a returning customer)
curl https://api.stripe.com/v1/customers \
  -u <<YOUR_SECRET_KEY>>: \
  -X "POST" \
  -H "Stripe-Account: {{CONNECTED_ACCOUNT_ID}}"

# Create an Ephemeral Key for the Customer
curl https://api.stripe.com/v1/ephemeral_keys \
  -u <<YOUR_SECRET_KEY>>: \
  -H "Stripe-Version: 2026-10-28.endive" \
  -H "Stripe-Account: 2026-10-28.endive" \
  -X "POST" \
  -d "customer"="{{CUSTOMER_ID}}" \

# Create a PaymentIntent
curl https://api.stripe.com/v1/payment_intents \
  -u <<YOUR_SECRET_KEY>>: \
  -X "POST" \
  -d "customer"="{{CUSTOMER_ID}}" \
  -d "amount"=1099 \
  -d "currency"="eur" \
  -d "payment_method_options[card][require_cvc_recollection]"=true \

  -d "automatic_payment_methods[enabled]"=true \
```

