# 如何在一个下午为 SaaS 设置订阅计费

> 快速实现 SaaS 产品订阅付款的指南。借助 Dodo Payments，在 4 小时内从零开始上线周期性计费，无需构建计费基础设施。
- **Author**: Ayush Agarwal
- **Published**: 2026-03-30
- **Category**: Payments, SaaS, How-To
- **URL**: https://dodopayments.com/blogs/zh/set-up-subscription-billing-afternoon

---

你已经构建了 SaaS 的核心功能。仪表板看起来很棒，API 响应迅速，早期测试用户也很满意。现在，所有创始人都不愿面对的部分来了：设置计费系统。如果你搜索如何实现订阅计费的指南，就会发现其中充满了复杂性。大多数文章描述的流程都需要数周时间。你会被告知需要为订阅状态设计复杂的数据库架构、构建客户计费门户、为失败的付款实现催收逻辑、计算升级时的按比例计费金额，还要在数十个国家注册销售税。

现实是，大多数创始人都低估了构建可靠计费引擎所需的大量工作。这不只是每月扣款一次。你必须考虑付款失败时会发生什么。你是立即停止访问，还是给用户一段宽限期？如果客户想在计费周期中途从月度套餐切换到年度套餐，你该如何处理？这些问题会带来数周的开发时间，以及成千上万行与核心产品毫无关系的定制代码。

这足以让任何开发者都想推迟发布。但事情不必如此。你不需要花一个月构建计费引擎，才能收取第一笔款项。在本指南中，我们将向你展示如何在一个下午内，从零开始构建一个功能完整的全球订阅计费系统。通过使用 Dodo Payments 这样的 MoR（名义商户），你可以跳过基础设施建设，把精力集中在产品上。

## 订阅计费中隐藏的复杂性

订阅计费比一次性付款难得多。当你销售单个数字产品时，付款完成后交易就结束了。而对于订阅，交易只是长期关系的开始，需要持续维护。你实际上是在构建一个状态机，必须实时跟踪每位用户的计费状态。

> 你在第一个月选择的计费模式，会限制你第二年的定价灵活性。从一开始就构建在支持订阅、用量、预付额度和混合模式的基础设施上。
>
> \- Ayush Agarwal，Dodo Payments 联合创始人兼 CPTO

标准的 DIY 订阅技术栈需要多个环节协同工作。你需要一个与后端保持同步的定价页面，还需要一个能够处理 3D Secure 和本地支付方式的安全结账流程。用户订阅后，你必须管理周期性扣款，包括处理过期卡片和非自愿流失。如果用户想从月度套餐升级到年度套餐，你必须计算他们应付的按比例计费金额，或应获得的预付额度。这类计算出了名地难以正确处理，错误操作可能导致严重的收入流失。

标准的 DIY 订阅技术栈需要多个环节协同工作。你需要一个与后端保持同步的定价页面，还需要一个能够处理 3D Secure 和本地支付方式的安全结账流程。用户订阅后，你必须管理周期性扣款，包括处理过期卡片和非自愿流失。如果用户想从月度套餐升级到年度套餐，你必须计算他们应付的按比例计费金额，或应获得的预付额度。

此外还有合规负担。在全球销售软件，意味着你要对客户所在的每个司法管辖区承担 VAT 和销售税的收取与缴纳责任。仅这一项就可能需要数周的研究，以及与第三方税务工具的集成。再加上催收管理、开具发票和处理退款所耗费的时间，就很容易理解为什么计费会成为许多工程团队的全职工作。你还必须关注 PCI 合规，确保自己不会直接接触敏感的卡片数据。

## MoR 如何简化一切

像 Dodo Payments 这样的 MoR（名义商户）会通过承担交易的法律责任来改变整个局面。不是你向客户销售，而是 Dodo Payments 代表你向客户销售。这一细微变化可以消除设置计费所需工作量的约 90%。

