Skip to main content
Adaptor @dodopayments/express cung cấp cho ứng dụng Express của bạn ba route handler: checkoutHandler trả về URL checkout, CustomerPortal đưa khách hàng đến Customer Portal, còn Webhooks xác minh các request webhook và gọi các event handler của bạn.

Checkout Handler

Tạo payment link và checkout session từ ứng dụng Express của bạn.

Customer Portal

Cho phép khách hàng quản lý subscription và thông tin của họ.

Webhooks

Xác minh và xử lý các sự kiện webhook của Dodo Payments.

Cài đặt

1

Install the Package

Chạy lệnh sau trong thư mục gốc của project:
2

Set Up Environment Variables

Tạo file .env trong thư mục gốc của project:
Tạo API key trong Developer → API Keys. Thêm endpoint webhook trong Developer → Webhooks và sao chép signing secret vào DODO_PAYMENTS_WEBHOOK_KEY. Trong quá trình xây dựng, hãy sử dụng API key ở test mode với DODO_PAYMENTS_ENVIRONMENT=test_mode, vì key ở test mode chỉ hoạt động với test mode. DODO_PAYMENTS_RETURN_URL là tùy chọn.
Không commit file .env hoặc secret vào hệ thống kiểm soát phiên bản.

Ví dụ về Route Handler

Các ví dụ đăng ký route trên một ứng dụng Express được tạo bằng express(). Các checkout handler POST và webhook handler đọc req.body, vì vậy mỗi ví dụ đăng ký express.json() trước các route của mình.
Sử dụng handler này để tích hợp checkout của Dodo Payments vào ứng dụng Express. Hỗ trợ các luồng thanh toán static (GET), dynamic (POST) và session (POST). Đăng ký mỗi luồng POST trên một path riêng, vì handler đầu tiên được đăng ký cho một path sẽ xử lý mọi request đến path đó.

Checkout Route Handler

Adaptor hỗ trợ cả ba luồng checkout của Dodo Payments. Đặt type trong cấu hình handler để chọn luồng mà route cung cấp. Mỗi luồng trả về JSON chứa checkout_url để khách hàng mở.
  • Static Payment Links: type: "static", GET. Tạo payment link cho một product từ query parameter sau khi kiểm tra product tồn tại.
  • Dynamic Payment Links: type: "dynamic", POST. Tạo khoản thanh toán một lần hoặc subscription bằng payment link, tùy thuộc product có recurring hay không.
  • Checkout Sessions: type: "session", POST. Tạo checkout session từ product cart và thông tin khách hàng. Sử dụng luồng này cho các tích hợp mới.
checkoutHandler nhận các tùy chọn sau: Đăng ký handler cho GET khi type là static, và cho POST khi type là dynamic hoặc session. Handler trả về 405 cho các method khác.

Query Parameter được hỗ trợ

string
bắt buộc
Mã định danh product, ví dụ ?productId=pdt_nZuwz45WAs64n3l07zpQR.
integer
mặc định:"1"
Số lượng product.
string
Họ tên đầy đủ của khách hàng. Bị bỏ qua nếu cung cấp firstName hoặc lastName.
string
Tên của khách hàng.
string
Họ của khách hàng.
string
Địa chỉ email của khách hàng.
string
Quốc gia của khách hàng, theo mã ISO 3166-1 alpha-2.
string
Địa chỉ đường phố của khách hàng.
string
Thành phố của khách hàng.
string
Bang hoặc tỉnh của khách hàng.
string
Mã bưu chính hoặc ZIP code của khách hàng.
boolean
Đặt thành true để tắt trường họ tên đầy đủ.
boolean
Đặt thành true để tắt trường tên.
boolean
Đặt thành true để tắt trường họ.
boolean
Đặt thành true để tắt trường email.
boolean
Đặt thành true để tắt trường quốc gia.
boolean
Đặt thành true để tắt trường địa chỉ.
boolean
Đặt thành true để tắt trường thành phố.
boolean
Đặt thành true để tắt trường bang.
boolean
Đặt thành true để tắt trường ZIP code.
string
Đơn vị tiền tệ thanh toán, ví dụ USD.
boolean
mặc định:"true"
Hiển thị hoặc ẩn bộ chọn tiền tệ.
number
Cố định số tiền được tính, theo đơn vị tiền tệ chính, ví dụ 12.5 cho $12.50. Chỉ hoạt động với product Pay What You Want và bị bỏ qua nếu thấp hơn giá tối thiểu của product.
boolean
mặc định:"true"
Hiển thị hoặc ẩn phần giảm giá.
string
Mọi query parameter bắt đầu bằng metadata_ đều được truyền vào checkout dưới dạng metadata, ví dụ metadata_orderId=123.
Cờ disable chỉ có hiệu lực khi là true và trường tương ứng có giá trị, ví dụ email với disableEmail. Handler truyền các parameter này đến static payment link.
Nếu thiếu productId, handler trả về response 400. Query parameter không hợp lệ hoặc product không tồn tại trong account của bạn cũng dẫn đến response 400.

