Terima pembayaran kartu tanpa webhook
Pelajari cara mengonfirmasi pembayaran kartu di server Anda dan menangani permintaan autentikasi kartu.
Peringatan
Stripe merekomendasikan penggunaan Payment Element yang lebih baru sebagai ganti Card Element. Ini memungkinkan Anda menyetujui beberapa metode pembayaran dengan satu Element. Pelajari selengkapnya tentang waktu harus menggunakan Card Element dan Payment Element.
Untuk pemeriksaan di masa mendatang dan dukungan yang lebih luas, gunakan integrasi standar untuk pembayaran asinkron.
Integrasi ini menunggu respons yang dikembalikan dari client dan memfinalisasi pembayaran di server, tanpa menggunakan webhook atau memproses kejadian offline. Walaupun terlihat lebih sederhana, integrasi ini sulit diskalakan seiring pertumbuhan bisnis Anda dan memiliki beberapa keterbatasan:
- Hanya mendukung kartu—Anda harus menulis lebih banyak kode untuk mendukung metode pembayaran regional yang populer dan ACH secara terpisah.
- Risiko charge dua kali lipat—Dengan membuat PaymentIntent baru secara sinkron setiap kali pelanggan mencoba membayar, Anda berisiko men-charge pelanggan dua kali lipat secara tidak sengaja. Pastikan untuk mengikuti praktik terbaik.
- Perjalanan ekstra ke client—Kartu dengan 3D Secure atau yang tunduk pada peraturan, seperti Autentikasi Pelanggan yang Kuat, memerlukan langkah ekstra di client.
Pertimbangkan batasan ini jika Anda memutuskan untuk menggunakan integrasi ini. Jika tidak, gunakan integrasi standar.
Siapkan Stripe
Pertama, Anda membutuhkan akun Stripe. Daftar sekarang.
Gunakan pustaka resmi kami untuk mendapatkan akses ke Stripe API dari aplikasi Anda:
Kumpulkan detail kartuSisi client
Kumpulkan informasi kartu pada client dengan Stripe.js dan Stripe Elements. Elements adalah serangkaian komponen UI siap-rakit untuk mengumpulkan dan memvalidasi nomor kartu, kode pos, dan tanggal kedaluwarsa.
Stripe Element berisi iframe yang mengirimkan informasi pembayaran dengan aman ke Stripe melalui koneksi HTTPS. Alamat halaman checkout juga harus dimulai dengan https:// bukan http:// agar integrasi Anda dapat berfungsi.
Anda dapat mencoba integrasi tanpa menggunakan HTTPS. Aktifkan bila Anda siap menerima pembayaran live.
Serahkan PaymentMethod ke server AndaSisi client
Jika PaymentMethod berhasil dibuat, kirim identifikasinya ke server Anda.
const stripePaymentMethodHandler = async (result) => { if (result.error) { // Show error in payment form } else { // Otherwise send paymentMethod.id to your server (see Step 4) const res = await fetch('/pay', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ payment_method_id: result.paymentMethod.id, }), }) const paymentResponse = await res.json(); // Handle server response (see Step 4) handleServerResponse(paymentResponse); } }
Buat PaymentIntentSisi server
Siapkan endpoint di server Anda untuk menerima permintaan. Endpoint ini juga akan digunakan kemudian untuk menangani kartu yang membutuhkan langkah autentikasi tambahan.
Buat PaymentIntent baru dengan identifikasi PaymentMethod yang dibuat pada client Anda. Anda dapat mengonfirmasi PaymentIntent dengan mengatur properti confirm ke true bila PaymentIntent dibuat atau dengan memanggil confirm setelah pembuatan. Pisahkan otorisasi dan penarikan juga didukung untuk pembayaran kartu.
Jika pembayaran memerlukan tindakan tambahan, seperti autentikasi 3D Secure, status PaymentIntent akan diatur ke requires_
. Jika pembayaran gagal, status diatur kembali ke requires_
dan Anda harus menampilkan kesalahan kepada pengguna. Jika pembayaran tidak memerlukan autentikasi tambahan maka charge akan dibuat dan status PaymentIntent diatur ke succeeded
.
Catatan
Pada versi API sebelum 2019-02-11, requires_
muncul sebagai requires_
dan requires_
muncul sebagai requires_
.
Jika Anda ingin menyimpan kartu untuk digunakan kembali nanti, buat Customer untuk menyimpan PaymentMethod dan teruskan parameter tambahan berikut saat membuat PaymentIntent:
- customer. Diatur ke identifikasi Pelanggan.
- setup_future_usage. Atur ke
off_
untuk memberi tahu Stripe bahwa Anda berencana untuk menggunakan kembali PaymentMethod ini untuk pembayaran di luar sesi saat pelanggan Anda tidak ada. Mengatur properti ini akan menyimpan PaymentMethod ke Pelanggan setelah PaymentIntent dikonfirmasi dan setiap tindakan yang dibutuhkan dari pengguna telah selesai. Lihat sampel kode tentang menyimpan kartu setelah pembayaran untuk detail selengkapnya.session
Tangani tindakan berikutnyaSisi client
Tulis kode untuk menangani situasi yang mengharuskan intervensi pelanggan Anda. Pembayaran biasanya berhasil setelah Anda mengonfirmasikannya pada server di langkah 4. Namun, bila PaymentIntent memerlukan tindakan tambahan dari pelanggan, seperti melakukan autentikasi dengan 3D Secure, kode ini ikut berperan.
Gunakan stripe.handleCardAction untuk memicu UI agar menangani tindakan pelanggan. Jika autentikasi berhasil, status PaymentIntent requires_
. Konfirmasikan kembali PaymentIntent di server Anda untuk menyelesaikan pembayaran.
Saat mencoba, gunakan nomor kartu percobaan yang memerlukan autentikasi (misalnya, ) untuk memaksa alur ini. Menggunakan kartu yang tidak memerlukan autentikasi (misalnya, ) akan melompati bagian alur ini dan diselesaikan di langkah 4.
const handleServerResponse = async (response) => { if (response.error) { // Show error from server on payment form } else if (response.requires_action) { // Use Stripe.js to handle the required card action const { error: errorAction, paymentIntent } = await stripe.handleCardAction(response.payment_intent_client_secret); 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 } }
Catatan
stripe.
mungkin perlu waktu beberapa detik untuk menyelesaikannya. Sambil menunggu, nonaktifkan formulir Anda agar tidak diserahkan ulang dan tampilkan indikator menunggu seperti spinner. Jika Anda menerima kesalahan, tampilkan kepada pelanggan, aktifkan kembali formulir, dan sembunyikan indikator menunggu. Jika pelanggan harus melakukan langkah tambahan untuk menyelesaikan pembayaran, seperti autentikasi, Stripe.js akan memandu mereka menjalani proses itu.
Konfirmasikan lagi PaymentIntentSisi server
Kode ini hanya dieksekusi bila pembayaran memerlukan autentikasi tambahan—sama seperti penanganan di langkah sebelumnya. Kode ini sendiri tidak bersifat opsional karena pembayaran dapat memerlukan langkah ekstra ini.
Dengan menggunakan endpoint yang sama dengan yang Anda siapkan di di atas, konfirmasikan lagi PaymentIntent untuk memfinalisasi pembayaran dan penuhi pesanan. Pastikan konfirmasi ini terjadi dalam waktu satu jam sejak upaya pembayaran. Jika tidak, pembayaran akan gagal dan bertransisi kembali ke requires_
.
Coba integrasi
Beberapa kartu percobaan tersedia untuk Anda gunakan di sandbox guna memastikan integrasi ini siap. Gunakan bersama CVC dan tanggal kedaluwarsa di masa mendatang.
Nomor | Keterangan |
---|---|
Berhasil dan segera memproses pembayaran. | |
Memerlukan autentikasi. Stripe memicu modal yang meminta pelanggan untuk mengautentikasi. | |
Selalu gagal dengan kode tolakan insufficient_ . |
Untuk daftar lengkap kartu percobaan, lihat panduan kami mengenai percobaan.