Lewati ke konten
Buat akun atau Masuk
Logo Dokumen Stripe
/
Tanya AI
Buat akunMasuk
Mulai
Pembayaran
Pendapatan
Platform dan situs belanja online
Manajemen uang
Sumber daya pengembang
API & SDKBantuan
Gambaran Umum
Tentang pembayaran Stripe
    Gambaran umum
    Terima pembayaran
    Mata uang
    Penolakan
    Payout
    Pembayaran rutin
    Autentikasi 3D Secure
    Kembalikan dana dan batalkan pembayaran
    Saldo dan waktu pelunasan
    Resi
    Tangani kejadian webhook
    Kesiapan SCA
    API lama
Upgrade integrasi Anda
Analitik pembayaran
Pembayaran online
Gambaran umumTemukan contoh penggunaan AndaGunakan Managed Payments
Gunakan Payment Links
Gunakan halaman checkout bawaan
Buat integrasi kustom dengan Elements
Bangun integrasi dalam aplikasi
Pembayaran di tempat
Terminal
Metode Pembayaran
Tambahkan metode pembayaran
Kelola metode pembayaran
Checkout lebih cepat dengan Link
Skenario pembayaran
Tangani beberapa mata uang
Alur pembayaran custom
Akuisisi fleksibel
Orkestrasi
Di luar pembayaran
Dirikan perusahaan Anda
Kripto
Perdagangan agen
Financial Connections
Climate
Pahami penipuan
Perlindungan penipuan Radar
Kelola sengketa
Verifikasikan identitas
Amerika Serikat
Bahasa Indonesia
BerandaPembayaranAbout Stripe payments

Terima pembayaran

Terima pembayaran dengan aman secara online.

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

Buat halaman checkout pada situs web Anda menggunakan Stripe Elements dan Sesi Checkout, sebuah integrasi yang mengelola pajak, diskon, tarif pengiriman, serta hal lainnya.

Lokasi pelanggan
Ukuran
Tema
Tata letak
Demo ini hanya menampilkan Google Pay atau Apple Pay jika Anda memiliki kartu aktif dengan salah satu dompet.

Siapkan server
Sisi server

Sebelum memulai, Anda perlu mendaftar untuk akun Stripe.

Gunakan pustaka Stripe resmi untuk mengakses API dari aplikasi Anda.

Command Line
Node.js
Ruby
PHP
Python
Go
.NET
Java
No results
npm install stripe@18.0.0 --save

Atur SDK untuk menggunakan minimal versi API2025-03-31.basil.

TypeScript
Node.js
Ruby
PHP
Python
Go
.NET
Java
No results
// Set your secret key. Remember to switch to your live secret key in production. // See your keys here: https://dashboard.stripe.com/apikeys import Stripe from 'stripe'; const stripe = new Stripe(
'sk_test_BQokikJOvBiI2HlWgH4olfQ2'
, { apiVersion: '2025-03-31.basil' as any, });

Buat Sesi Checkout
Sisi server

Tambahkan endpoint pada server yang membuat Sesi Checkout dan mengembalikan client secret ke frontend Anda. Sesi Checkout mewakili sesi pelanggan Anda saat mereka membayar langganan atau pembelian satu kali. Sesi Checkout akan kedaluwarsa dalam waktu 24 jam setelah pembuatan.

