Cara Menambahkan Pembayaran ke Aplikasi: Checkout, Langganan, dan Webhook
Cara termudah menambahkan pembayaran ke aplikasi kamu adalah Stripe: gunakan Payment Link jika kamu hanya butuh tombol "Beli" dan bisa mengurus pesanan secara manual; Stripe Checkout jika aplikasi kamu perlu tahu siapa yang membayar dan bereaksi secara otomatis; dan Checkout dalam mode langganan plus portal pelanggan Stripe untuk tagihan berulang. Di setiap kasus selain yang paling sederhana, kamu juga memerlukan webhook — endpoint server yang dipanggil Stripe saat pembayaran berhasil — dan kamu sebaiknya menguji semuanya dengan key uji dan kartu uji Stripe sebelum beralih ke key live.
Panduan ini menjelaskan setiap pilihan, bagian webhook yang sering dilewatkan oleh tutorial, dan hal-hal yang perlu diperiksa sebelum menerima uang sungguhan. Detail Stripe berasal dari dokumentasi Stripe sendiri per September 2026.
Mengapa menggunakan penyedia pembayaran
Jangan pernah mengumpulkan nomor kartu di formulir kamu sendiri. Menangani data kartu mentah membuatmu masuk ke cakupan PCI DSS (standar keamanan industri kartu) dan merupakan risiko besar. Penyedia pembayaran seperti Stripe menghosting formulir pembayaran, menyimpan kartu, menangani autentikasi bank, dan memberi tahu aplikasi kamu hasilnya. Aplikasi kamu hanya melihat "pelanggan X membayar Y".
Panduan ini memakai Stripe karena banyak dipakai, terdokumentasi dengan baik, dan didukung oleh sebagian besar AI app builder. Ada penyedia lain, dan sebagian bertindak sebagai "merchant of record" yang menangani pajak penjualan untukmu; jika kepatuhan pajak menjadi kekhawatiran, model itu layak dibandingkan.
Tiga cara menerima pembayaran dengan Stripe
| Pilihan | Kode yang dibutuhkan | Aplikasi kamu tahu siapa yang membayar? | Cocok untuk |
|---|---|---|---|
| Payment Link | Tidak ada | Hanya jika kamu menambahkan webhook | Menjual beberapa produk tetap, donasi, menguji minat pasar |
| Checkout (sekali bayar) | Kode server untuk membuat sesi | Ya, lewat webhook | Toko, unduhan berbayar, pembelian satu kali |
| Checkout (langganan) | Kode server plus penanganan webhook | Ya, lewat webhook | SaaS, keanggotaan, apa pun yang berulang |
Payment Link
Payment Link adalah halaman pembayaran yang dihosting Stripe, yang kamu buat di Dashboard Stripe tanpa kode. Kamu mendapat URL yang bisa kamu pasang di balik tombol di aplikasi kamu, bagikan lewat email, atau tampilkan sebagai kode QR. Dokumentasi Stripe menyatakan Payment Link bisa menjual produk, langganan, atau menerima donasi, dan kamu bisa membiarkan pelanggan memilih apa yang dibayar atau membatasi jumlah pembelian.
Kekurangannya: aplikasi kamu tidak otomatis tahu bahwa pengguna tertentu yang sudah login telah membayar. Untuk halaman donasi atau toko kecil tempat kamu memenuhi pesanan secara manual dari notifikasi email Stripe, itu tidak masalah. Untuk "bayar untuk membuka fitur Pro", itu tidak cukup.
Stripe Checkout
Checkout adalah halaman pembayaran yang dibuat server kamu saat dibutuhkan untuk pembelian tertentu. Server kamu memberi tahu Stripe apa yang dibeli (dan opsional siapa pembelinya), Stripe mengembalikan URL, dan kamu mengirim pelanggan ke sana. Dokumentasi Stripe menjelaskan bahwa Checkout mendukung pembayaran sekali maupun langganan, sebagai halaman penuh yang dihosting Stripe, halaman yang disematkan di situsmu, atau formulir tertanam.
Alurnya:
- Pelanggan mengklik Beli di aplikasi kamu.
- Server kamu membuat Checkout Session menggunakan secret key kamu, termasuk ID yang menautkannya ke pengguna atau pesanan kamu.
- Pelanggan dialihkan ke Stripe dan membayar.
- Stripe mengalihkan mereka kembali ke halaman sukses kamu.
- Stripe mengirim event
checkout.session.completedke webhook kamu, dan server kamu menandai pesanan lunas atau membuka akses.
Langkah 2 harus terjadi di server, karena menggunakan secret key kamu. Itulah alasan utama Checkout membutuhkan backend.
Langganan
Langganan menggunakan Checkout dalam mode langganan dengan harga berulang yang kamu atur di Stripe. Pembayaran pertama bekerja seperti alur di atas. Setelah itu, perpanjangan, kartu yang gagal, peningkatan di tengah siklus, dan pembatalan terjadi seiring waktu — sering kali ketika pelanggan sudah tidak berada di aplikasi kamu — sehingga aplikasi kamu hanya mengetahuinya lewat webhook.
Untuk membiarkan pelanggan mengelola langganan mereka sendiri, Stripe menawarkan portal pelanggan yang dihosting. Menurut dokumentasi Stripe, pelanggan dapat memperbarui metode pembayaran dan detail tagihan, mengubah atau membatalkan langganan, serta melihat dan mengunduh invoice di sana. Kamu mengonfigurasinya di Dashboard Stripe dan menambahkan tombol "Kelola tagihan" yang mengirim pelanggan ke sana. Ini menghemat waktu karena kamu tidak perlu membangun layar-layar itu sendiri.
Webhook: bagian yang tidak boleh dilewati
Webhook adalah permintaan HTTP yang dikirim Stripe ke server kamu saat sesuatu terjadi. (Lihat apa itu webhook untuk ide umumnya.) Panduan pemenuhan Stripe menegaskan: kamu tidak bisa hanya mengandalkan halaman sukses untuk memenuhi pesanan, karena pelanggan bisa membayar lalu kehilangan koneksi sebelum halaman itu dimuat. Untuk langganan dan metode pembayaran tertunda, webhook wajib.
Event yang perlu ditangani
| Event | Artinya | Yang dilakukan aplikasi kamu |
|---|---|---|
checkout.session.completed | Checkout selesai | Tandai pesanan lunas atau mulai akses |
checkout.session.async_payment_succeeded | Metode tertunda (seperti debit bank) berhasil kemudian | Penuhi sekarang |
checkout.session.async_payment_failed | Pembayaran tertunda itu gagal | Beri tahu pelanggan; jangan penuhi |
invoice.paid | Pembayaran langganan berhasil, termasuk perpanjangan | Perpanjang akses |
invoice.payment_failed | Perpanjangan gagal | Peringatkan pengguna; Stripe mungkin mencoba lagi |
customer.subscription.updated | Paket berubah, atau pembatalan dijadwalkan | Perbarui paket pengguna |
customer.subscription.deleted | Langganan berakhir | Hapus akses berbayar |
Aturan untuk handler webhook yang benar
Ini langsung dari dokumentasi webhook Stripe, dan handler yang dibuat AI kadang melewatkan salah satunya:
- Verifikasi tanda tangan. Setiap event menyertakan header
Stripe-Signature. Handler kamu memeriksanya menggunakan signing secret endpoint (diawaliwhsec_). Tanpa ini, siapa pun bisa mengirim "pembayaran berhasil" palsu ke server kamu. - Gunakan body permintaan mentah. Pemeriksaan tanda tangan gagal jika framework kamu mengurai atau mengubah body terlebih dahulu.
- Kembalikan respons 2xx dengan cepat, lalu kerjakan tugas yang lebih lambat. Timeout dihitung sebagai kegagalan.
- Tangani duplikat. Stripe mungkin mengirim event yang sama lebih dari sekali. Catat ID event yang sudah diproses, atau buat pemenuhan aman jika dijalankan dua kali.
- Jangan berasumsi urutan. Stripe tidak menjamin event tiba sesuai urutan kejadiannya.
- Bersiap untuk percobaan ulang. Dalam mode live, Stripe mencoba ulang pengiriman yang gagal hingga tiga hari, jadi gangguan singkat tidak menghilangkan pembayaran — tetapi handler kamu harus bisa menangani event yang terlambat.
Webhook membutuhkan alamat HTTPS publik, jadi biasanya hanya berfungsi setelah aplikasi kamu dipublikasikan (CLI Stripe dapat meneruskan event ke mesin lokal untuk pengembang).
Satu prompt yang mencakup seluruh alur
Tambahkan pembelian sekali bayar dengan Stripe Checkout untuk "Pro pack" (ID harga di STRIPE_PRICE_ID). Buat Checkout Session di server menggunakan STRIPE_SECRET_KEY dari secret, dan sertakan ID pengguna yang sedang login di session. Tambahkan endpoint POST /api/stripe/webhook yang memverifikasi tanda tangan Stripe dengan STRIPE_WEBHOOK_SECRET menggunakan body permintaan mentah, menangani checkout.session.completed, dan menandai pengguna itu sebagai memiliki Pro pack. Pastikan aman jika event yang sama tiba dua kali. Tambahkan halaman sukses dan batal. Jangan pernah menampilkan secret key ke browser.
Untuk langganan, tambahkan: "Gunakan mode langganan dengan STRIPE_PRICE_ID. Tangani invoice.paid, invoice.payment_failed, customer.subscription.updated, dan customer.subscription.deleted. Tambahkan tombol Kelola tagihan yang membuka portal pelanggan Stripe."
Mode uji
Stripe memiliki lingkungan sandbox (uji) dan live terpisah dengan key yang berbeda. Key sandbox diawali pk_test_, sk_test_, atau rk_test_; key live diawali pk_live_, sk_live_, atau rk_live_. Transaksi uji tidak memindahkan uang.
Kartu uji yang berguna dari dokumentasi pengujian Stripe (tanggal kedaluwarsa di masa depan apa pun, CVC tiga digit apa pun):
| Nomor kartu | Hasil |
|---|---|
4242 4242 4242 4242 | Pembayaran berhasil |
4000 0000 0000 0002 | Kartu ditolak |
4000 0000 0000 3220 | Membutuhkan autentikasi 3D Secure, lalu berhasil |
Uji setidaknya:
- Pembayaran yang berhasil membuka hal yang tepat untuk pengguna yang tepat
- Kartu yang ditolak menampilkan pesan yang jelas dan tidak membuka apa pun
- Menutup tab browser tepat setelah membayar tetap memberikan akses (ini membuktikan webhook bekerja, bukan hanya halaman sukses)
- Membatalkan di halaman Stripe mengembalikan pengguna ke aplikasi kamu tanpa ada tagihan
- Untuk langganan: batalkan di portal pelanggan dan pastikan akses berakhir pada waktunya
Go live
- Aktifkan akun Stripe kamu dengan detail bisnis dan rekening bank.
- Ganti dengan key live di secret aplikasi kamu. Stripe merekomendasikan restricted key dengan hanya izin yang dibutuhkan integrasi kamu, bukan secret key tanpa batasan.
- Buat endpoint webhook live yang mengarah ke aplikasi kamu yang sudah dipublikasikan. Endpoint ini punya signing secret sendiri, berbeda dari yang uji — perbarui.
- Buat ulang produk dan harga dalam mode live; ID dari mode uji tidak ada di sana.
- Lakukan satu pembelian kecil yang sungguhan dan refund.
Simpan setiap key di secret proyek kamu, jangan pernah di kode atau chat. Checklist keamanan kami membahas key dan verifikasi webhook lebih detail.
Pajak, refund, dan administrasi
Pembayaran membawa kewajiban yang tidak bisa diselesaikan oleh kode. Ini bukan nasihat pajak; konsultasikan dengan akuntan.
- Pajak penjualan, PPN, dan GST. Tergantung di mana kamu dan pelangganmu berada, kamu mungkin perlu mendaftar, memungut, dan melaporkan pajak. Stripe Tax dapat menghitung dan memungut pajak saat checkout, memantau di mana penjualanmu mungkin menimbulkan kewajiban, dan membantu pendaftaran serta pelaporan — tetapi tanggung jawab tetap padamu. Penyedia merchant-of-record adalah alternatif yang mengambil lebih banyak bagian ini.
- Refund dan sengketa. Tentukan kebijakan refund sebelum peluncuran dan tampilkan di situsmu. Sengketa (chargeback) terjadi; simpan catatan tentang apa yang dibeli dan dikirim.
- Kuitansi dan invoice. Stripe bisa mengirim kuitansi lewat email; bisnis mungkin membutuhkan invoice yang layak.
- Biaya. Setiap penyedia mengenakan biaya per transaksi. Periksa halaman harga terkini penyedia daripada mengandalkan angka di artikel.
Pengaturan mana yang cocok untuk aplikasimu
- Donasi atau beberapa produk saja: Payment Link. Lihat cara membangun situs donasi nirlaba.
- Toko dengan keranjang belanja: Checkout dengan line item dan webhook. Lihat cara membangun toko online.
- SaaS atau keanggotaan: Checkout dalam mode langganan, webhook, dan portal pelanggan. Lihat cara membangun MVP SaaS dan cara menetapkan harga produk SaaS.
- Marketplace yang membayar penjual: pengaturan yang berbeda dan lebih diatur (Stripe Connect atau sejenisnya). Rencanakan secara terpisah.
Menambahkan pembayaran di Mythex
Pembayaran di aplikasi yang kamu buat di Mythex menggunakan akun Stripe dan key milikmu sendiri; tidak ada koneksi Stripe satu klik untuk aplikasi kamu. Alurnya biasanya:
- Dapatkan key uji Stripe.
- Tambahkan
STRIPE_SECRET_KEY(dan webhook secret nanti) ke secret proyek — lewat/secrets, pengaturan proyek, atau kartu secret yang ditampilkan agent saat membutuhkan key. - Minta agent untuk Checkout dengan prompt seperti di atas.
- Uji di Preview dengan kartu uji. Publikasikan sebelum mendaftarkan webhook, karena webhook membutuhkan URL publikmu.
- Setelah beralih ke key live, publikasikan lagi agar aplikasi live memakai key tersebut.
Lihat Terima pembayaran dengan Stripe dan Tangani webhook di backend kamu di dokumentasi.
Pertanyaan
Apa cara termudah untuk menerima pembayaran di aplikasi?
Payment Link Stripe tidak memerlukan kode: kamu membuatnya di Dashboard Stripe dan menautkannya dari aplikasi kamu. Jika aplikasi kamu perlu tahu siapa yang membayar dan membuka sesuatu secara otomatis, gunakan Stripe Checkout dengan webhook.
Apakah saya membutuhkan webhook untuk menerima pembayaran?
Jika aplikasi kamu harus bereaksi terhadap pembayaran — membuka akun, menandai pesanan lunas, menangani perpanjangan — maka ya. Dokumentasi Stripe menyatakan bahwa kamu tidak boleh hanya mengandalkan halaman sukses, karena pelanggan bisa saja membayar tanpa pernah sampai ke halaman itu. Webhook juga wajib untuk langganan.
Bagaimana cara menguji pembayaran tanpa uang sungguhan?
Gunakan API key sandbox (uji) Stripe dan nomor kartu uji mereka, seperti 4242 4242 4242 4242 dengan tanggal kedaluwarsa di masa depan dan CVC tiga digit apa pun. Transaksi uji tidak memindahkan uang sungguhan.
Apakah Stripe mengurus pajak penjualan atau PPN untuk saya?
Stripe Tax dapat menghitung dan memungut pajak saat checkout serta memantau di mana kamu mungkin perlu mendaftar, tetapi kamu tetap bertanggung jawab atas kewajiban pajakmu. Konsultasikan dengan akuntan untuk situasimu.