Skip to main content
Package @dodopayments/bun cung cấp cho máy chủ Bun của bạn ba trình xử lý request. Checkout trả về các URL checkout, CustomerPortal chuyển khách hàng đến Customer Portal, còn Webhooks xác minh các sự kiện webhook và chuyển chúng đến code của bạn. Mỗi trình xử lý nhận một Request tiêu chuẩn và trả về một Response, vì vậy bạn gọi nó từ trình xử lý fetch của Bun.serve().

Checkout Handler

Tạo các URL checkout bằng các flow static, dynamic và checkout session.

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ử lý các sự kiện webhook 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 project:
Package này cũng cần zod 3.25 trở lên, được liệt kê dưới dạng peer dependency.
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, rồi sao chép Signing secret vào DODO_PAYMENTS_WEBHOOK_KEY:
Bun tự động đọc các file .env, vì vậy các ví dụ đọc những giá trị này từ process.env. 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 trình xử lý sẽ sử dụng live_mode. API key ở test mode chỉ hoạt động với test_mode.
Không commit file .env hoặc secrets vào version control.

Ví dụ về Route Handler

Tất cả ví dụ đều sử dụng native server của Bun, Bun.serve(), và định tuyến request theo path và method trong trình xử lý fetch của nó.
Sử dụng trình xử lý này để thêm checkout của Dodo Payments vào máy chủ Bun. Trình xử lý static phục vụ các request GET. Trình xử lý session và dynamic phục vụ các request POST. Ví dụ dynamic checkout giả định máy chủ trả về dynamicCheckoutHandler(request) cho các request POST.

Checkout Route Handler

Checkout handler hỗ trợ cả ba cách nhận thanh toán bằng Dodo Payments:
  • Static Payment Links: Các URL có thể chia sẻ, dùng để thu payment mà không cần code.
  • Dynamic Payment Links: Các payment link được tạo với thông tin tùy chỉnh. Chúng sử dụng các endpoint đã deprecated.
  • Checkout Sessions: Checkout được host với product cart, 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: Trình xử lý phục vụ static checkout cho các request GET. Với các request POST, trình xử lý tạo dynamic payment link khi type là dynamic, và tạo checkout session trong các trường hợp còn lại.

Query Parameters được hỗ trợ

string
bắt buộc
Mã định danh product, ví dụ ?productId=pdt_xxx.
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 firstName hoặc lastName được cung cấp.
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ã ZIP hoặc mã bưu chính 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 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 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 thị hoặc ẩn currency selector.
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 discounts.
string
Mọi query parameter bắt đầu bằng metadata_ sẽ được truyền đến checkout dưới dạng metadata, ví dụ metadata_orderId=123.
Cờ disable chỉ có hiệu lực khi trường tương ứng có giá trị, ví dụ email cùng với disableEmail=true. Trình xử lý thêm returnUrl từ config của nó vào link dưới dạng redirect_url.
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 trả về 400.

Response Format

Static checkout trả về response JSON chứa checkout URL. Ở test mode, URL sử dụng test.checkout.dodopayments.com:
  • Gửi các parameter dưới dạng JSON body trong POST request.
  • Hỗ trợ cả payment one-time và recurring. Trình xử lý lấy product, sau đó tạo subscription nếu product là recurring và tạo payment one-time trong trường hợp ngược lại.
  • Body cần billing (với street, city, state, country và zipcode) và customer, cùng với product_id hoặc product_cart. Subscription cần product_id.
  • Để xem mọi body field được hỗ trợ, hãy xem:
Dynamic checkout proxy đến các endpoint POST /payments và POST /subscriptions đã deprecated. Nó vẫn hoạt động với các integration hiện có, nhưng integration mới nên sử dụng checkout session.

Response Format

Dynamic checkout trả về response JSON với payment link dưới dạng checkout URL:
Checkout session tạo checkout được host cho các giao dịch mua one-time 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 và cần ít nhất một product. Nếu body không có return_url, trình xử lý sử dụng returnUrl từ config của nó.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.Để biết thêm chi tiết và xem mọi field được hỗ trợ, hãy xem Checkout Sessions Integration Guide.

Response Format

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

Customer Portal Route Handler

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

Query Parameters

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 email portal link cho khách hàng.
Trình xử lý trả về 400 nếu thiếu customer_id và trả về 500 nếu không thể tạo portal session.

Webhook Route Handler

Webhook route handler xác minh mỗi request bằng webhook secret của bạn, được truyền dưới dạng webhookKey, trước khi chạy code của bạn:
  • Method: Chỉ hỗ trợ POST request. 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: Phân tích body dưới dạng JSON và xác thực bằng Zod. Trả về 400 nếu JSON không hợp lệ hoặc 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.
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 Bun.serve() và request thất bại.

Webhook Event Handler được hỗ trợ

Mỗi handler đều là tùy chọn và async, đồng thời nhận payload đã được xác minh cho event type 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 của bạn để thêm adaptor vào project. Để cung cấp cho agent của bạn tài liệu và skills của Dodo Payments, hãy cài đặt Agent Plugin.
Lần sửa đổi cuối 26 tháng 9, 2026