Create secure, hosted checkout experiences that handle the complete payment flow for both one-time purchases and subscriptions with full customization control.
Use this file to discover all available pages before exploring further.
Quick Start Guide
Get your first checkout session running in under 5 minutes
API Reference & Live Testing
Explore the full API documentation and interactively test Checkout Session requests and responses.
Preview Checkout
Calculate pricing, taxes, and totals before creating a session.
Session Validity: Checkout sessions are valid for 24 hours by default. If you pass confirm=true in your request, the session will only be valid for 15 minutes.
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: 'customer@example.com', 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' }); }});
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": "customer@example.com", "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
// 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: 'customer@example.com', 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;});
Direct your customer to the checkout URL to complete their purchase.
// Redirect immediatelywindow.location.href = session.checkout_url;// Or open in new windowwindow.open(session.checkout_url, '_blank');
Alternative Integration Options: Instead of redirecting, you can embed the checkout directly in your page using Overlay Checkout (modal overlay) or Inline Checkout (fully embedded). Both options use the same checkout session URL.
3
Handle the return
After payment, customers are redirected to your return_url with query parameters including payment/subscription ID, status, customer email, and any license keys. See the return_url parameter docs for the full list.
Array of products to include in the checkout session. Each product must have a valid product_id from your Dodo Payments dashboard.
Mixed Checkout: You can combine one-time payment products and subscription products in the same checkout session. This enables powerful use cases like setup fees with subscriptions, hardware bundles with SaaS, and more.
Amount the customer pays if pay_what_you_want is enabled. If disabled, this field will be ignored.Định dạng: Được biểu thị bằng đơn vị nhỏ nhất của tiền tệ (ví dụ, xu đối với USD). Ví dụ, để tính phí $1.00, hãy truyền 100.
Ghi đè từng phiên thanh toán cho các quyền tín dụng đã được đính kèm vào sản phẩm này. Sử dụng điều này để cấp số lượng tín dụng khác cho phiên này — ví dụ, một gói khuyến mãi cấp 1.000 tín dụng API thay vì 500 mặc định của sản phẩm — mà không cần tạo một sản phẩm riêng biệt.
Mỗi credit_entitlement_id phải được đính kèm vào sản phẩm. Trường này chỉ ghi đè các credits_amount được cấp khi phiên này hoàn thành; cài đặt quyền tín dụng cấp sản phẩm (hết hạn, chuyển tiếp, v.v.) vẫn được áp dụng.
Số lượng tín dụng để cấp cho phiên thanh toán này, ghi đè mức credits_amount của sản phẩm. Phải lớn hơn không.
Tìm ID sản phẩm của bạn: Bạn có thể tìm thấy ID sản phẩm trong bảng điều khiển Dodo Payments dưới mục Products → View Details, hoặc bằng cách sử dụng API List Products.
Số điện thoại của khách hàng theo định dạng quốc tế. Cần thiết cho một số phương thức thanh toán và phòng chống gian lận.Định dạng: Bao gồm mã quốc gia, ví dụ, "+1234567890" cho số điện thoại ở Mỹ
Mã quốc gia hai chữ cái ISO (ISO 3166-1 alpha-2). Trường này luôn bắt buộc khi địa chỉ thanh toán được cung cấp.Ví dụ: "US" (Hoa Kỳ), "CA" (Canada), "GB" (Vương Quốc Anh), "DE" (Đức)
Country Code Reference
Xem danh sách đầy đủ các quốc gia được hỗ trợ và mã ISO của họ
Kiểm soát các phương thức thanh toán nào có sẵn cho khách hàng trong quá trình thanh toán. Điều này giúp tối ưu hóa cho các thị trường hoặc yêu cầu kinh doanh cụ thể.Các tùy chọn có sẵn: credit, debit, upi_collect, apple_pay, google_pay, amazon_pay, klarna, affirm, afterpay_clearpay, cashapp, multibanco, bancontact_card, eps, ideal, przelewy24, paypal, sunbit
Quan trọng: Luôn bao gồm credit và debit như các tùy chọn dự phòng để ngăn ngừa thất bại thanh toán khi các phương thức thanh toán ưa thích không khả dụng.
Ghi đè lựa chọn tiền tệ mặc định với một loại tiền tệ thanh toán cố định. Sử dụng mã tiền tệ ISO 4217.Các loại tiền tệ được hỗ trợ: USD, EUR, GBP, CAD, AUD, INR, và nhiều hơnVí dụ: "USD" cho USD, "EUR" cho Euro
Trường này chỉ có hiệu quả khi giá chỉ định là bật. Nếu giá chỉ định bị tắt, tiền tệ mặc định của sản phẩm sẽ được sử dụng.
URL để chuyển hướng khách hàng sau khi hoàn tất thanh toán. Dodo Payments thêm các tham số truy vấn sau vào URL của bạn khi chuyển hướng:
Tham số
Kiểu
Điều kiện
payment_id
string
Luôn có mặt cho các khoản thanh toán một lần
subscription_id
string
Luôn có mặt cho các khoản thanh toán đăng ký
status
string
Luôn có mặt
license_key
string
Có mặt nếu sản phẩm có kích hoạt mã giấy phép. Phân tách bằng dấu phẩy nếu có nhiều khóa
email
string
Có mặt nếu khách hàng có email được lưu theo dữ liệu
Ví dụ URL chuyển hướng:
# One-time payment with license keyhttps://yoursite.com/return?payment_id=pay_xxx&status=succeeded&license_key=LK-001&email=customer%40example.com# Subscription payment with multiple license keyshttps://yoursite.com/return?subscription_id=sub_xxx&status=active&license_key=LK-001,LK-002&email=customer%40example.com# Payment without license keyshttps://yoursite.com/return?payment_id=pay_xxx&status=succeeded&email=customer%40example.com
Sử dụng các tham số truy vấn license_key và email để hiển thị các khóa giấy phép hoặc gửi xác nhận ngay lập tức trên trang trở về của bạn, mà không cần một cuộc gọi API bổ sung.
URL để chuyển hướng khách hàng khi họ nhấn nút quay lại hoặc hủy bỏ phiên thanh toán. Nếu không được cung cấp, nút quay lại sẽ không được hiển thị.
Đặt cancel_url để cung cấp cho khách hàng một cách rõ ràng để trở lại trang web của bạn mà không hoàn tất mua hàng. Điều này cải thiện trải nghiệm thanh toán và giảm ma sát.
Áp dụng một hoặc nhiều mã giảm giá xếp chồng vào phiên thanh toán. Mã được áp dụng theo thứ tự mảng (mã đầu tiên giảm giá gốc, mã thứ hai giảm giá một mức đã giảm trước đó, và như vậy), lên đến mức tối đa 20 mã mỗi phiên.
discount_codes: ['WELCOME10', 'BLACKFRIDAY20']
Trường discount_code đơn số dưới đây là ngừng sử dụng nhưng vẫn đang được hỗ trợ đầy đủ — các tích hợp hiện có vẫn hoạt động mà không cần thay đổi. Không thể kết hợp với discount_codes trong cùng một yêu cầu. Chuyển sang discount_codes khi thuận tiện để tận dụng việc xếp chồng.
Ngừng sử dụng — ưu tiên discount_codes cho các tích hợp mới. Trường này vẫn hoạt động nhằm đảm bảo khả năng tương thích ngược, nhưng không thể kết hợp với discount_codes trong cùng một yêu cầu.
Kích hoạt chế độ thu thập địa chỉ tối thiểu. Khi bật, thanh toán chỉ thu thập:
Quốc gia: Luôn yêu cầu để xác định thuế
Mã bưu chính/Postal code: Chỉ ở các khu vực cần thiết để tính thuế bán hàng, VAT hoặc GST
Điều này đáng kể giảm ma sát khi thanh toán bằng cách loại bỏ các trường mẫu không cần thiết.
Kích hoạt địa chỉ tối thiểu để hoàn thành thanh toán nhanh hơn. Thu thập địa chỉ đầy đủ vẫn có sẵn cho các doanh nghiệp yêu cầu đầy đủ chi tiết thanh toán.
Bắt buộc để giao diện thanh toán hiển thị bằng một ngôn ngữ cụ thể. Theo mặc định, thanh toán tự động phát hiện ngôn ngữ trình duyệt của khách hàng.Mã ngôn ngữ hỗ trợ:ar (Ả Rập), ca (Catalan), de (Đức), en (Anh), es (Tây Ban Nha), fr (Pháp), he (Hebrew), id (Indonesia), it (Ý), ja (Nhật Bản), ko (Hàn Quốc), ms (Malay), nl (Hà Lan), pl (Ba Lan), pt (Bồ Đào Nha), ro (Romania), ru (Nga), sv (Thụy Điển), th (Thái Lan), tr (Thổ Nhĩ Kỳ), zh (Trung Quốc)Ví dụ: "es" cho Tây Ban Nha, "ja" cho Nhật Bản
Kích hoạt chế độ thu thập địa chỉ tối thiểu. Khi bật, thanh toán chỉ thu thập:
Quốc gia: Luôn yêu cầu cho việc xác định thuế
Mã bưu chính/Postal code: Chỉ ở những vùng mà nó cần thiết để tính thuế bán hàng, VAT hoặc GST
Điều này đáng kể giảm ma sát khi thanh toán bằng cách loại bỏ các trường mẫu không cần thiết.
Kích hoạt địa chỉ tối thiểu để hoàn thành thanh toán nhanh hơn. Thu thập địa chỉ đầy đủ vẫn có sẵn cho các doanh nghiệp cần đầy đủ chi tiết thanh toán.
Bỏ qua trang thành công thanh toán mặc định và chuyển hướng khách hàng ngay lập tức đến trang return_url của bạn sau khi hoàn tất thanh toán.
Sử dụng điều này khi bạn có một trang thành công tùy chỉnh mang lại trải nghiệm người dùng tốt hơn hoặc cho các ứng dụng di động và luồng thanh toán nhúng.
Thu thập thông tin bổ sung từ khách hàng trong quá trình thanh toán với các trường mẫu tùy chỉnh. Bạn có thể xác định tối đa 5 trường tùy chỉnh cho mỗi phiên thanh toán. Phản hồi của khách hàng được bao gồm trong tải trọng webhook và có sẵn qua API.
Danh sách các tùy chọn cho loại trường dropdown. Cần thiết khi field_type là dropdown, bỏ qua cho các loại khác.Ví dụ: ["Google", "Twitter", "Friend referral", "Other"]
Phản hồi của khách hàng đối với các trường tùy chỉnh được bao gồm trong:
Webhooks: payment.succeeded, subscription.active, và các tải sự kiện liên quan khác chứa mảng custom_field_responses
Phản hồi API: Các đối tượng thanh toán và đăng ký bao gồm custom_field_responses
Giá sản phẩm cho khoản phí ban đầu đối với khách hàng. Nếu không chỉ định, giá lưu trữ của sản phẩm sẽ được sử dụng.Định dạng: Được biểu thị bằng đơn vị nhỏ nhất của tiền tệ (ví dụ, xu đối với USD). Ví dụ, để tính phí $1.00, hãy truyền 100.
Ghi đè billing_currency chỉ có hiệu quả khi tiền tệ đa dạng được bật trong cài đặt tài khoản của bạn. Nếu tiền tệ đa dạng bị tắt, tham số này sẽ không có tác dụng.
11. Sử Dụng Phương Thức Thanh Toán Hiện Có cho Thanh Toán Ngay Lập Tức
Sử dụng phương thức thanh toán đã lưu của khách hàng để tạo một phiên thanh toán được xử lý ngay lập tức, bỏ qua việc thu thập phương thức thanh toán:
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'});
Khi sử dụng payment_method_id, confirm phải được đặt thành true và phải cung cấp customer_id hiện có. Phương thức thanh toán sẽ được xác thực cho đủ điều kiện với đơn vị tiền tệ của thanh toán.
Phương thức thanh toán phải thuộc về khách hàng và phù hợp với đơn vị tiền tệ của thanh toán. Điều này cho phép các giao dịch mua chỉ cần nhấp một lần cho khách hàng trở lại.
Tạo các liên kết thanh toán rút gọn, có thể chia sẻ với đoạn đường dẫn tùy chỉnh:
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: 'customer@example.com', name: 'John Doe' }});// The checkout_url will be a shortened, cleaner linkconsole.log(session.checkout_url); // e.g., https://checkout.dodopayments.com/buy/abc123
Các liên kết ngắn rất phù hợp cho SMS, email, hoặc chia sẻ trên mạng xã hội. Chúng dễ nhớ hơn và xây dựng lòng tin của khách hàng tốt hơn so với URL dài.
Sử dụng redirect_immediately: true khi bạn có một trang thành công tùy chỉnh cung cấp trải nghiệm người dùng tốt hơn so với trang thành công thanh toán mặc định. Điều này đặc biệt hữu ích cho các ứng dụng di động và luồng thanh toán nhúng.
Khi redirect_immediately được bật, khách hàng sẽ được chuyển hướng tới trang return_url của bạn ngay lập tức sau khi hoàn tất thanh toán, hoàn toàn bỏ qua trang thành công mặc định.
Sử dụng force_language khi bạn biết ngôn ngữ ưa thích của khách hàng (ví dụ, từ cài đặt tài khoản của họ) hoặc khi nhắm mục tiêu vào các thị trường khu vực cụ thể.
Ngôn ngữ hỗ trợ: Tiếng Ả Rập (ar), Tiếng Catalan (ca), Tiếng Trung (zh), Tiếng Hà Lan (nl), Tiếng Anh (en), Tiếng Pháp (fr), Tiếng Đức (de), Tiếng Hebrew (he), Tiếng Indonesia (id), Tiếng Ý (it), Tiếng Nhật Bản (ja), Tiếng Hàn Quốc (ko), Tiếng Malay (ms), Tiếng Ba Lan (pl), Tiếng Bồ Đào Nha (pt), Tiếng Romania (ro), Tiếng Nga (ru), Tiếng Tây Ban Nha (es), Tiếng Thụy Điển (sv), Tiếng Thái (th), Tiếng Thổ Nhĩ Kỳ (tr)
Các phản hồi của khách hàng đối với các trường tùy chỉnh được tự động bao gồm trong tải hoạt động của webhook (payment.succeeded, subscription.active, v.v.) và có thể được truy xuất qua API. Sử dụng chúng để làm phong phú thêm CRM của bạn, kích hoạt luồng onboarding, hoặc tùy chỉnh trải nghiệm khách hàng.
Loại trường có sẵn:text, number, email, url, date, dropdown, boolean
Trước khi tạo một phiên thanh toán, bạn có thể xem trước sự phân chia giá bao gồm cả thuế, giảm giá, và tổng số. Điều này hữu ích cho việc hiển thị giá chính xác cho khách hàng trước khi họ tiến hành thanh toán.
Trước đây, khi tạo một liên kết thanh toán với Liên Kết Động, bạn cần cung cấp địa chỉ thanh toán đầy đủ của khách hàng.Với Phiên Thanh Toán, điều này không còn cần thiết nữa. Bạn chỉ cần chuyển qua bất kỳ thông tin nào bạn có, và chúng tôi sẽ xử lý phần còn lại. Ví dụ:
Nếu bạn chỉ biết quốc gia thanh toán của khách hàng, chỉ cần cung cấp điều đó.
Dòng thanh toán sẽ tự động thu thập các chi tiết còn thiếu trước khi chuyển khách hàng tới trang thanh toán.
Mặt khác, nếu bạn đã có tất cả các thông tin cần thiết và muốn bỏ qua trực tiếp tới trang thanh toán, bạn có thể truyền đầy đủ dữ liệu và bao gồm confirm=true trong nội dung yêu cầu của bạn.