使用 MoR 后，你不需要在 50 个不同国家注册税务。Dodo Payments 会自动处理所有税款的收取与缴纳。你不需要构建用于重试失败付款的催收系统，因为这些功能已经内置。你甚至不需要生成发票或处理拒付争议。所有这些功能都由平台管理，让你只需几行代码就能实现面向 SaaS 的[计费自动化](https://dodopayments.com/blogs/billing-automation-saas)。这意味着你可以进入欧盟或印度等新市场，而无需担心当地税法或支付偏好。

## 4 小时下午计划

我们将实现过程拆分成一个四小时冲刺。四小时结束时，你将拥有一个上线的定价页面、安全的结账流程，以及一个在用户付款后自动授予访问权限的后端。

```mermaid
flowchart LR
    A[Hour 1: Setup] -->|"Products & Pricing"| B[Hour 2: Frontend]
    B -->|"Overlay Checkout"| C[Hour 3: Backend]
    C -->|"Webhook Handler"| D[Hour 4: Launch]
    D -->|"Test & Go Live"| E[Live Revenue]
```

### 第 1 小时：配置仪表板

第一个小时用于定义你要销售的内容。登录 Dodo Payments 仪表板，进入 Products 部分。在这里创建订阅层级。对于大多数 SaaS 产品，简单的"Pro"和"Enterprise"结构效果最好。你也应该认真考虑自己的[订阅定价模式](https://dodopayments.com/blogs/subscription-pricing-models)。你会收取固定费用，还是根据用量采用分层定价？Dodo Payments 支持多种模式，方便你随着业务增长灵活调整。

创建产品时，你需要定义计费周期（月度或年度）和价格。如果想为新用户提供 14 天免费试用，也可以设置试用期。现在也是配置品牌设置的好时机。上传你的 Logo 并选择品牌颜色，让结账体验看起来像应用原生的一部分。在付款过程中保持一致性，是建立客户信任的关键。

创建产品时，你需要定义计费周期（月度或年度）和价格。如果想为新用户提供 14 天免费试用，也可以设置试用期。现在也是配置品牌设置的好时机。上传你的 Logo 并选择品牌颜色，让结账体验看起来像应用原生的一部分。

在仪表板中定义[订阅定价模式](https://dodopayments.com/blogs/subscription-pricing-models)，可以避免在应用中硬编码价格。这样，之后运行实验或修改价格时，无需部署新代码即可完成。

### 第 2 小时：集成浮层结账

第二个小时，我们会将结账按钮添加到定价页面。Dodo Payments 提供[浮层结账](https://docs.dodopayments.com/developer-resources/overlay-checkout)，会以模态窗口的形式在网站上方打开。这是[接受在线付款](https://dodopayments.com/blogs/how-to-accept-online-payments)最快的方式，因为你无需进行任何 UI 开发。你不必担心构建单独的结账页面或管理跳转。浮层能够保留用户上下文，通常可以带来更高的转化率。

首先，将 Dodo Payments SDK 引入前端。你可以通过 npm 安装，也可以通过 script 标签引入。

```javascript
import { DodoPayments } from "dodopayments-js";

// Initialize the SDK
DodoPayments.Initialize({
  mode: "test", // Use 'live' for production
  onEvent: (event) => {
    if (event.type === "checkout.success") {
      window.location.href = dashboardUrl + "?success=true";
    }
  },
});
```

现在，为每个定价层级创建一个按钮。当用户点击按钮时，调用 `checkout` 方法，并传入你在第 1 小时创建的产品 ID。

```javascript
const handleSubscribe = (productId) => {
  DodoPayments.Checkout({
    productId: productId,
    customer: {
      email: user.email,
      name: user.name,
    },
  });
};

// Your React/Vue/Svelte component
<button onClick={() => handleSubscribe("prod_123")}>
  Get Started with Pro
</button>;
```

这种设置让用户留在你的网站上，提供流畅的[嵌入式 SaaS 支付](https://dodopayments.com/blogs/embedded-payments-saas)体验。浮层会自动处理信用卡输入、3D Secure 身份验证，以及 UPI 或 Pix 等本地化支付方式。

### 第 3 小时：构建 Webhook 处理程序

第三个小时对后端最为重要。前端负责处理付款的同时，后端需要知道订阅何时创建、续订或取消。我们通过 Webhook 来实现。Webhook 是连接支付平台与应用逻辑的纽带。没有它们，你的数据库很快就会与用户的实际计费状态不同步。

Webhook 是 Dodo Payments 在事件发生时发送到服务器的 POST 请求。你需要创建一个监听这些事件的端点（例如 `/api/webhooks/dodo`）。你应该使用 [Dodo Payments SDK](https://docs.dodopayments.com/developer-resources/dodo-payments-sdks) 验证 Webhook 签名，确保请求真实有效。这一步对安全至关重要，因为它可以防止恶意行为者伪造支付事件。

Webhook 是 Dodo Payments 在事件发生时发送到服务器的 POST 请求。你需要创建一个监听这些事件的端点（例如 `/api/webhooks/dodo`）。你应该使用 [Dodo Payments SDK](https://docs.dodopayments.com/developer-resources/dodo-payments-sdks) 验证 Webhook 签名，确保请求真实有效。

```javascript
import DodoPayments from "dodopayments";

const client = new DodoPayments({
  bearerToken: process.env.DODO_PAYMENTS_API_KEY,
  webhookKey: process.env.DODO_PAYMENTS_WEBHOOK_KEY,
});

export default async function handler(req, res) {
  try {
    const event = client.webhooks.unwrap(req.body.toString(), {
      headers: {
        "webhook-id": req.headers["webhook-id"],
        "webhook-signature": req.headers["webhook-signature"],
        "webhook-timestamp": req.headers["webhook-timestamp"],
      },
    });

    switch (event.type) {
      case "subscription.active":
        await updateUserSubscriptionStatus(event.data.customer_email, "active");
        break;
      case "subscription.cancelled":
        await updateUserSubscriptionStatus(
          event.data.customer_email,
          "cancelled",
        );
        break;
      case "payment.failed":
        // Dodo handles retries, but you might want to log this
        console.log(`Payment failed for ${event.data.customer_email}`);
        break;
    }

    res.status(200).json({ received: true });
  } catch (err) {
    res.status(400).send(`Webhook Error: ${err.message}`);
  }
}
```

这份[集成指南](https://docs.dodopayments.com/developer-resources/integration-guide)可确保你的用户数据库始终与实际支付状态同步。现在，你可以在中间件中使用这一状态来保护高级功能路由。

### 第 4 小时：测试并上线

最后一个小时用于测试完整流程。使用文档中提供的测试卡号，模拟成功付款、失败付款和 3D Secure 挑战。确认 Webhook 处理程序能正确更新数据库，并且用户在结账后会被跳转到正确页面。

确认无误后，将仪表板切换到"Live"模式，更新环境变量中的 API 密钥，并将 SDK 模式改为 `live`。现在，你已经可以面向 220 多个国家和地区的客户[在线销售软件](https://dodopayments.com/blogs/how-to-sell-software-online)了。

## DIY 计费 vs. Dodo Payments

为了理解下午完成这一切为何如此强大，让我们将它与传统的 DIY 路径进行比较。

| 功能         | DIY（Stripe/PayPal）     | Dodo Payments（MoR） |
| :----------- | :----------------------- | :------------------- |
| **设置时间** | 2-4 周                   | 4 小时               |
| **全球税务** | 手动 / 第三方工具        | 全自动               |
| **催收**     | 需要自定义逻辑           | 内置并托管           |
| **开具发票** | 自定义模板和逻辑         | 自动生成 PDF 发票    |
| **合规**     | 你是销售方               | Dodo 是销售方        |
| **维护**     | 高（API 更新、税法变化） | 低（托管基础设施）   |

选择面向 SaaS 的[名义商户](https://dodopayments.com/blogs/merchant-of-record-for-saas)，不仅能节省初始设置时间，还能消除[周期性计费替代方案](https://dodopayments.com/blogs/recurring-billing-alternatives)所带来的持续维护负担。

## 处理上线后的边缘情况

计费上线后，你可以开始考虑更高级的场景。一个常见问题是[付款失败导致的非自愿流失](https://dodopayments.com/blogs/involuntary-churn-failed-payments)。Dodo Payments 会自动重试卡片付款，并向用户发送更新支付方式的邮件，从而处理这一问题。这项内置的[催收管理](https://dodopayments.com/blogs/dunning-management)可以挽回原本可能损失的最高 10% 收入。你还可以直接在仪表板中查看 [SaaS 指标](https://dodopayments.com/blogs/saas-metrics-kpi)，了解 MRR 如何随时间增长。

之后你可能还想添加年度套餐，以改善现金流。由于你已在仪表板中定义产品，添加年度层级就像创建新产品并在定价页面添加第二个按钮一样简单。[订阅文档](https://docs.dodopayments.com/developer-resources/subscription-integration-guide)提供了处理套餐变更和取消的详细示例。随着业务规模扩大，你还可以探索适用于复杂产品的[基于用量的计费](https://dodopayments.com/blogs/usage-based-billing-saas)。查看我们的[定价](https://dodopayments.com/pricing)页面，了解我们如何在每个阶段助力你的增长。

之后你可能还想添加年度套餐，以改善现金流。由于你已在仪表板中定义产品，添加年度层级就像创建新产品并在定价页面添加第二个按钮一样简单。[订阅文档](https://docs.dodopayments.com/developer-resources/subscription-integration-guide)提供了处理套餐变更和取消的详细示例。

## 常见问题

### 申请实时账户需要多长时间？

大多数账户会在 24 小时内完成审核并获批。注册后，你可以立即开始在测试模式下进行集成，因此无需等待审批即可开始下午的冲刺。

### Dodo Payments 会处理销售税和 VAT 吗？

会。作为 MoR（名义商户），Dodo Payments 对 220 多个国家和地区的销售税、VAT 和 GST 的计算、收取与缴纳承担法律责任。你无需在这些司法管辖区中的任何一个注册税务。

### 我可以提供无需信用卡的免费试用吗？

当然可以，你可以在应用中提供无需卡片的免费层级。如果想使用 Dodo Payments 的试用功能，用户需要预先输入卡片信息；试用结束时，系统会自动扣款，除非用户取消。

### 如果用户付款失败，会发生什么？

Dodo Payments 内置了催收系统，会在数天内自动重试付款。我们还会向客户发送自动邮件，请求其更新付款信息。如果订阅最终变为非活跃状态，你会收到 Webhook 通知。

### 我可以自定义结账浮层的外观吗？

可以。你可以在仪表板中自定义主色、Logo 和企业名称。浮层设计简洁专业，能够自然融入任何现代 SaaS 应用。

## 总结

从零构建计费系统，是"重新发明轮子"的经典例子。除非你的核心产品就是计费平台，否则你更应该把时间用于构建让 SaaS 与众不同的功能。按照这套下午计划，你可以实现一套世界级的[最佳订阅计费软件](https://dodopayments.com/blogs/best-subscription-billing-software)，从第一位客户一路扩展到首个百万收入。

准备好开始了吗？今天就[注册 Dodo Payments](https://dodopayments.com)，在晚餐前上线。
---
- [More Payments articles](https://dodopayments.com/blogs/category/payments)
- [All articles](https://dodopayments.com/blogs)