# Migrasikan integrasi kartu dasar Anda Bermigrasi ke integrasi yang dapat menangani permintaan bank untuk autentikasi kartu. Jika Anda mengikuti panduan [Pembayaran kartu tanpa autentikasi bank](https://docs.stripe.com/payments/without-card-authentication.md), integrasi Anda melakukan pembayaran yang ditolak bila bank meminta pelanggan mengautentikasi pembelian. Jika Anda mulai melihat banyak pembayaran yang gagal seperti yang ada di Dashboard di bawah atau dengan kode kesalahan `requires_action_not_handled` di API, upgrade versi integrasi dasar Anda untuk menangani, bukan menolak, pembayaran ini. ![Dashboard menampilkan pembayaran gagal yang menyatakan bahwa bank ini memerlukan autentikasi untuk pembayaran ini](https://b.stripecdn.com/docs-statics-srv/assets/failed-payment-dashboard.9e22ec31f3c7063665911e26e389c5dc.png) Gunakan panduan ini untuk mempelajari cara memutakhirkan integrasi yang Anda buat di panduan sebelumnya untuk menambahkan kode server dan klien yang meminta pelanggan mengautentikasi pembayaran dengan menampilkan modal. > Lihat [contoh lengkap](https://github.com/stripe-samples/accept-a-payment/tree/master/custom-payment-flow) dari integrasi ini di GitHub. ## Periksa apakah pembayaran memerlukan autentikasi [Sisi server] Buat dua perubahan pada endpoint di server Anda yang membuat PaymentIntent: 1. **Hapus** parameter [error_on_requires_action](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-error_on_requires_action) agar pembayaran yang memerlukan autentikasi tidak lagi gagal. Sebagai gantinya, status PaymentIntent berubah menjadi `requires_action`. 1. **Tambahkan** parameter `confirmation_method` untuk menunjukkan bahwa Anda ingin secara eksplisit (manual) mengonfirmasi pembayaran lagi di server setelah menangani permintaan autentikasi. #### curl ```bash curl https://api.stripe.com/v1/payment_intents \ -u <>: \ -d amount=1099 \ -d currency=usd \ -d payment_method_types[]=card \ -d confirm=true \-d payment_method="{{PAYMENT_METHOD_ID}}" \ -d confirmation_method=manual ``` Kemudian perbarui fungsi “hasilkan respons” Anda untuk menangani status `requires_action` sebagai ganti memunculkan kesalahan: #### curl ```bash # If the request succeeds, check the # PaymentIntent's `status` and handle # its `next_action`. ``` ## Minta pelanggan untuk mengautentikasi [Sisi client] Selanjutnya, perbarui kode sisi klien Anda untuk memberi tahu Stripe agar menampilkan modal jika pelanggan perlu mengautentikasi. Gunakan [stripe.handleCardAction](https://docs.stripe.com/js.md#stripe-handle-card-action) bila PaymentIntent berstatus `requires_action`. Jika berhasil, PaymentIntent akan berstatus `requires_confirmation` dan Anda perlu mengonfirmasi PaymentIntent lagi pada server untuk menyelesaikan pembayaran. ```javascript const handleServerResponse = async (responseJson) => { if (responseJson.error) { // Show error from server on payment form} else if (responseJson.requiresAction) { // Use Stripe.js to handle the required card action const { error: errorAction, paymentIntent } = await stripe.handleCardAction(responseJson.clientSecret); if (errorAction) { // Show error from Stripe.js in payment form } else { // The card action has been handled // The PaymentIntent can be confirmed again on the server const serverResponse = await fetch('/pay', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ payment_intent_id: paymentIntent.id }) }); handleServerResponse(await serverResponse.json()); } } else { // Show success message } } ``` ## Konfirmasikan lagi PaymentIntent [Sisi server] Menggunakan endpoint sama yang Anda siapkan sebelumnya, *konfirmasikan* (Confirming an intent indicates that the customer intends to use the current or provided payment method. Upon confirmation, the intent attempts to initiate the portions of the flow that have real-world side effects) kembali PaymentIntent untuk memfinalisasi pembayaran dan memenuhi pesanan. Upaya pembayaran akan gagal dan beralih kembali ke `requires_payment_method` jika tidak dikonfirmasi ulang dalam waktu satu jam. #### curl ```bash curl https://api.stripe.com/v1/payment_intents/{{PAYMENT_INTENT_ID}}/confirm \ -u <>: \ -X "POST" ``` ## Coba integrasi Gunakan kartu pengujian kami di sandbox untuk memverifikasi bahwa integrasi Anda telah diperbarui dengan benar. Stripe menampilkan halaman autentikasi tiruan di dalam modal pada sandbox yang memungkinkan Anda mensimulasikan upaya autentikasi yang berhasil atau gagal. Dalam mode live, bank mengontrol UI dari apa yang ditampilkan di dalam modal tersebut. | Nomor | Keterangan | | ---------------- | ------------------------------------------------------------------------------------------------------------ | | 4242424242424242 | Berhasil dan segera memproses pembayaran. | | 4000000000009995 | Selalu gagal dengan kode tolakan `insufficient_funds`. | | 4000002500003155 | Perlu autentikasi, yang di integrasi ini akan digagalkan dengan kode penolakan `authentication_not_handled`. |