Skip to main content
Package @dodopayments/remix cung cấp cho ứng dụng Remix của bạn ba request handler. Checkout trả về các URL checkout, CustomerPortal đưa khách hàng đến Customer Portal, còn Webhooks xác minh các webhook event và định tuyến chúng đến code của bạn. Mỗi handler nhận một Request và trả về một Response, vì vậy bạn gọi nó từ loader hoặc action của route.

Checkout Handler

Tạo URL checkout từ ứng dụng Remix 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

Nhận và xác minh webhook event của Dodo Payments.

Cài đặt

1

Install the Package

Chạy lệnh này trong thư mục gốc của dự án:
Package này liệt kê Remix 2 (remix 2.16.8 trở lên) và zod 3.25 trở lên dưới dạng peer dependency.
2

Set Up Environment Variables

Tạo file .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. DODO_PAYMENTS_RETURN_URL là nơi khách hàng được chuyển đến sau checkout. Nếu bạn không truyền environment, các handler sẽ sử dụng live_mode.
Không bao giờ commit file .env hoặc secret vào version control.

Ví dụ về Route Handler

Các ví dụ là Remix resource route, export một loader cho request GET hoặc một action cho request POST và không có component. Với flat file route, app/routes/api.checkout.tsx cung cấp /api/checkout.
Sử dụng handler này để thêm checkout của Dodo Payments vào ứng dụng Remix của bạn. loader cung cấp static checkout. action cung cấp dynamic checkout tại đây. Để cung cấp checkout session — flow được khuyến nghị — thay vào đó hãy trả về checkoutSessionHandler(request) từ action.
Request checkout session hoạt động khi action trả về checkoutSessionHandler(request).

Checkout Route Handler

Checkout handler hỗ trợ cả ba cách nhận thanh toán với Dodo Payments:
  • Static Payment Links: URL có thể chia sẻ, dùng để thu tiền mà không cần code.
  • Dynamic Payment Links: payment link được tạo với các thông tin tùy chỉnh. Chúng sử dụng endpoint đã deprecated.
  • Checkout Sessions: checkout được host với giỏ hàng sản phẩm, thông tin khách hàng và các tùy chọn tùy chỉnh. Đây là flow được khuyến nghị.
Checkout nhận các tùy chọn sau:

Query Parameter được hỗ trợ

string
bắt buộc
Định danh sản phẩm, ví dụ ?productId=pdt_nZuwz45WAs64n3l07zpQR.
integer
mặc định:"1"
Số lượng sản phẩm.
string
Họ và 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
Dòng địa chỉ của khách hàng.
string
Thành phố của khách hàng.
string
Tiểu bang hoặc tỉnh của khách hàng.
string
Mã ZIP hoặc mã bưu chính của khách hàng.
boolean
Đặt thành true để tắt trường họ và 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 dòng địa chỉ.
boolean
Đặt thành true để tắt trường thành phố.
boolean
Đặt thành true để tắt trường tiểu bang.
boolean
Đặt thành true để tắt trường mã ZIP.
string
Đơn vị tiền tệ thanh toán, ví dụ USD.
boolean
mặc định:"true"
Hiện hoặc ẩn bộ chọn tiền tệ.
number
Cố định số tiền được tính, theo đơn vị tiền tệ cơ bản, ví dụ 12.5 cho $12.50. Chỉ hoạt động với sản phẩm Pay What You Want và bị bỏ qua nếu thấp hơn giá tối thiểu của sản phẩm.
boolean
mặc định:"true"
Hiện hoặc ẩn phần giảm giá.
string
Mọi query parameter bắt đầu bằng metadata_ đều được truyền dưới dạng metadata.
Handler thêm returnUrl từ config của nó vào link dưới dạng redirect_url.
Nếu thiếu productId, handler trả về response 400. Query parameter không hợp lệ và product ID không tồn tại cũng trả về 400.

Định dạng Response

Static checkout trả về JSON response chứa checkout URL. Ở test mode, URL sử dụng test.checkout.dodopayments.com.
Dynamic checkout proxy đến các endpoint POST /payments và POST /subscriptions đã deprecated. Nó tiếp tục hoạt động cho các integration hiện có, nhưng integration mới nên sử dụng checkout session.

Định dạng Response

Dynamic checkout trả về JSON response chứa checkout URL:
Checkout session tạo checkout được host cho giao dịch mua một lần và subscription, với toàn quyền kiểm soát việc tùy chỉnh. product_cart là field bắt buộc duy nhất. Nếu body không có return_url, handler sử dụng returnUrl từ config của nó.Để biết thêm chi tiết và xem mọi field được hỗ trợ, hãy xem Checkout Sessions Integration Guide.Session được tạo với payment_method_id không trả về checkout URL, vì vậy handler phản hồi 400. Để tính phí bằng payment method đã lưu, hãy tạo session bằng SDK.

Định dạng Response

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

Customer Portal Route Handler

Customer Portal route handler tạo một Customer Portal session cho khách hàng bạn truyền vào và chuyển hướng trình duyệt đến đó bằng response 307.
Handler không kiểm tra ai đang gọi nó. Bất kỳ ai request với customer ID đều nhận được portal của customer đó. Hãy bảo vệ route bằng cơ chế xác thực riêng của bạn và chỉ truyền customer ID của người dùng đã đăng nhập.

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, Dodo Payments cũng gửi link portal qua email cho khách hàng.
Trả về 400 nếu thiếu customer_id và 500 nếu không thể tạo portal session.

Webhook Route Handler

Webhook route handler xác minh từng request trước khi chạy code của bạn:
  • Method: Chỉ hỗ trợ request POST. Các method khác trả về 405.
  • Signature Verification: Xác minh raw request body cùng 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 payload bằng Zod. Trả về 400 nếu payload không hợp lệ.
  • Error Handling:
    • 401: Chữ ký 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.
Adaptor không bắt các lỗi được throw trong handler của bạn. Các lỗi đó lan truyền đến Remix và request thất bại.

Webhook Event Handler được hỗ trợ

Mỗi handler nhận payload đã được xác minh cho type event tương ứng:
Để biết ý nghĩa của từng event, hãy xem Webhook Event Guide.

Prompt cho LLM

Sao chép prompt này vào AI coding assistant để yêu cầu nó thêm adaptor vào dự án của bạn. Để cung cấp cho agent cả tài liệu và skill của Dodo Payments, hãy cài đặt Agent Plugin.
Lần sửa đổi cuối 26 tháng 9, 2026