Skip to main content
Adaptor @dodopayments/fastify cung cấp cho ứng dụng Fastify của bạn ba trình xử lý route: Checkout trả về URL checkout, CustomerPortal đưa khách hàng đến Customer Portal, còn Webhooks xác minh các yêu cầu webhook và gọi các trình xử lý sự kiện của bạn.

Checkout Handler

Tạo payment link và checkout session từ ứng dụng Fastify 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 dự án:
Gói này yêu cầu Fastify 5.4.0 trở lên.
2

Set Up Environment Variables

Tạo tệp .env trong thư mục gốc của dự án:
Tạo API key trong Developer → API Keys. Thêm webhook endpoint 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 cùng 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 tệp .env hoặc secret vào hệ thống quản lý phiên bản.

Ví dụ về trình xử lý route

Các ví dụ đăng ký route trên một instance Fastify được tạo bằng Fastify(). Route webhook cần request body thô, vì vậy ví dụ thêm một body parser dạng string bên trong plugin chỉ chứa route webhook.
Sử dụng trình xử lý này để tích hợp checkout của Dodo Payments vào ứng dụng Fastify. Hỗ trợ các luồng thanh toán static (GET), dynamic (POST) và session (POST). Checkout() trả về getHandler cho luồng static và postHandler cho các luồng dynamic và session. Đăng ký mỗi luồng POST trên một path riêng.

Trình xử lý Checkout Route

Adaptor hỗ trợ cả ba luồng checkout của Dodo Payments. Đặt type trong cấu hình trình xử lý để chọn luồng mà route cung cấp. Mỗi luồng phản hồi 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 có 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.
Checkout nhận các tùy chọn sau: Checkout trả về một object có hai trình xử lý. Đăng ký getHandler cho GET khi type là static, và postHandler cho POST khi type là dynamic hoặc session.

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, dưới dạng 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 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 hoặc tỉnh.
boolean
Đặt thành true để tắt trường ZIP.
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_ được chuyển đến 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. Trình xử lý chuyển các parameter này đến static payment link.
Nếu thiếu productId, trình xử lý 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ề JSON response 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. Trình xử lý 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.
  • Trình xử lý 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, nó cũng chuyển tiếp addons, on_demand và trial_period_days. Các field khác sẽ 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ề JSON response với payment link dưới dạng checkout URL:
Gửi payload của checkout session dưới dạng JSON body. Trình xử lý 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. 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 trình xử lý phản hồi 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ề JSON response chứa checkout URL:

Trình xử lý Customer Portal Route

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ư Checkout. Nếu Dodo Payments không thể tạo session, trình xử lý 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, sẽ gửi email chứa portal link cho khách hàng.
Trả về 400 nếu thiếu customer_id. Trình xử lý không xác thực request và mở portal cho bất kỳ customer_id nào nhận được, vì vậy hãy đặt route phía sau cơ chế xác thực riêng và chỉ truyền customer ID của người dùng đã đăng nhập.

Trình xử lý Webhook Route

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 trình xử lý sự kiện của bạn.
Webhook handler cần request body thô dưới dạng string, vì vậy hãy thêm content type parser cho application/json với parseAs: 'string'. Fastify áp dụng parser cho mọi route trong scope nơi bạn thêm parser. Hãy thêm parser bên trong một plugin chỉ đăng ký route webhook, như trong ví dụ. Nếu thêm trên root instance, parser cũng chuyển string cho các POST checkout handler, khiến chúng trả về 400.
  • 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 với 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 hoàn tất. Handler không bắt các lỗi do event handler của bạn throw.

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 xem Webhook Event Guide.

Prompt cho LLM

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