Tạo trải nghiệm thanh toán an toàn, được lưu trữ, xử lý toàn bộ quy trình thanh toán cho cả mua hàng một lần và đăng ký với quyền kiểm soát tùy chỉnh hoàn toàn.
Thời gian hiệu lực của phiên: Các phiên thanh toán có hiệu lực trong 24 giờ theo mặc định. Nếu bạn truyền confirm=true trong yêu cầu của bạn, phiên sẽ chỉ có hiệu lực trong 15 phút.
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' }); }});
Sao chép
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
Sao chép
// 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;});
Chuyển hướng khách hàng của bạn đến URL thanh toán để hoàn tất giao dịch của họ.
Sao chép
// Redirect immediatelywindow.location.href = session.checkout_url;// Or open in new windowwindow.open(session.checkout_url, '_blank');
Tùy chọn tích hợp thay thế: Thay vì chuyển hướng, bạn có thể nhúng thanh toán trực tiếp vào trang của bạn bằng cách sử dụng Overlay Checkout (overlay modal) hoặc Inline Checkout (hoàn toàn nhúng). Cả hai tùy chọn đều sử dụng cùng một URL phiên thanh toán.
3
Xử lý việc trở lại
Sau khi thanh toán, khách hàng sẽ được chuyển hướng đến return_url của bạn với các tham số truy vấn bổ sung cho trạng thái thanh toán.
Mảng các sản phẩm để bao gồm trong phiên thanh toán. Mỗi sản phẩm phải có một product_id hợp lệ từ bảng điều khiển Dodo Payments của bạn.
Thanh toán hỗn hợp: Bạn có thể kết hợp các sản phẩm thanh toán một lần và các sản phẩm đăng ký trong cùng một phiên thanh toán. Điều này cho phép các trường hợp sử dụng mạnh mẽ như phí thiết lập với các đăng ký, gói phần cứng với SaaS, và nhiều hơn nữa.
Số tiền mà khách hàng phải trả nếu pay_what_you_want được kích hoạt. Nếu không, trường này sẽ bị bỏ qua.Định dạng: Được biểu diễn bằng đơn vị thấp nhất của tiền tệ (ví dụ: xu cho USD). Ví dụ, để tính phí $1.00, truyền 100.
Tìm ID sản phẩm của bạn: Bạn có thể tìm ID sản phẩm trong bảng điều khiển Dodo Payments của bạn dưới Sản phẩm → Xem Chi tiết, hoặc bằng cách sử dụng List Products API.
Thông tin khách hàng. Bạn có thể đính kèm một khách hàng hiện có bằng cách sử dụng ID của họ hoặc tạo một bản ghi khách hàng mới trong quá trình thanh toán.
Đính kèm Khách hàng Hiện có
Khách hàng Mới
Đính kèm một khách hàng hiện có vào phiên thanh toán bằng cách sử dụng ID của họ.
Số điện thoại của khách hàng theo định dạng quốc tế. Bắt buộc cho một số phương thức thanh toán và phòng ngừa gian lận.Định dạng: Bao gồm mã quốc gia, ví dụ: "+1234567890" cho số của Mỹ
Mã quốc gia ISO hai chữ cái (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)
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, upi_intent, apple_pay, google_pay, amazon_pay, klarna, affirm, afterpay_clearpay, sepa, ach, cashapp, multibanco, bancontact_card, eps, ideal, przelewy24, paypal
Quan trọng: Luôn bao gồm credit và debit như các tùy chọn dự phòng để ngăn chặn các lỗi thanh toán khi các phương thức thanh toán ưu tiên không khả dụng.
Ghi đè lựa chọn tiền tệ mặc định bằng 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ơn nữaVí dụ: "USD" cho Đô la Mỹ, "EUR" cho Euro
Trường này chỉ có hiệu lực khi giá cả thích ứng được kích hoạt. Nếu giá cả thích ứng bị vô hiệu hóa, loại tiền tệ mặc định của sản phẩm sẽ được sử dụng.
Kích hoạt chế độ thu thập địa chỉ tối thiểu. Khi được kích hoạt, thanh toán chỉ thu thập:
Quốc gia: Luôn cần thiết để xác định thuế
Mã ZIP/Bưu chính: Chỉ ở những khu vực mà nó cần thiết cho việc tính thuế bán hàng, VAT hoặc GST
Điều này giảm đáng kể ma sát thanh toán bằng cách loại bỏ các trường biểu mẫu không cần thiết.
Kích hoạt địa chỉ tối thiểu để hoàn tất thanh toán nhanh hơn. Việc thu thập địa chỉ đầy đủ vẫn có sẵn cho các doanh nghiệp yêu cầu thông tin thanh toán đầy đủ.
Kích hoạt chế độ thu thập địa chỉ tối thiểu. Khi được kích hoạt, thanh toán chỉ thu thập:
Quốc gia: Luôn cần thiết để xác định thuế
Mã ZIP/Bưu chính: Chỉ ở những khu vực mà nó cần thiết cho việc tính thuế bán hàng, VAT hoặc GST
Điều này giảm đáng kể ma sát thanh toán bằng cách loại bỏ các trường biểu mẫu không cần thiết.
Kích hoạt địa chỉ tối thiểu để hoàn tất thanh toán nhanh hơn. Việc thu thập địa chỉ đầy đủ vẫn có sẵn cho các doanh nghiệp yêu cầu thông tin thanh toán đầy đủ.
Giá sản phẩm cho khoản phí ban đầu đến khách hàng. Nếu không được chỉ định, giá đã lưu của sản phẩm sẽ được sử dụng.Định dạng: Được biểu diễn bằng đơn vị thấp nhất của tiền tệ (ví dụ: xu cho USD). Ví dụ, để tính phí $1.00, truyền 100.
Ghi đè billing_currency chỉ có hiệu lực khi tiền tệ thích ứng được kích hoạt trong cài đặt tài khoản của bạn. Nếu tiền tệ thích ứng bị vô hiệu hóa, tham số này sẽ không có tác dụng.
11. Sử dụng Các 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 xử lý ngay lập tức, bỏ qua việc thu thập phương thức thanh toán:
Sao chép
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à một customer_id hiện có phải được cung cấp. Phương thức thanh toán sẽ được xác thực để kiểm tra tính đủ điều kiện với loại 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à tương thích với loại tiền tệ thanh toán. Điều này cho phép mua hàng một lần cho khách hàng quay lại.
Tạo các liên kết thanh toán ngắn gọn, có thể chia sẻ với các slug tùy chỉnh:
Sao chép
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
Liên kết ngắn rất hoàn hảo cho việc chia sẻ qua SMS, email hoặc mạng xã hội. Chúng dễ nhớ hơn và tạo dựng niềm tin hơn cho khách hàng so với các 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à quy trình thanh toán nhúng.
Khi redirect_immediately được kích hoạt, khách hàng sẽ được chuyển hướng đến return_url của bạn ngay lập tức sau khi hoàn tất thanh toán, bỏ qua hoàn toàn trang thành công mặc định.
Trước khi tạo một phiên thanh toán, bạn có thể xem trước phân tích giá cả bao gồm thuế, giảm giá và tổng số. Điều này hữu ích để 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 yêu cầu cung cấp địa chỉ thanh toán đầy đủ của khách hàng.Với Các Phiên thanh toán, điều này không còn cần thiết. Bạn chỉ cần truyền 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 đó.
Quy trình 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 đến trang thanh toán.
Mặt khác, nếu bạn đã có tất cả thông tin cần thiết và muốn bỏ qua trực tiếp đến trang thanh toán, bạn có thể truyền toàn bộ tập dữ liệu và bao gồm confirm=true trong thân yêu cầu của bạn.