Lewati ke konten
Buat akun
atau
Masuk
Logo Dokumen Stripe
/
Tanya AI
Buat akun
Masuk
Mulai
Pembayaran
Pendapatan
Platform dan situs belanja online
Manajemen uang
Sumber daya pengembang

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:

Bermigrasi?

Jika Anda memigrasikan integrasi Stripe yang ada dari Charges API, ikuti panduan migrasi.

  • 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:

Command Line
Ruby
# Available as a gem sudo gem install stripe
Gemfile
Ruby
# If you use bundler, you can add this line to your Gemfile gem 'stripe'

Kumpulkan detail kartu
Sisi 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.

Sertakan skrip Stripe.js di bagian kepala setiap halaman pada situs Anda. Elements tersedia secara otomatis sebagai fitur Stripe.js.

<script src="https://js.stripe.com/basil/stripe.js"></script>

Penyertaan skrip pada setiap halaman situs memungkinkan Anda memanfaatkan fungsionalitas penipuan lanjutan Stripe dan kemampuan untuk mendeteksi perilaku penelusuran yang tidak wajar.

Buat formulir pembayaran

Untuk mengumpulkan detail kartu dengan aman dari pelanggan, Elements membuatkan Anda komponen UI yang di-hosting oleh Stripe. Komponen kemudian dimasukkan ke dalam formulir pembayaran Anda sebagai iframe. Untuk menentukan tempat memasukkan komponen ini, buat elemen (kontainer) DOM kosong dengan identifikasi unik dalam formulir pembayaran Anda.

index.html
HTML
<form id='payment-form'> <label> Card details <!-- placeholder for Elements --> <div id="card-element"></div> </label> <button type="submit">Submit Payment</button> </form>

Berikutnya, buat instance objek Stripe, yang menyediakan kunci API yang dapat dipublikasikan kepada Anda sebagai parameter pertama. Setelah itu, buat instance objek Elements dan gunakan untuk memasang elemen Card di placeholder yang relevan pada halaman.

script.js
Lihat sampel lengkap
const stripe = Stripe(
'pk_test_TYooMQauvdEDq54NiTphI7jx'
); const elements = stripe.elements(); // Set up Stripe.js and Elements to use in checkout form const style = { base: { color: "#32325d", fontFamily: '"Helvetica Neue", Helvetica, sans-serif', fontSmoothing: "antialiased", fontSize: "16px", "::placeholder": { color: "#aab7c4" } }, invalid: { color: "#fa755a", iconColor: "#fa755a" }, }; const cardElement = elements.create('card', {style}); cardElement.mount('#card-element');

Element card menyederhanakan formulir dan meminimalkan jumlah bidang yang diperlukan dengan memasukkan satu bidang input fleksibel yang mengumpulkan dengan aman semua detail kartu yang diperlukan.

Jika tidak, gabungkan Elements cardNumber, cardExpiry, dan cardCvc untuk formulir kartu multiinput yang fleksibel.

Catatan

Selalu kumpulkan kode pos untuk meningkatkan rasio persetujuan kartu dan mengurangi penipuan.

Card Element sebaris mengumpulkan dan mengirimkan kode pos pelanggan secara otomatis kepada Stripe. Jika Anda membuat formulir pembayaran dengan Elements (Card Number, Expiry, CVC) terpisah, tambahkan bidang input terpisah untuk kode pos pelanggan.

Buat PaymentMethod

Terakhir, gunakan stripe.createPaymentMethod pada client Anda untuk mengumpulkan detail kartu dan buat PaymentMethod bila pengguna mengklik tombol serahkan.

script.js
const form = document.getElementById('payment-form'); form.addEventListener('submit', async (event) => { // We don't want to let default form submission happen here, // which would refresh the page. event.preventDefault(); const result = await stripe.createPaymentMethod({ type: 'card', card: cardElement, billing_details: { // Include any additional collected billing details. name: 'Jenny Rosen', }, }) stripePaymentMethodHandler(result); });

Serahkan PaymentMethod ke server Anda
Sisi client

Jika PaymentMethod berhasil dibuat, kirim identifikasinya ke server Anda.

script.js
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 PaymentIntent
Sisi 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_action. Jika pembayaran gagal, status diatur kembali ke requires_payment_method 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_payment_method muncul sebagai requires_source dan requires_action muncul sebagai requires_source_action.

Command Line
curl
curl https://api.stripe.com/v1/payment_intents \ -u
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:
\ -d "payment_method"="{{PAYMENT_METHOD_ID}}" \ -d "amount"=1099 \ -d "currency"="usd" \ -d "confirmation_method"="manual" \ -d "confirm"="true"

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_session 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.

Tangani tindakan berikutnya
Sisi 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_confirmation. 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.

script.js
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.handleCardAction 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 PaymentIntent
Sisi 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_payment_method.

Command Line
curl
curl https://api.stripe.com/v1/payment_intents/{{PAYMENT_INTENT_ID}}/confirm \ -u
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:
\ -X "POST"

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.

NomorKeterangan
Berhasil dan segera memproses pembayaran.
Memerlukan autentikasi. Stripe memicu modal yang meminta pelanggan untuk mengautentikasi.
Selalu gagal dengan kode tolakan insufficient_funds.

Untuk daftar lengkap kartu percobaan, lihat panduan kami mengenai percobaan.

OpsionalKumpulkan kembali CVC

Apakah halaman ini membantu?
YaTidak
  • Butuh bantuan? Hubungi Tim CS.
  • Bergabunglah dengan program akses awal kami.
  • Lihat log perubahan kami.
  • Ada pertanyaan? Hubungi Bagian Penjualan.
  • LLM? Baca llms.txt.
  • Dijalankan oleh Markdoc