Skip to main content

Tổng quan

Adaptor Better Auth, @dodopayments/better-auth, là một plugin Better Auth kết nối người dùng của bạn với Dodo Payments. Plugin cung cấp:
  • Tùy chọn tạo khách hàng hoặc liên kết khách hàng dựa trên email khi đăng ký
  • Các phiên checkout, phương thức checkout được ưu tiên, với ánh xạ product slug
  • Customer Portal tự phục vụ
  • Các endpoint tiếp nhận và báo cáo mức sử dụng cho tính phí dựa trên mức sử dụng
  • Xử lý sự kiện webhook với xác minh chữ ký
  • TypeScript types cho mọi endpoint
Bạn cần có tài khoản Dodo Payments và khóa API để sử dụng tích hợp này.

Điều kiện tiên quyết

  • Node.js 16 trở lên
  • Quyền truy cập vào dashboard Dodo Payments
  • Một project hiện có sử dụng Better Auth 1.4 hoặc bản phát hành 1.x mới hơn

Cài đặt

1

Install Dependencies

Chạy command này trong thư mục gốc của project:
Adaptor, Dodo Payments SDK, Better Auth và Zod đã được cài đặt.

Cấu hình

1

Configure Environment Variables

Thêm các biến này vào file .env. Tạo API key trong Developer → API Keys trên dashboard. Bạn nhận webhook secret khi thêm webhook endpoint, như mô tả trong mục Webhooks trên trang này. BETTER_AUTH_SECRET là một chuỗi ngẫu nhiên có ít nhất 32 ký tự.
Không bao giờ đưa khóa API hoặc bí mật vào hệ thống kiểm soát phiên bản.
2

Set Up Server-Side Integration

Tạo hoặc cập nhật src/lib/auth.ts:
Plugin thêm một trường dodoCustomerId vào bảng user của Better Auth, nơi lưu Dodo Payments customer ID của từng người dùng. Sau khi thêm plugin, hãy cập nhật database schema bằng Better Auth CLI.
Đặt environment thành live_mode cho production.
3

Set Up Client-Side Integration

Tạo hoặc cập nhật src/lib/auth-client.ts:

Ví dụ sử dụng

Sử dụng authClient.dodopayments.checkoutSession cho các tích hợp mới. Phương thức checkout cũ đã deprecated và chỉ được giữ lại để tương thích ngược.

Tạo Checkout Session (Được ưu tiên)

Tạo một checkout session từ slug đã cấu hình hoặc từ product cart, sau đó redirect khách hàng đến URL được trả về:
checkoutSession tự động điền một số trường cho bạn:
  • Billing address: Không bắt buộc ngay từ đầu vì checkout sẽ thu thập thông tin này từ khách hàng. Để điền trước, hãy truyền billing_address.
  • Customer: Với người dùng đã đăng nhập, plugin sử dụng email và tên từ Better Auth session của họ và bỏ qua mọi object customer mà bạn truyền vào. Khi không có người dùng đã đăng nhập, plugin sử dụng object customer.
  • Các trường khác: Argument chấp nhận các trường giống request body của endpoint Create Checkout Session, cùng với slug và referenceId.
Nếu slug chưa được cấu hình hoặc bạn không truyền slug cũng như product_cart, request sẽ thất bại với lỗi 400.
Return URL lấy từ successUrl được cấu hình trong server plugin, và được phân giải dựa trên URL của app. Plugin bỏ qua mọi return_url trong client payload.

Checkout cũ (Deprecated)

Phương thức authClient.dodopayments.checkout đã deprecated. Hãy sử dụng checkoutSession cho các triển khai mới.
Phương thức cũ yêu cầu billing và customer, đồng thời tạo payment link thông qua dynamic checkout flow đã deprecated. Các trường bạn đặt trong customer sẽ ghi đè email và tên từ session.

Truy cập Customer Portal