server.ts
TypeScript
Node.js
Ruby
PHP
Python
Go
.NET
Java
No results
import express, {Express} from 'express'; const app: Express = express(); app.post('/create-checkout-session', async (req: Express.Request, res: Express.Response) => { const session = await stripe.checkout.sessions.create({ line_items: [ { price_data: { currency: 'usd', product_data: { name: 'T-shirt', }, unit_amount: 2000, }, quantity: 1, }, ], mode: 'payment', ui_mode: 'custom', // The URL of your payment completion page return_url: 'https://example.com/return?session_id={CHECKOUT_SESSION_ID}' }); res.json({checkoutSessionClientSecret: session.client_secret}); }); app.listen(3000, () => { console.log('Running on port 3000'); });

Siapkan frontend
Sisi client

Sertakan skrip Stripe.js pada halaman checkout dengan menambahkannya ke head file HTML Anda. Selalu muat Stripe.js secara langsung dari js.stripe.com agar tetap mematuhi PCI. Jangan menyertakan skrip dalam paket atau meng-hosting sendiri salinannya.

Ensure you’re on the latest Stripe.js version by including the following script tag <script src=“https://js.stripe.com/clover/stripe.js”></script>. Learn more about Stripe.js versioning.

checkout.html
<head> <title>Checkout</title> <script src="https://js.stripe.com/clover/stripe.js"></script> </head>

Catatan

Stripe menyediakan paket npm yang dapat Anda gunakan untuk memuat Stripe.js sebagai modul. Lihat proyek di GitHub. Versi 7.0.0 atau yang lebih baru diperlukan.

Inisialisasikan stripe.js.

checkout.js
// Set your publishable key: remember to change this to your live publishable key in production // See your keys here: https://dashboard.stripe.com/apikeys const stripe = Stripe(
'pk_test_TYooMQauvdEDq54NiTphI7jx'
, );

Inisialisasikan Checkout
Sisi client

Buat clientSecret baik sebagai promise yang menghasilkan client secret atau tetapkan langsung sebagai secret. Panggil initCheckout, dengan menyertakan clientSecret. initCheckout akan mengembalikan sebuah promise yang menghasilkan sebuah instance Checkout.

Objek checkout berfungsi sebagai dasar halaman checkout Anda, dan berisi data dari Sesi Checkout dan metode untuk memperbarui Sesi.

Objek yang dikembalikan oleh actions.getSession() berisi informasi harga Anda. Kami menyarankan untuk membaca dan menampilkan total, dan lineItems dari sesi di UI Anda.

Hal ini memungkinkan Anda untuk mengaktifkan fitur-fitur baru dengan perubahan kode yang minimal. Sebagai contoh, menambahkan harga mata uang manual tidak memerlukan perubahan UI jika Anda menampilkan total.

checkout.js
const clientSecret = fetch('/create-checkout-session', {method: 'POST'}) .then((response) => response.json()) .then((json) => json.checkoutSessionClientSecret); const checkout = stripe.initCheckout({clientSecret}); const loadActionsResult = await checkout.loadActions(); if (loadActionsResult.type === 'success') { const session = loadActionsResult.actions.getSession(); const checkoutContainer = document.getElementById('checkout-container'); checkoutContainer.append(JSON.stringify(session.lineItems, null, 2)); checkoutContainer.append(document.createElement('br')); checkoutContainer.append(`Total: ${session.total.total.amount}`); }
index.html
<div id="checkout-container"></div>

Kumpulkan email pelanggan
Sisi client

Jika Anda sudah meneruskan customer_email atau Pelanggan yang ada dengan email valid yang diatur ketika membuat Sesi Checkout, Anda dapat melewati langkah ini.

Jika mengimplementasikan validasi email sendiri, Anda dapat meneruskan email yang divalidasi pada checkout.confirm dan melewati langkah ini.

Buat input email untuk mengumpulkan alamat email pelanggan Anda. Panggil updateEmail bila pelanggan Anda menyelesaikan input untuk memvalidasi dan menyimpan alamat email.

Tergantung desain formulir checkout, Anda dapat memanggil updateEmail dengan cara berikut:

  • Secara langsung sebelum menyerahkan pembayaran. Anda juga dapat memanggil updateEmail untuk memvalidasi lebih awal, seperti pada input yang mengabur.
  • Sebelum bertransisi ke langkah berikutnya, seperti mengeklik tombol Simpan, jika formulir Anda menyertakan beberapa langkah.
index.html
<input type="text" id="email" /> <div id="email-errors"></div>
checkout.js
const checkout = stripe.initCheckout({clientSecret}); const loadActionsResult = await checkout.loadActions(); if (loadActionsResult.type === 'success') { const {actions} = loadActionsResult; const emailInput = document.getElementById('email'); const emailErrors = document.getElementById('email-errors'); emailInput.addEventListener('input', () => { // Clear any validation errors emailErrors.textContent = ''; }); emailInput.addEventListener('blur', () => { const newEmail = emailInput.value; actions.updateEmail(newEmail).then((result) => { if (result.error) { emailErrors.textContent = result.error.message; } }); }); }

Kumpulkan detail pembayaran
Sisi client

Kumpulkan detail pembayaran pada client dengan Payment Element. Payment Element adalah komponen UI siap-rakit yang menyederhanakan pengumpulan detail pembayaran untuk berbagai metode pembayaran.

Pertama, buat elemen DOM kontainer untuk memasang Payment Element. Kemudian buat instance Payment Element menggunakan checkout.createPaymentElement dan pasang dengan memanggil element.mount, yang menyediakan pemilih CSS atau elemen DOM kontainer.

index.html
<div id="payment-element"></div>
checkout.js
const paymentElement = checkout.createPaymentElement(); paymentElement.mount('#payment-element');

Lihat dokumen Stripe.js untuk melihat opsi yang didukung.

Anda dapat menyesuaikan penampilan semua Elements dengan meneruskan elementsOptions.appearance ketika menginisialisasi Checkout pada frontend.

Serahkan pembayaran
Sisi client

Tampilkan tombol Bayar yang memanggil confirm dari instance checkout untuk mengirimkan pembayaran.

index.html
<button id="pay-button">Pay</button> <div id="confirm-errors"></div>
checkout.js
const checkout = stripe.initCheckout({clientSecret}); const loadActionsResult = await checkout.loadActions(); if (loadActionsResult.type === 'success') { const {actions} = loadActionsResult; const button = document.getElementById('pay-button'); const errors = document.getElementById('confirm-errors'); button.addEventListener('click', () => { // Clear any validation errors errors.textContent = ''; actions.confirm().then((result) => { if (result.type === 'error') { errors.textContent = result.error.message; } }); }); }

Uji integrasi Anda

  1. Arahkan ke halaman checkout Anda.
  2. Isilah detail pembayaran dengan metode pembayaran dari tabel berikut. Untuk pembayaran kartu:
    • Masukkan tanggal mendatang untuk tanggal kedaluwarsa kartu.
    • Masukkan nomor 3 angka untuk CVC.
    • Masukkan kode pos tagihan.
  3. Serahkan pembayaran ke Stripe.
  4. Buka Dashboard dan cari pembayaran pada halaman Transaksi. Jika pembayaran berhasil, Anda akan melihatnya dalam daftar tersebut.
  5. Klik pembayaran Anda untuk melihat detail selengkapnya, seperti informasi tagihan dan daftar barang yang dibeli. Anda dapat menggunakan informasi ini untuk memenuhi pesanan.
Nomor kartuSkenarioCara mencoba
Pembayaran kartu berhasil dan tidak memerlukan autentikasi.Isilah formulir kartu kredit menggunakan nomor kartu kredit dengan sembarang tanggal kedaluwarsa, CVC, dan kode pos.
Pembayaran kartu memerlukan autentikasi.Isilah formulir kartu kredit menggunakan nomor kartu kredit dengan sembarang tanggal kedaluwarsa, CVC, dan kode pos.
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.
Kartu UnionPay memiliki panjang variabel 13–19 angka.Isilah formulir kartu kredit menggunakan nomor kartu kredit dengan sembarang tanggal kedaluwarsa, CVC, dan kode pos.

Lihat Pengujian untuk mendapatkan informasi tambahan untuk menguji integrasi Anda.

OpsionalBuat produk dan harga

Biar pelanggan yang memutuskan apa yang akan dibayar

Anda dapat menyiapkan Sesi Checkout Anda untuk menerima tip dan donasi, atau menjual produk dan layanan bayar sesuai keinginan.

Sebelum membuat Sesi Checkout, Anda dapat membuat Produk dan Harga terlebih dahulu. Gunakan produk untuk mewakili barang fisik atau tingkat layanan yang berbeda, dan Harga untuk mewakili harga setiap produk.

Misalnya, Anda dapat membuat kaus pendek sebagai produk dengan harga 20 USD. Hal ini memungkinkan Anda memperbarui dan menambahkan harga tanpa perlu mengubah detail produk pokok. Anda dapat membuat produk dan harga dengan Dashboard Stripe atau API. Pelajari selengkapnya tentang cara kerja produk dan harga.

API hanya memerlukan name untuk membuat Produk. Checkout menampilkan name, description, dan images produk yang Anda berikan.

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/products \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d name=T-shirt

Berikutnya, buat Harga untuk menentukan jumlah yang akan Anda charge untuk produk Anda. Hal ini termasuk biaya produk dan mata uang yang digunakan.

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/prices \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d product=
"{{PRODUCT_ID}}"
\ -d unit_amount=2000 \ -d currency=usd

Setiap harga yang dibuat memiliki ID. Saat membuat Sesi Checkout, lihat ID harga dan jumlah. Jika menjual dalam berbagai mata uang, tetapkan Harga multi-currency. Checkout secara otomatis menentukan mata uang lokal pelanggan dan menampilkan mata uang tersebut jika Harga mendukungnya.

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/checkout/sessions \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d ui_mode=custom \ -d mode=payment \ -d "line_items[0][price]"={{PRICE_ID}} \ -d "line_items[0][quantity]"=1 \ --data-urlencode return_url="https://example.com/return?session_id={CHECKOUT_SESSION_ID}"

OpsionalIsi dahulu data pelanggan
Sisi server

Jika Anda sudah mengumpulkan email pelanggan dan ingin otomatis mengisinya di Sesi Checkout untuk mereka, teruskan customer_email ketika membuat Sesi Checkout.

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/checkout/sessions \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ --data-urlencode customer_email="customer@example.com" \ -d ui_mode=custom \ -d mode=payment \ -d "line_items[0][price]"={{PRICE_ID}} \ -d "line_items[0][quantity]"=1 \ --data-urlencode return_url="https://example.com/return?session_id={CHECKOUT_SESSION_ID}"

OpsionalSimpan detail metode pembayaran

Pelajari cara menerima pembayaran dan menyimpan detail pembayaran pelanggan Anda untuk pembelian mendatang.

OpsionalDengarkan perubahan Sesi Checkout

Dengarkan perubahan Sesi Checkout

Anda dapat mendengarkan perubahan pada Sesi Checkout dengan menambahkan listener kejadian pada kejadian change dengan checkout.on.

checkout.js
checkout = stripe.initCheckout({ clientSecret: promise, elementsOptions: { appearance }, }); checkout.on('change', (session) => { // Handle changes to the checkout session });

OpsionalKumpulkan alamat tagihan dan pengiriman

Kumpulkan alamat tagihan

Secara default, Sesi Checkout mengumpulkan detail tagihan minimal yang diperlukan untuk pembayaran melalui Payment Element.

Menggunakan Billing Address Element

Anda dapat mengumpulkan alamat tagihan lengkap menggunakan Billing Address Element.

Pertama, teruskan billing_address_collection=required bila Anda membuat Sesi Checkout.

Buat elemen DOM kontainer untuk memasang Billing Address Element. Kemudian buat instance Billing Address Element menggunakan checkout.createBillingAddressElement dan pasang dengan memanggil element.mount, yang menyediakan pemilih CSS ataupun elemen DOM kontainer.

index.html
<div id="billing-address"></div>
checkout.js
const billingAddressElement = checkout.createBillingAddressElement(); billingAddressElement.mount('#billing-address');

Billing Address Element mendukung opsi berikut:

  • kontak
  • tampilan

Menggunakan formulir custom

Anda dapat membuat formulir sendiri untuk mengumpulkan alamat tagihan.

  • Jika halaman checkout Anda memiliki langkah pengumpulan alamat yang berbeda sebelum konfirmasi, panggil updateBillingAddress bila pelanggan Anda menyerahkan alamat.
  • Jika tidak, Anda dapat menyerahkan alamat bila pelanggan mengeklik tombol “bayar” dengan meneruskan billingAddress ke confirm.

Kumpulkan alamat tagihan parsial

Untuk mengumpulkan alamat tagihan parsial, seperti hanya negara dan kode pos, teruskan billing_address_collection=auto.

Ketika mengumpulkan alamat tagihan parsial, Anda harus mengumpulkan alamat secara manual. Secara default, Payment Element secara otomatis mengumpulkan detail tagihan minimal yang diperlukan untuk pembayaran. Untuk menghindari pengumpulan ganda detail tagihan, teruskan fields.billingDetails=never ketika membuat Payment Element. Jika Anda hanya bermaksud mengumpulkan sebagian detail tagihan (seperti nama pelanggan), teruskan never hanya untuk bidang yang ingin Anda kumpulkan sendiri.

Kumpulkan alamat pengiriman

Untuk mengumpulkan alamat pengiriman pelanggan, teruskan parameter shipping_address_collection bila Anda membuat Sesi Checkout.

Saat mengumpulkan alamat pengiriman, Anda juga harus menentukan negara tujuan pengiriman yang dibolehkan. Konfigurasikan properti allowed_countries dengan larik kode negara ISO dua huruf.

Cara menggunakan Shipping Address Element

Anda dapat mengumpulkan alamat pengiriman lengkap dengan Shipping Address Element.

Buat elemen DOM kontainer untuk memasang Shipping Address Element. Kemudian buat instance Shipping Address Element menggunakan checkout.createShippingAddressElement dan pasang dengan memanggil element.mount, yang menyediakan pemilih CSS ataupun elemen DOM kontainer.

index.html
<div id="shipping-address"></div>
checkout.js
const shippingAddressElement = checkout.createShippingAddressElement(); shippingAddressElement.mount('#shipping-address');

Shipping Address Element mendukung opsi berikut:

  • kontak
  • tampilan

Dengarkan perubahan Sesi Checkout

Anda dapat mendengarkan perubahan pada Sesi Checkout dengan menambahkan listener kejadian untuk menangani perubahan terkait alamat.

Gunakan objek Sesi untuk merender jumlah pengiriman di formulir checkout Anda.

index.html
<div> <h3> Totals </h3> <div id="subtotal" ></div> <div id="shipping" ></div> <div id="total" ></div> </div>
checkout.js
const checkout = stripe.initCheckout({clientSecret}); const subtotal = document.getElementById('subtotal'); const shipping = document.getElementById('shipping'); const total = document.getElementById('total'); checkout.on('change', (session) => { subtotal.textContent = `Subtotal: ${session.total.subtotal.amount}`; shipping.textContent = `Shipping: ${session.total.shippingRate.amount}`; total.textContent = `Total: ${session.total.total.amount}`; });

Gunakan formulir custom

Anda dapat membuat formulir sendiri untuk mengumpulkan alamat pengiriman.

  • Jika halaman checkout Anda memiliki langkah pengumpulan alamat yang berbeda sebelum konfirmasi, panggil updateShippingAddress bila pelanggan Anda menyerahkan alamat.
  • Jika tidak, Anda dapat menyerahkan alamat bila pelanggan mengeklik tombol “bayar” dengan meneruskan shippingAddress ke confirm.

OpsionalPisahkan otorisasi dan penarikan
Sisi server

Stripe mendukung pembayaran kartu dua langkah sehingga Anda bisa mengotorisasi kartu terlebih dahulu, lalu mengambil dana di kemudian hari. Ketika Stripe mengotorisasi pembayaran, penerbit kartu menjamin dana dan menahan jumlah pembayaran di kartu pelanggan. Anda kemudian memiliki waktu tertentu untuk menangkap dana, tergantung pada kartunya). Jika Anda tidak menangkap pembayaran sebelum otorisasi berakhir, pembayaran akan dibatalkan dan penerbit akan melepaskan dana yang ditahan.

Memisahkan otorisasi dan penarikan berguna jika Anda perlu mengambil tindakan tambahan antara mengonfirmasi bahwa pelanggan dapat membayar dan menagih pembayaran mereka. Misalnya, jika menjual item dengan stok terbatas, Anda mungkin perlu mengonfirmasi bahwa item yang dibeli oleh pelanggan menggunakan Checkout masih tersedia sebelum menarik pembayaran mereka dan memenuhi pembelian. Lakukan hal ini menggunakan alur kerja berikut:

  1. Konfirmasikan bahwa Stripe mengotorisasi metode pembayaran pelanggan.
  2. Periksa sistem manajemen inventaris Anda untuk mengonfirmasikan bahwa item masih tersedia.
  3. Perbarui sistem manajemen inventaris Anda untuk menandai bahwa pelanggan telah membeli item.
  4. Tarik pembayaran pelanggan.
  5. Informasikan pelanggan Anda bila pembelian mereka berhasil di halaman konfirmasi.

Untuk menunjukkan bahwa Anda ingin memisahkan otorisasi dan penarikan, Anda harus mengatur nilai payment_intent_data.capture_method ke manual ketika membuat Sesi Checkout. Ini menginstruksikan Stripe agar hanya mengotorisasi jumlah pada kartu pelanggan.

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/checkout/sessions \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d "line_items[0][price]"={{PRICE_ID}} \ -d "line_items[0][quantity]"=1 \ -d mode=payment \ -d "payment_intent_data[capture_method]"=manual \ -d return_url={{RETURN_URL}} \ -d ui_mode=custom

Untuk menarik pembayaran yang belum ditarik, Anda dapat menggunakan endpoint Dashboard atau penarikan. Menarik pembayaran secara terprogram memerlukan akses ke PaymentIntent yang dibuat selama Sesi Checkout, yang bisa Anda dapatkan dari objek Session.

OpsionalManajemen akun pelanggan
Tidak ada kode

Biarkan pelanggan mengelola akunnya sendiri dengan membagikan tautan ke portal pelanggan Anda. Portal pelanggan memungkinkan pelanggan masuk dengan email mereka untuk mengelola langganan, memperbarui metode pembayaran, dan lain-lain.

OpsionalPemenuhan pesanan

Pelajari cara mendapatkan notifikasi secara terprogram bila pelanggan membayar.

Lihat juga

  • Tambahkan diskon untuk pembayaran satu kali
  • Pungut pajak
  • Aktifkan kuantitas mata anggaran yang dapat disesuaikan
  • Tambahkan tombol sekali klik
Apakah halaman ini membantu?
YaTidak
  • Butuh bantuan? Hubungi Tim CS.
  • Lihat log perubahan kami.
  • Ada pertanyaan? Hubungi Bagian Penjualan.
  • LLM? Baca llms.txt.
  • Dijalankan oleh Markdoc
Code quickstart
Panduan Terkait
Elements Appearance API
Skenario pembayaran lainnya
Cara kerja kartu