Định dạng Response

Static checkout trả về response JSON chứa checkout URL:
  • Gửi parameter dưới dạng JSON body trong request POST.
  • Hỗ trợ cả thanh toán một lần và recurring. Handler lấy product, sau đó tạo subscription nếu product là recurring; nếu không thì tạo khoản thanh toán một lần.
  • Body cần billing (với street, city, state, country và zipcode) và customer, cùng với product_id (với quantity tùy chọn) hoặc product_cart. Subscription cần product_id.
  • Handler cũng chuyển tiếp metadata, allowed_payment_method_types, billing_currency, discount_codes (hoặc discount_code đã deprecated), return_url, show_saved_payment_methods và tax_id. Với subscription, handler cũng chuyển tiếp addons, on_demand và trial_period_days. Các field khác bị bỏ qua.
  • Để biết chi tiết về field, xem:
Dynamic Checkout gọi các endpoint POST /payments và POST /subscriptions đã deprecated. Sử dụng Checkout Sessions cho các tích hợp mới.

Định dạng Response

Dynamic checkout trả về response JSON với payment link dưới dạng checkout URL:
Gửi payload của checkout session dưới dạng JSON body. Handler tạo checkout session để xử lý toàn bộ luồng thanh toán cho giao dịch mua một lần và subscription, sau đó trả về checkout_url của session. product_cart là bắt buộc và phải chứa ít nhất một product.Mỗi checkout_url chỉ hoạt động một lần và hết hạn sau 24 giờ, hoặc sau 15 phút khi bạn truyền confirm: true. Session được tạo với payment_method_id không trả về checkout_url, vì vậy handler trả về 400.Xem Checkout Sessions Integration Guide để biết thêm chi tiết và danh sách đầy đủ các field được hỗ trợ.

Định dạng Response

Checkout session trả về response JSON chứa checkout URL:

Customer Portal Route Handler

Customer Portal Route Handler tạo một Customer Portal session cho khách hàng trong customer_id và chuyển hướng request đến portal link. CustomerPortal nhận các tùy chọn bearerToken và environment, giống như checkoutHandler. Nếu Dodo Payments không thể tạo session, handler trả về 500.

Query Parameter

string
bắt buộc
Customer ID cho portal session, ví dụ ?customer_id=cus_123.
boolean
Nếu được đặt thành true, gửi email chứa portal link cho khách hàng.
Trả về 400 nếu thiếu customer_id. Handler không xác thực request và mở portal cho mọi customer_id nhận được, vì vậy hãy đặt route phía sau cơ chế authentication của riêng bạn và chỉ truyền customer ID của người dùng đã đăng nhập.

Webhook Route Handler

Webhook handler xác minh từng request bằng webhook secret của bạn, được truyền dưới dạng webhookKey, sau đó gọi các event handler của bạn.
Đăng ký express.json() trước webhook route. Handler xác minh signature dựa trên req.body, vì vậy sẽ từ chối mọi request trừ khi body là JSON đã được parse. Không sử dụng express.raw() cho route này.
  • Method: Chỉ hỗ trợ request POST. Các method khác trả về 405.
  • Signature Verification: Xác minh các header webhook-id, webhook-timestamp và webhook-signature bằng webhookKey, theo đặc tả Standard Webhooks. Trả về 401 nếu xác minh thất bại.
  • Payload Validation: Xác thực bằng Zod. Trả về 400 cho payload không hợp lệ.
  • Error Handling:
    • 401: Signature không hợp lệ
    • 400: Payload không hợp lệ
    • 500: Lỗi nội bộ trong quá trình xác minh
  • Event Routing: Gọi onPayload cho mọi event, sau đó gọi handler tương ứng với type của event và trả về 200 khi chúng hoàn tất. Handler không bắt các lỗi do event handler của bạn throw ra.

Webhook Event Handler được hỗ trợ

Mọi handler đều là tùy chọn và async. Để xem payload của từng event, hãy tham khảo Webhook Event Guide.

Prompt cho LLM

Lần sửa đổi cuối 26 tháng 9, 2026