# 如何在 SaaS 模板中替换 Stripe

> 开发者迁移指南：介绍如何在 ShipFast、supastarter 和 Makerkit 等热门 SaaS 模板中，从 Stripe 迁移到 Dodo Payments，自动处理全球税务和合规事务。
- **Author**: Ayush Agarwal
- **Published**: 2026-03-25
- **Category**: Payments, Developer Tools, How-To
- **URL**: https://dodopayments.com/blogs/zh/replace-stripe-saas-boilerplate

---

SaaS 模板彻底改变了我们构建初创公司的方式。ShipFast、supastarter 和 Makerkit 等工具预先配置了身份验证、数据库架构和 UI 组件，为开发提供了巨大的领先优势。然而，几乎所有这类工具都有一个重要前提：你将使用 Stripe。Stripe 虽然是一款出色的工具，但它常常给个人创始人和小型团队带来沉重的行政负担：全球税务合规。随着业务增长，并开始向世界各地不同地区的客户销售产品，这项负担很快就可能变成一份全职工作。

如果你向欧盟、英国或其他数十个司法管辖区的客户销售产品，仅靠 Stripe 是不够的。你要么使用 Stripe Tax（价格昂贵，而且只会告诉你应缴多少税，却不会代你实际申报和缴纳），要么集成第三方税务服务。这就是为什么许多开发者正在寻找能够处理"MoR（名义商户）"职责的 [stripe alternatives](https://dodopayments.com/blogs/stripe-alternatives) 和 [stripe billing alternatives](https://dodopayments.com/blogs/stripe-billing-alternatives)。MoR（名义商户）不仅仅是支付处理商；它还是一个承担全球销售相关法律责任的合作伙伴。

在本指南中，我们将介绍如何在任何现代 SaaS 模板中用 Dodo Payments 替换 Stripe。完成切换后，你可以将全球税务、合规和结算交给我们，从而专注于产品本身。我们将涵盖从设置环境变量到处理复杂订阅生命周期的所有内容。读完本文后，你将清楚了解如何构建真正全球化的 SaaS，而不再被税务问题困扰。

## 为什么要替换 Stripe？MoR（名义商户）的优势

切换的主要原因，是从"支付处理商"转变为"MoR（名义商户）"。使用 Stripe 时，你是法律上的销售方。你需要负责计算 VAT、GST 和销售税，收取这些税款，并将其缴纳给相应的监管机构。这意味着你需要在每个销售额达到一定规模的国家注册税号。使用 Dodo Payments 时，我们是法律上的销售方。我们使用自己的税务注册信息，为你处理所有这些事务。

> 大多数 SaaS 创始人都会低估税务合规的成本。它不仅仅是提交申报表，还包括在每个拥有客户的司法管辖区进行注册、结账时计算税款、申报缴纳，以及为审计做好准备。
>
> \- Ayush Agarwal，Dodo Payments 联合创始人兼 CPTO

理解 [stripe vs merchant of records](https://dodopayments.com/blogs/stripe-vs-merchant-of-records) 的争论，对于长期扩展至关重要。作为个人创始人，你不会想把周末都花在五个不同国家提交税务申报上。通过使用 [merchant of record for SaaS](https://dodopayments.com/blogs/merchant-of-record-for-saas)，你可以自动化处理业务中最枯燥、风险最高的部分。你还可以获得专家团队的支持，他们会持续关注全球税法的变化，让你无需亲自跟进。随着业务规模扩大，这种安心感非常宝贵。

## 迁移模式：高层概览

大多数模板都采用类似的支付架构。它们通常有一个"billing"服务或一组 API 路由，用于处理客户支付的完整生命周期。这通常包括创建结账会话、处理成功支付的 Webhook、管理数据库中的订阅状态，以及提供供用户管理账单的门户。如果处理不当，其中任何一个组件都可能成为故障点。

要替换 Stripe，你需要将 Stripe SDK 调用替换为 Dodo Payments SDK 调用，并更新 Webhook 处理程序。只要遵循系统化的方法，避免常见的 [billing system migration mistakes](https://dodopayments.com/blogs/billing-system-migration-mistakes)，整个过程并不复杂。你也应该借此机会清理账单逻辑，并确保其尽可能模块化。这样，未来添加新功能或支付方式会更加容易。

```mermaid
flowchart LR
    A[User Clicks Upgrade] --> B{Boilerplate Logic}
    B --> C[Create Dodo Checkout]
    C --> D[User Completes Payment]
    D --> E[Dodo Webhook Fires]
    E --> F[Update Database State]
    F --> G[User Access Granted]
```

## 第 1 步：环境变量和 SDK 设置

首先，从 `.env` 文件中删除 Stripe 密钥，并添加 Dodo Payments 凭证。你需要 `DODO_PAYMENTS_API_KEY`。建议为开发环境和生产环境使用不同的密钥，以防止意外损坏数据。你还应确保环境变量得到妥善保护，不会被提交到版本控制系统中。

接下来，安装 Dodo Payments SDK。该 SDK 轻量易用，专注于开发者体验。它为 Dodo 的各项功能提供了简洁的 API，从简单支付到复杂的订阅管理都可以覆盖。你可以在 npm 上找到 SDK 的最新版本，并在 GitHub 上查看源代码。

```bash
npm install dodopayments
```

在你的账单服务中初始化客户端：

```javascript
import DodoPayments from "dodopayments";

export const dodoClient = new DodoPayments({
  bearerToken: process.env["DODO_PAYMENTS_API_KEY"],
  // Needed later so the SDK can verify incoming webhook signatures
  webhookKey: process.env["DODO_PAYMENTS_WEBHOOK_KEY"],
});
```

## 第 2 步：替换结账会话

在大多数模板中，你会看到类似 `createCheckoutSession` 的函数。你需要将 Stripe 会话创建逻辑替换为 Dodo Payments 支付或订阅创建逻辑。此时，用户会被重定向到结账页面并输入支付信息。你应尽可能让这一体验顺畅、无摩擦，从而最大限度地提高转化率。

**之前（Stripe）：**

```javascript
const session = await stripe.checkout.sessions.create({
  payment_method_types: ["card"],
  line_items: [{ price: "price_id", quantity: 1 }],
  mode: "subscription",
  success_url: "...",
  cancel_url: "...",
});
```

**之后（Dodo Payments）：**

```javascript
const payment = await dodoClient.payments.create({
  product_cart: [{ product_id: "pdt_your_product_id", quantity: 1 }],
  customer: { email: user.email, name: user.name },
  billing: { country: "US" }, // Dodo handles the rest of the tax logic
  payment_link: true,
  return_url: "...",
});
```

对于订阅，你可以使用 `subscriptions.create` 方法。这里的主要优势在于，Dodo 可以无缝处理 [overlay checkout](https://docs.dodopayments.com/developer-resources/overlay-checkout) 或 [inline checkout](https://docs.dodopayments.com/developer-resources/inline-checkout)，让用户始终留在你的网站上。这样可以减少用户因被重定向到外部域名支付而经常出现的"跳出率"。

## 第 3 步：更新 Webhook 处理程序

Webhook 是迁移过程中最关键的部分。你需要确保支付成功后，数据库能够正确更新。Dodo Payments 使用的 Webhook 结构与 Stripe 类似，但事件名称和负载结构不同。你应仔细将每个 Dodo 事件映射到应用中的对应操作。

你需要监听 `payment.succeeded` 或 `subscription.active` 等事件。更新 Webhook 路由以验证 Dodo 签名并处理负载。签名验证对于安全至关重要，因为它可以确保 Webhook 确实来自 Dodo，而不是恶意第三方。你可以在我们的文档中找到签名验证示例。

```javascript
// Example webhook handler
export async function POST(req) {
  const body = await req.text();

  // Dodo follows the Standard Webhooks spec, so signature verification uses
  // the webhook-id / webhook-signature / webhook-timestamp headers. Construct
  // dodoClient with `webhookKey` set and the SDK verifies them for you.
  const event = dodoClient.webhooks.unwrap(body, {
    headers: {
      "webhook-id": req.headers.get("webhook-id"),
      "webhook-signature": req.headers.get("webhook-signature"),
      "webhook-timestamp": req.headers.get("webhook-timestamp"),
    },
  });

  switch (event.type) {
    case "payment.succeeded":
      await updateDatabase(event.data.customer.email, "active");
      break;
    case "subscription.active":
      await saveSubscriptionId(event.data.subscription_id);
      break;
  }

  return new Response("ok");
}
```

有关确切的负载结构，请参阅 [webhooks documentation](https://docs.dodopayments.com/developer-resources/webhooks)。

## 第 4 步：管理订阅和门户

大多数模板都包含一个"Customer Portal"，用户可以在其中取消或升级套餐。你可以使用 Dodo 内置的订阅管理功能，而不是将用户重定向到 Stripe Billing Portal。这样，你可以在整个客户旅程中保持一致的品牌体验。你可以使用我们的 API 构建自己的门户，也可以使用我们预先构建的组件。

你可以通过 [SDKs](https://docs.dodopayments.com/developer-resources/dodo-payments-sdks) 获取订阅详情，并直接显示在 UI 中。当用户想要取消订阅时，你可以调用 `subscriptions.update` 方法，立即结束订阅，或将其安排在当前周期结束时停止。这样，在用户最终确认取消之前，你可以提供"挽回"优惠，例如折扣或免费一个月。这是降低流失率、提高客户生命周期价值的有效方式。

```javascript
// Cancel immediately - the mandate is revoked and no further charges are created
const canceledSubscription = await dodoClient.subscriptions.update("sub_id", {
  status: "cancelled",
});

// Or keep access until the end of the current billing period
const scheduledCancellation = await dodoClient.subscriptions.update("sub_id", {
  cancel_at_next_billing_date: true,
});
```

这样，你可以更好地控制用户体验，同时将复杂的账单逻辑交给 Dodo。

## 针对具体模板的建议

### ShipFast（Next.js）

ShipFast 专为速度而设计，其支付集成也不例外。它使用 `libs` 文件夹中的 `stripe.js` 文件处理所有与支付相关的逻辑。你可以创建对应的 `dodo.js` 文件，并更新调用 `createCheckout` 的组件。由于 ShipFast 追求快速上线，使用 Dodo 的支付链接是最快的启动方式。你只需将 Stripe 结账 URL 替换为 Dodo 支付链接即可。

### supastarter（Next.js + Supabase）

supastarter 对账单功能进行了非常清晰的抽象，因此很容易替换底层支付服务商。你可以将 Stripe 服务实现替换为 Dodo 服务。如果你之前存储了 Stripe 专属 ID（例如 `stripe_customer_id`），请务必更新 Supabase 架构。你还应更新 Supabase edge functions，以处理 Dodo Webhook。这样可以确保数据库始终是应用状态的"唯一事实来源"。

### Makerkit（Remix / Next.js）

Makerkit 高度模块化，并在设计时充分考虑了可扩展性。你可以通过更新 `billing` 模块来替换 Stripe 集成。Makerkit 强大的 Webhook 处理能力让你可以轻松将 Dodo 事件映射到应用内部状态。你还应充分利用 Makerkit 对多个支付服务商的内置支持，让迁移更加顺利。这样，你可以在最终切换前，让 Dodo 与 Stripe 并行运行并进行测试。

## 测试迁移

正式上线前，请使用 Dodo 的测试模式，确保一切按预期运行。你可以模拟成功支付、失败交易和订阅续期，而无需使用真实资金。此时应确保完全遵循 [integration guide](https://docs.dodopayments.com/developer-resources/integration-guide)，并确保数据库状态保持一致。你还应测试错误处理逻辑，确保出现问题时用户能够看到清晰且有帮助的提示。

检查日志中是否存在失败的 Webhook。确保 [API reference](https://docs.dodopayments.com/api-reference/introduction) 调用返回预期数据。顺利迁移的关键在于细节。不要急于上线，花时间测试每种可能的场景，从简单的一次性购买到复杂的订阅升级。你的用户会感谢这种无缝体验。

## 常见问题

### Dodo Payments 比 Stripe 更贵吗？

虽然 Stripe 的基础费用为 2.9% + 30 美分，但加上 Stripe Tax、Stripe Billing，以及你自己投入合规工作的时间成本后，实际支出往往高得多。Dodo 的透明定价包含 MoR（名义商户）服务，对于全球 SaaS 业务而言，通常更具成本效益。

### 我可以将现有的 Stripe 订阅用户迁移到 Dodo 吗？

可以，但需要进行一些规划。你需要从 Stripe 导出客户数据，然后将其导入 Dodo。我们建议让两个系统并行运行一小段时间，以确保用户能够平稳过渡。

### Dodo 支持 Stripe 支持的所有支付方式吗？

Dodo 支持所有主要信用卡、Apple Pay、Google Pay，以及 iDEAL、Bancontact 和 Pix 等数十种本地化支付方式。我们还在不断增加更多支付方式，以确保全球范围内的高转化率。

### 我还需要注册 VAT/GST 吗？

不需要。当你使用 Dodo Payments 作为 MoR（名义商户）时，我们会在所支持的所有司法管辖区注册 VAT/GST。我们会使用自己的税号收取并缴纳相关税款。

### 如何处理结算？

Dodo Payments 会从你的客户处收取资金，然后以你偏好的货币向你付款。你可以在控制台中设置结算周期。

## 总结

在 SaaS 模板中替换 Stripe，是提升长期生产力的最佳选择之一。它消除了笼罩在每笔全球销售之上的"税务阴影"，并简化了技术栈。按照本指南中介绍的模式操作，你可以在几小时内完成切换，重新专注于最重要的事情：构建用户喜爱的产品。

准备好简化账单了吗？[注册 Dodo Payments](https://dodopayments.com)，今天就开始迁移。查看我们的 [pricing](https://dodopayments.com/pricing)，了解我们如何帮助你轻松拓展全球业务。
---
- [More Payments articles](https://dodopayments.com/blogs/category/payments)
- [All articles](https://dodopayments.com/blogs)