Dodo 支付

Dodo Payments 是一个全球性的 Merchant-of-Record(交易记录商)平台,帮助人工智能、SaaS 和数字业务在 150 多个国家销售产品,无需处理税务、欺诈或合规问题。通过一个对开发者友好的 API,即可实现结算、账单管理和付款分发,让你在几分钟内就能在全球范围内上线。

在 Dodo Payments 的 Discord 上获取支持

该插件由 Dodo Payments 团队维护。
有问题吗?我们的团队随时在 Discord 上为您提供帮助。

功能特性

  • 注册时自动创建客户
  • 通过产品短链映射实现类型安全的结算流程
  • 自助式客户门户
  • 带签名验证的实时 Webhook 事件处理

开始使用 Dodo Payments

使用此集成需要拥有 Dodo Payments 账户和 API 密钥。

安装

在项目根目录运行以下命令:

npm install @dodopayments/better-auth dodopayments better-auth zod

将这些添加到你的 .env 文件中:

DODO_PAYMENTS_API_KEY=your_api_key_here
DODO_PAYMENTS_WEBHOOK_SECRET=your_webhook_secret_here

创建或更新 src/lib/auth.ts

import { betterAuth } from "better-auth";
import {
  dodopayments,
  checkout,
  portal,
  webhooks,
} from "@dodopayments/better-auth";
import DodoPayments from "dodopayments";

export const dodoPayments = new DodoPayments({
  bearerToken: process.env.DODO_PAYMENTS_API_KEY!,
  environment: "test_mode"
});

export const auth = betterAuth({
  plugins: [
    dodopayments({
      client: dodoPayments,
      createCustomerOnSignUp: true,
      use: [
        checkout({
          products: [
            {
              productId: "pdt_xxxxxxxxxxxxxxxxxxxxx",
              slug: "premium-plan",
            },
          ],
          successUrl: "/dashboard/success",
          authenticatedUsersOnly: true,
        }),
        portal(),
        webhooks({
          webhookKey: process.env.DODO_PAYMENTS_WEBHOOK_SECRET!,
          onPayload: async (payload) => {
            console.log("Received webhook:", payload.event_type);
          },
        }),
      ],
    }),
  ],
});

生产环境请将 environment 设置为 live_mode

创建或更新 src/lib/auth-client.ts

import { dodopaymentsClient } from "@dodopayments/better-auth";

export const authClient = createAuthClient({
  baseURL: process.env.BETTER_AUTH_URL || "http://localhost:3000",
  plugins: [dodopaymentsClient()],
});

使用说明

创建支付会话

const { data: checkout, error } = await authClient.dodopayments.checkout({
  slug: "premium-plan",
  customer: {
    email: "customer@example.com",
    name: "John Doe",
  },
  billing: {
    city: "San Francisco",
    country: "US",
    state: "CA",
    street: "123 Market St",
    zipcode: "94103",
  },
  referenceId: "order_123",
});

if (checkout) {
  window.location.href = checkout.url;
}

访问客户门户

const { data: customerPortal, error } = await authClient.dodopayments.customer.portal();
if (customerPortal && customerPortal.redirect) {
  window.location.href = customerPortal.url;
}

列出客户数据

// 获取订阅
const { data: subscriptions, error } =
  await authClient.dodopayments.customer.subscriptions.list({
    query: {
      limit: 10,
      page: 1,
      active: true,
    },
  });

// 获取支付历史
const { data: payments, error } = await authClient.dodopayments.customer.payments.list({
  query: {
    limit: 10,
    page: 1,
    status: "succeeded",
  },
});

Webhooks

Webhooks 插件通过安全签名验证处理来自 Dodo Payments 的实时支付事件。默认端点为 /api/auth/dodopayments/webhooks

在 Dodo Payments 仪表板中为你的端点 URL(例如 https://your-domain.com/api/auth/dodopayments/webhooks)生成一个 webhook 密钥,并在你的 .env 文件中设置:

DODO_PAYMENTS_WEBHOOK_SECRET=your_webhook_secret_here

示例处理程序:

webhooks({
  webhookKey: process.env.DODO_PAYMENTS_WEBHOOK_SECRET!,
  onPayload: async (payload) => {
    console.log("收到 webhook:", payload.event_type);
  },
});

配置参考

插件选项

  • client (必需): DodoPayments 客户端实例
  • createCustomerOnSignUp (可选): 用户注册时自动创建客户
  • use (必需): 需要启用的插件数组 (checkout, portal, webhooks)

结账插件选项

  • products: 产品数组或返回产品的异步函数
  • successUrl: 支付成功后重定向的 URL
  • authenticatedUsersOnly: 需要用户认证 (默认: false)

如遇任何问题,请查阅 Dodo Payments 文档 获取故障排除步骤。

On this page