Các portal endpoint yêu cầu người dùng đã đăng nhập với địa chỉ email đã được xác minh. Nếu người dùng chưa có Dodo Payments customer, plugin sẽ tìm một customer theo email hoặc tạo customer mới. INLINE_CODE_PLACEHOLDER_baf0df18400b3e6_END trả về URL của portal:

Liệt kê dữ liệu khách hàng

Liệt kê subscriptions và payments của khách hàng đã đăng nhập. page bắt đầu từ 1 và status lọc các kết quả:

Theo dõi mức sử dụng được đo lường

Bật plugin usage() trên server để ghi nhận các sự kiện sử dụng cho việc tính phí dựa trên mức sử dụng và cho phép khách hàng xem mức sử dụng của họ. Cả hai method đều yêu cầu người dùng đã đăng nhập với địa chỉ email đã được xác minh.
  • authClient.dodopayments.usage.ingest ghi nhận một event cho người dùng đã đăng nhập.
  • authClient.dodopayments.usage.meters.list liệt kê các sự kiện sử dụng của khách hàng đã đăng nhập. Method này chấp nhận các query parameter page_number, page_size, event_name, meter_id, start và end.
Dodo Payments từ chối các event có timestamp cách hiện tại hơn một giờ về quá khứ hoặc hơn năm phút về tương lai.
Nếu bỏ qua meter_id, danh sách sẽ bao gồm tất cả sự kiện sử dụng của khách hàng. Khi có meter_id, danh sách chỉ bao gồm các event khớp với meter đó.

Webhooks

Webhooks plugin xác minh chữ ký của từng Dodo Payments event và gọi các handler của bạn. Endpoint mặc định là /api/auth/dodopayments/webhooks.
1

Generate and Set Webhook Secret

Trong dashboard, đi đến Developer → Webhooks và thêm endpoint URL của bạn, ví dụ https://<your-domain>/api/auth/dodopayments/webhooks. Sao chép signing secret của endpoint vào file .env:
2

Handle Webhook Events

Truyền một handler cho mỗi event bạn muốn xử lý. onPayload được chạy cho mọi event:
Nếu xác minh chữ ký thất bại hoặc một handler throw error, endpoint trả về 400. Sau khi các handler hoàn tất, endpoint trả về { received: true }.

Các Webhook Event Handler được hỗ trợ

Mỗi handler nhận payload đã được xác minh cho loại event tương ứng:

Tài liệu tham khảo về cấu hình

  • client (bắt buộc): DodoPayments client instance
  • createCustomerOnSignUp (tùy chọn): Tạo Dodo Payments customer khi người dùng đăng ký hoặc liên kết customer hiện có với cùng email. Plugin cũng cập nhật customer khi thông tin người dùng thay đổi.
  • use (bắt buộc): Mảng các plugin cần bật (checkout, portal, usage, webhooks)
  • getCustomerParams (tùy chọn): Function nhận Better Auth User và trả về các trường bổ sung để đính kèm vào Dodo Payments customer khi tạo và cập nhật (ví dụ metadata, phone_number). Function này có thể là async.
  • products: Mảng các object { productId, slug } hoặc một async function trả về một object
  • successUrl: URL để redirect đến sau khi thanh toán thành công
  • authenticatedUsersOnly: Yêu cầu xác thực người dùng (mặc định: false)

Khắc phục sự cố & Mẹo

  • Invalid API key: Kiểm tra DODO_PAYMENTS_API_KEY trong .env và kiểm tra mode của key có khớp với environment hay không.
  • Webhook signature mismatch: Kiểm tra webhook secret có khớp với secret được đặt trong dashboard Dodo Payments hay không.
  • Customer not created: Kiểm tra createCustomerOnSignUp đã được đặt thành true chưa.
  • Portal hoặc usage requests trả về 401: Địa chỉ email của người dùng chưa được xác minh.
  • Sử dụng environment variables cho tất cả secret và key.
  • Kiểm thử trong test_mode trước khi chuyển sang live_mode.
  • Ghi log webhook event để debug và audit.

Prompt cho LLM

Sao chép prompt này vào AI coding assistant để thêm adaptor vào project 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