Buat pengalaman checkout yang aman dan dihosting yang menangani alur pembayaran lengkap untuk pembelian satu kali dan langganan dengan kontrol kustomisasi penuh.
Validitas Sesi: Sesi checkout berlaku selama 24 jam secara default. Jika Anda mengirim confirm=true dalam permintaan Anda, sesi hanya akan berlaku selama 15 menit.
import DodoPayments from 'dodopayments';// Initialize the Dodo Payments clientconst client = new DodoPayments({ bearerToken: process.env.DODO_PAYMENTS_API_KEY, environment: 'test_mode', // defaults to 'live_mode'});async function createCheckoutSession() { try { const session = await client.checkoutSessions.create({ // Products to sell - use IDs from your Dodo Payments dashboard product_cart: [ { product_id: 'prod_123', // Replace with your actual product ID quantity: 1 } ], // Pre-fill customer information to reduce friction customer: { email: '[email protected]', name: 'John Doe', phone_number: '+1234567890' }, // Billing address for tax calculation and compliance billing_address: { street: '123 Main St', city: 'San Francisco', state: 'CA', country: 'US', // Required: ISO 3166-1 alpha-2 country code zipcode: '94102' }, // Where to redirect after successful payment return_url: 'https://yoursite.com/checkout/success', // Custom data for your internal tracking metadata: { order_id: 'order_123', source: 'web_app' } }); // Redirect your customer to this URL to complete payment console.log('Checkout URL:', session.checkout_url); console.log('Session ID:', session.session_id); return session; } catch (error) { console.error('Failed to create checkout session:', error); throw error; }}// Example usage in an Express.js routeapp.post('/create-checkout', async (req, res) => { try { const session = await createCheckoutSession(); res.json({ checkout_url: session.checkout_url }); } catch (error) { res.status(500).json({ error: 'Failed to create checkout session' }); }});
Salin
import osfrom dodopayments import DodoPayments# Initialize the Dodo Payments clientclient = DodoPayments( bearer_token=os.environ.get("DODO_PAYMENTS_API_KEY"), # This is the default and can be omitted environment="test_mode", # defaults to "live_mode")def create_checkout_session(): """ Create a checkout session for a single product with customer data pre-filled. Returns the session object containing checkout_url for customer redirection. """ try: session = client.checkout_sessions.create( # Products to sell - use IDs from your Dodo Payments dashboard product_cart=[ { "product_id": "prod_123", # Replace with your actual product ID "quantity": 1 } ], # Pre-fill customer information to reduce checkout friction customer={ "email": "[email protected]", "name": "John Doe", "phone_number": "+1234567890" }, # Billing address for tax calculation and compliance billing_address={ "street": "123 Main St", "city": "San Francisco", "state": "CA", "country": "US", # Required: ISO 3166-1 alpha-2 country code "zipcode": "94102" }, # Where to redirect after successful payment return_url="https://yoursite.com/checkout/success", # Custom data for your internal tracking metadata={ "order_id": "order_123", "source": "web_app" } ) # Redirect your customer to this URL to complete payment print(f"Checkout URL: {session.checkout_url}") print(f"Session ID: {session.session_id}") return session except Exception as error: print(f"Failed to create checkout session: {error}") raise error# Example usage in a Flask routefrom flask import Flask, jsonify, requestapp = Flask(__name__)@app.route('/create-checkout', methods=['POST'])def create_checkout(): try: session = create_checkout_session() return jsonify({"checkout_url": session.checkout_url}) except Exception as error: return jsonify({"error": "Failed to create checkout session"}), 500
Salin
// Direct API call using fetch - useful for any JavaScript environmentasync function createCheckoutSession() { try { const response = await fetch('https://test.dodopayments.com/checkouts', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${process.env.DODO_PAYMENTS_API_KEY}` }, body: JSON.stringify({ // Products to sell - use IDs from your Dodo Payments dashboard product_cart: [ { product_id: 'prod_123', // Replace with your actual product ID quantity: 1 } ], // Pre-fill customer information to reduce checkout friction customer: { email: '[email protected]', name: 'John Doe', phone_number: '+1234567890' }, // Billing address for tax calculation and compliance billing_address: { street: '123 Main St', city: 'San Francisco', state: 'CA', country: 'US', // Required: ISO 3166-1 alpha-2 country code zipcode: '94102' }, // Where to redirect after successful payment return_url: 'https://yoursite.com/checkout/success', // Custom data for your internal tracking metadata: { order_id: 'order_123', source: 'web_app' } }) }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const session = await response.json(); // Redirect your customer to this URL to complete payment console.log('Checkout URL:', session.checkout_url); console.log('Session ID:', session.session_id); return session; } catch (error) { console.error('Failed to create checkout session:', error); throw error; }}// Example: Redirect user to checkoutcreateCheckoutSession().then(session => { window.location.href = session.checkout_url;});
Arahkan pelanggan Anda ke URL checkout untuk menyelesaikan pembelian mereka.
Salin
// Redirect immediatelywindow.location.href = session.checkout_url;// Or open in new windowwindow.open(session.checkout_url, '_blank');
Opsi Integrasi Alternatif: Alih-alih mengalihkan, Anda dapat menyematkan checkout langsung di halaman Anda menggunakan Overlay Checkout (overlay modal) atau Inline Checkout (sepenuhnya disematkan). Kedua opsi menggunakan URL sesi checkout yang sama.
3
Tangani pengembalian
Setelah pembayaran, pelanggan akan diarahkan kembali ke return_url Anda dengan parameter kueri tambahan untuk status pembayaran.
Array produk yang termasuk dalam sesi checkout. Setiap produk harus memiliki product_id yang valid dari dasbor Dodo Payments Anda.
Checkout Campuran: Anda dapat menggabungkan produk pembayaran satu kali dan produk langganan dalam sesi checkout yang sama. Ini memungkinkan kasus penggunaan yang kuat seperti biaya pengaturan dengan langganan, bundel perangkat keras dengan SaaS, dan lainnya.
Jumlah yang dibayar pelanggan jika pay_what_you_want diaktifkan. Jika dinonaktifkan, bidang ini akan diabaikan.Format: Diwakili dalam denominasi terendah dari mata uang (misalnya, sen untuk USD). Sebagai contoh, untuk mengenakan biaya $1,00, kirim 100.
Temukan ID Produk Anda: Anda dapat menemukan ID produk di dasbor Dodo Payments Anda di bawah Produk → Lihat Detail, atau dengan menggunakan API Daftar Produk.
Nomor telepon pelanggan dalam format internasional. Diperlukan untuk beberapa metode pembayaran dan pencegahan penipuan.Format: Sertakan kode negara, misalnya "+1234567890" untuk nomor AS
Kode negara ISO dua huruf (ISO 3166-1 alpha-2). Bidang ini selalu diperlukan ketika alamat_penagihan disediakan.Contoh: "US" (Amerika Serikat), "CA" (Kanada), "GB" (Inggris Raya), "DE" (Jerman)
Kontrol metode pembayaran mana yang tersedia untuk pelanggan selama checkout. Ini membantu mengoptimalkan untuk pasar atau persyaratan bisnis tertentu.Opsi Tersedia: credit, debit, upi_collect, upi_intent, apple_pay, google_pay, amazon_pay, klarna, affirm, afterpay_clearpay, sepa, ach, cashapp, multibanco, bancontact_card, eps, ideal, przelewy24, paypal
Kritis: Selalu sertakan credit dan debit sebagai opsi cadangan untuk mencegah kegagalan checkout ketika metode pembayaran yang diinginkan tidak tersedia.
Tentukan pemilihan mata uang default dengan mata uang penagihan tetap. Menggunakan kode mata uang ISO 4217.Mata Uang yang Didukung: USD, EUR, GBP, CAD, AUD, INR, dan lainnyaContoh: "USD" untuk Dolar AS, "EUR" untuk Euro
Bidang ini hanya efektif ketika penetapan harga adaptif diaktifkan. Jika penetapan harga adaptif dinonaktifkan, mata uang default produk akan digunakan.
Aktifkan mode pengumpulan alamat minimal. Ketika diaktifkan, checkout hanya mengumpulkan:
Negara: Selalu diperlukan untuk penentuan pajak
Kode ZIP/Pos: Hanya di wilayah di mana itu diperlukan untuk perhitungan pajak penjualan, PPN, atau GST
Ini secara signifikan mengurangi gesekan checkout dengan menghilangkan bidang formulir yang tidak perlu.
Aktifkan alamat minimal untuk penyelesaian checkout yang lebih cepat. Pengumpulan alamat lengkap tetap tersedia untuk bisnis yang memerlukan detail penagihan lengkap.
Aktifkan mode pengumpulan alamat minimal. Ketika diaktifkan, checkout hanya mengumpulkan:
Negara: Selalu diperlukan untuk penentuan pajak
Kode ZIP/Pos: Hanya di wilayah di mana itu diperlukan untuk perhitungan pajak penjualan, PPN, atau GST
Ini secara signifikan mengurangi gesekan checkout dengan menghilangkan bidang formulir yang tidak perlu.
Aktifkan alamat minimal untuk penyelesaian checkout yang lebih cepat. Pengumpulan alamat lengkap tetap tersedia untuk bisnis yang memerlukan detail penagihan lengkap.
Harga produk untuk biaya awal kepada pelanggan. Jika tidak ditentukan, harga yang disimpan dari produk akan digunakan.Format: Diwakili dalam denominasi terendah dari mata uang (misalnya, sen untuk USD). Sebagai contoh, untuk mengenakan biaya $1,00, kirim 100.
Apakah biaya mata uang adaptif harus disertakan dalam harga produk (true) atau ditambahkan di atas (false). Diabaikan jika penetapan harga adaptif tidak diaktifkan.
Override billing_currency hanya berlaku ketika mata uang adaptif diaktifkan dalam pengaturan akun Anda. Jika mata uang adaptif dinonaktifkan, parameter ini tidak akan berpengaruh.
11. Menggunakan Metode Pembayaran yang Ada untuk Checkout Instan
Gunakan metode pembayaran yang disimpan oleh pelanggan untuk membuat sesi checkout yang diproses segera, melewati pengumpulan metode pembayaran:
Salin
const session = await client.checkoutSessions.create({ product_cart: [ { product_id: 'prod_premium_plan', quantity: 1 } ], customer: { customer_id: 'cus_123' // Required when using payment_method_id }, payment_method_id: 'pm_abc123', // Use customer's saved payment method confirm: true, // Required when using payment_method_id return_url: 'https://yourapp.com/success'});
Saat menggunakan payment_method_id, confirm harus diatur ke true dan customer_id yang ada harus disediakan. Metode pembayaran akan divalidasi untuk kelayakan dengan mata uang pembayaran.
Metode pembayaran harus milik pelanggan dan kompatibel dengan mata uang pembayaran. Ini memungkinkan pembelian satu klik untuk pelanggan yang kembali.
12. Tautan Pendek untuk URL Pembayaran yang Lebih Bersih
Hasilkan tautan pembayaran yang dipersingkat dan dapat dibagikan dengan slug kustom:
Salin
const session = await client.checkoutSessions.create({ product_cart: [ { product_id: 'prod_monthly_subscription', quantity: 1 } ], short_link: true, // Generate a shortened payment link return_url: 'https://yourapp.com/success', customer: { email: '[email protected]', name: 'John Doe' }});// The checkout_url will be a shortened, cleaner linkconsole.log(session.checkout_url); // e.g., https://checkout.dodopayments.com/buy/abc123
Tautan pendek sangat cocok untuk berbagi melalui SMS, email, atau media sosial. Mereka lebih mudah diingat dan membangun lebih banyak kepercayaan pelanggan dibandingkan URL yang panjang.
Gunakan redirect_immediately: true ketika Anda memiliki halaman sukses kustom yang memberikan pengalaman pengguna yang lebih baik daripada halaman sukses pembayaran default. Ini sangat berguna untuk aplikasi seluler dan alur checkout yang disematkan.
Ketika redirect_immediately diaktifkan, pelanggan akan dialihkan ke return_url Anda segera setelah penyelesaian pembayaran, sepenuhnya melewati halaman sukses default.
Sebelumnya, saat membuat tautan pembayaran dengan Tautan Dinamis, Anda diharuskan untuk memberikan alamat penagihan lengkap pelanggan.Dengan Sesi Checkout, ini tidak lagi diperlukan. Anda cukup menyampaikan informasi yang Anda miliki, dan kami akan menangani sisanya. Misalnya:
Jika Anda hanya tahu negara penagihan pelanggan, cukup berikan itu.
Alur checkout akan secara otomatis mengumpulkan detail yang hilang sebelum memindahkan pelanggan ke halaman pembayaran.
Di sisi lain, jika Anda sudah memiliki semua informasi yang diperlukan dan ingin langsung ke halaman pembayaran, Anda dapat menyampaikan kumpulan data lengkap dan menyertakan confirm=true dalam body permintaan Anda.