@dodopayments/hono cung cấp cho ứng dụng Hono của bạn ba route 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 yêu cầu 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 Hono 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:Package yêu cầu Hono 4.8.9 trở lên.
2
Set Up Environment Variables
Tạo file Tạo API key trong Developer → API Keys. Thêm webhook endpoint trong Developer → Webhooks và sao chép signing secret vào
.env trong thư mục gốc của project: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.Ví dụ về Route Handler
Các ví dụ đăng ký route trên một ứng dụng Hono được tạo bằng
new Hono(). Các handler tự đọc request body, vì vậy không cần body-parsing middleware.- Checkout Handler
- Customer Portal Handler
- Webhook Handler
Sử dụng handler này để tích hợp Dodo Payments checkout vào ứng dụng Hono của bạn. Hỗ trợ các flow static (GET), dynamic (POST) và session (POST). Đăng ký mỗi flow POST trên một path riêng, vì Hono dừng ở handler đầu tiên chạy cho một request.
Checkout Route Handler
Adaptor hỗ trợ cả ba flow checkout của Dodo Payments. Đặt
type trong cấu hình handler để chọn flow mà một route cung cấp. Mỗi flow phản hồi bằng 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 flow này cho các integration mới.
Checkout nhận các option sau:
Đăng ký handler cho GET khi
type là static, và cho POST khi type là dynamic hoặc session. Handler xem mọi request không phải POST là static checkout request.
Static Checkout (GET)
Static Checkout (GET)
Query Parameter được hỗ trợ
string
bắt buộc
Identifier của 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 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 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ệ cơ bản, 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.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.Định dạng Response
Static checkout trả về response JSON chứa checkout URL:Dynamic Checkout (POST)
Dynamic Checkout (POST)
- 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 và tạo thanh toán một lần trong trường hợp ngược lại.
- Body cần
billing(vớistreet,city,state,countryvàzipcode) cùngcustomer, cộng thêmproduct_id(vớiquantitytùy chọn) hoặcproduct_cart. Subscription cầnproduct_id. - Handler cũng chuyển tiếp
metadata,allowed_payment_method_types,billing_currency,discount_codes(hoặcdiscount_codeđã deprecated),return_url,show_saved_payment_methodsvàtax_id. Với subscription, handler cũng chuyển tiếpaddons,on_demandvàtrial_period_days. Các field khác bị bỏ qua. - Để biết chi tiết về field, xem:
Định dạng Response
Dynamic checkout trả về response JSON với payment link dưới dạng checkout URL:Checkout Sessions (POST)
Checkout Sessions (POST)
Gửi payload của checkout session dưới dạng JSON body. Handler tạo checkout session, session này xử lý toàn bộ flow thanh toán cho giao dịch mua một lần và subscription, rồi 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 bằng payment_method_id không trả về checkout_url, vì vậy handler 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ề 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 trongcustomer_id và chuyển hướng request đến portal link. CustomerPortal nhận các option bearerToken và environment, giống như Checkout. 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 đặt thành
true, sẽ gửi email chứa portal link cho khách hàng.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ạngwebhookKey, sau đó gọi các event handler của bạn. Handler tự đọc raw request body, vì vậy route không cần body-parsing middleware.
- 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-timestampvàwebhook-signaturebằngwebhookKey, theo specification 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 nếu 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
onPayloadcho 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 ném ra.