# 如何为桌面应用收款（macOS 和 Windows）

> 关于销售桌面应用的完整指南，涵盖支付处理、许可证密钥交付和激活。介绍如何使用 Dodo Payments 支持 Electron、Tauri 和原生应用。
- **Author**: Ayush Agarwal
- **Published**: 2026-03-24
- **Category**: Payments, License Keys, How-To
- **URL**: https://dodopayments.com/blogs/zh/accept-payments-desktop-app

---

对于你销售的桌面应用，应在网页上销售许可证密钥，而不是将购买流程放在二进制文件内部：在落地页上收款，让服务商生成并通过电子邮件发送密钥，然后让应用通过激活 API 验证该密钥。这样的拆分可以让购买流程保留在真正的结账页面上，同时让激活流程具备离线容错能力。使用 Swift 进行 macOS 原生开发，以及使用 C# 或 C++ 进行 Windows 原生开发，依然能为高性能工具提供强大能力；而在结账时提供一键式[数字钱包解决方案](https://dodopayments.com/blogs/digital-wallet-solution)，即使在原生桌面应用流程中，也能减少支付摩擦。

不过，当你完成自己的得意之作后，还会遇到一个重要难题：到底要如何收款？与只需在页面上放置结账按钮的网页应用不同，桌面应用需要在购买行为和软件本身之间搭建桥梁。你可能会考虑 Mac App Store 或 Microsoft Store，但它们限制很多，还会抽走 30% 的收入。直接向用户销售是最大化利润并与客户保持直接关系的最佳方式。

本指南将介绍如何为桌面应用收款、管理许可证密钥，并处理全球税务合规，同时避免让自己陷入繁琐事务。我们将重点介绍如何使用 Dodo Payments 自动化从购买到激活的完整生命周期。

## 桌面应用的支付难题

销售桌面应用与销售 SaaS 订阅有本质区别。当用户购买网页应用时，你只需更新数据库中的一行记录，就能授予其访问权限。而桌面应用运行在用户自己的设备上，而且经常处于离线或受限环境中。这会带来一些你必须解决的独特挑战。

> 创始人在设置支付流程时犯的最大错误，是把支付当成一个已经解决的问题。你接入一个支付网关，添加一个结账按钮，然后以为一切都完成了。六个月后，你可能要处理税务通知、续费失败，以及由于缺少本地支付方式而导致的结账放弃。
>
> \- Ayush Agarwal，Dodo Payments 联合创始人兼 CPTO

首先，独立二进制应用没有内置的结账系统。你需要一种安全收款的方式，并将这笔付款关联到软件的特定安装实例。通常的处理方式是使用许可证密钥。用户在你的网站上购买软件、收到密钥，然后在应用中输入密钥以解锁功能。

其次，你必须处理许可证激活和验证。你需要一个 API，让应用能够调用它来确认密钥有效，并且没有在过多设备上使用。这个 API 必须可靠且快速，因为用户下载应用后，通常首先就会与它交互。

第三，用户希望应用具备一定程度的离线功能。如果用户正在乘坐飞机，或网络连接不稳定，应用不应该仅仅因为无法连接验证服务器就突然停止工作。你需要制定本地存储许可证并定期重新验证的策略。

最后，还有令人头疼的全球税务合规问题。如果你向德国用户销售应用，就需要代收 VAT；如果你向纽约用户销售，可能需要代收销售税。对于小团队来说，手动处理每个国家和州的税务是不可能的。这正是[适用于 SaaS 的 MoR（名义商户）](https://dodopayments.com/blogs/merchant-of-record-for-saas)不可或缺的原因。

## 桌面应用支付的 3 种方式

为桌面应用设计支付流程，主要有三种方式。正确的选择取决于你的产品类型，以及你希望用户如何发现它。

### 1. 落地页 + 许可证密钥（最常见）

这是经典的"独立开发者"方式。你搭建一个营销网站，介绍应用的优势。当用户点击"立即购买"时，系统会将其带到结账页面。购买成功后，系统会生成许可证密钥并通过电子邮件发送给用户。用户随后下载并安装应用，再输入密钥完成激活。

这种方式非常有利于 SEO，因为你的落地页可以针对相关关键词获得排名。它还允许你使用支持多种支付方式的完整结账体验。这是专业工具和创意软件最常见的模式。

### 2. 通过网页结账进行应用内购买

在这种模式下，用户首先下载应用的"试用版"或"精简版"。当他们尝试使用高级功能时，你可以打开网页视图或系统浏览器窗口，并将其指向结账页面。购买完成后，应用会检测到变化（通常通过 webhook 或轮询 API），并立即解锁相关功能。

这种方式可以减少摩擦，因为用户决定购买时已经在应用内。不过，你需要进行更复杂的集成，以确保应用能准确知道购买何时完成。

### 3. 混合模式

混合模式使用落地页完成首次购买，同时允许用户在应用内管理订阅或购买升级。这在已经转向[订阅模式与许可证模式](https://dodopayments.com/blogs/subscription-vs-license-model)的应用中很常见。它兼顾了两方面的优势：来自网页的高意向流量，以及现有用户低摩擦的升级体验。

## 为什么桌面应用应选择 Dodo Payments？

Dodo Payments 非常适合桌面应用开发者，因为它解决了整个流程中最棘手的两个问题：全球税务和许可证管理。

使用 Dodo 时，我们会作为你的 MoR（名义商户）。这意味着我们负责在 190 多个国家和地区进行税款代收、缴纳和合规处理。你不必担心 VAT、GST 或美国销售税。我们还会处理风控检测和争议，为你省去[如何防止 SaaS 拒付](https://dodopayments.com/blogs/chargeback-prevention-saas)中提到的大部分工作，让你可以专注于构建应用。

除了支付功能，Dodo 还内置了[软件许可证管理](https://dodopayments.com/blogs/software-license-management)系统。在 Dodo 中创建产品后，你只需切换一个开关即可启用许可证密钥。Dodo 会为每笔购买自动生成唯一密钥，并通过电子邮件发送给客户。然后，你可以使用我们的 License API，直接在应用中验证这些密钥。

## 分步指南：落地页 + 许可证密钥方案

下面以 Dodo Payments 为例，逐步介绍最常见模式的实现方式。这套流程适用于 Electron、Tauri 和原生应用。

### 1. 在 Dodo 中创建产品

登录 Dodo Payments 控制台并创建新产品。你可以选择一次性购买或订阅。在产品设置中，确保启用"许可证密钥"。你还可以配置每个密钥允许的激活次数（例如允许用户在两台设备上使用应用）。

### 2. 构建营销页面

为你的应用创建一个落地页。你可以使用 Next.js、Astro 等任意框架，甚至可以使用简单的 HTML 文件。使用[SaaS 嵌入式支付](https://dodopayments.com/blogs/embedded-payments-saas)添加结账按钮。用户点击后，Dodo 的结账浮层就会出现，允许他们使用信用卡、Apple Pay、Google Pay 或 UPI 等本地支付方式付款。

### 3. 自动交付许可证

付款成功后，Dodo 会接手后续流程。我们会向客户发送专业的收据，其中包含其唯一许可证密钥。你无需编写任何代码来生成或发送这些密钥。如果你希望在"感谢页面"上显示密钥，也可以通过我们的 API 或 webhook 获取。

### 4. 在应用中添加许可证输入框

在桌面应用中创建一个简单页面，要求用户输入许可证密钥。通常，这个页面会在首次启动时显示，或在用户尝试访问锁定功能时显示。

### 5. 通过 Dodo License API 进行验证

用户输入密钥后，你的应用应调用 Dodo License API。这个 API 的优势在于它是公开的，这意味着你可以直接从客户端代码（Electron 或 Tauri）调用它，无需后端服务器，也无需暴露私有 API 密钥。

### 6. 在本地存储验证结果

为了支持离线使用，你应将验证结果存储在用户设备上。常见做法是存储加密的 JSON 文件，或将值存储在系统安全钥匙串中。这样，即使没有网络连接，应用也能在后续启动时验证许可证。

### 7. 处理设备停用

如果用户达到激活上限，他们可能希望将许可证转移到新设备。你可以在应用中提供"停用"按钮，调用 Dodo License API 来释放一个激活名额。

## 激活流程图

以下是从用户角度看到的完整流程：

```mermaid
flowchart TD
    A[User visits Website] --> B[User purchases via Dodo Checkout]
    B --> C[Dodo generates License Key]
    C --> D[Dodo emails Key to User]
    D --> E[User downloads & opens Desktop App]
    E --> F[User enters License Key in App]
    F --> G[App calls Dodo License API]
    G --> H{Is Key Valid?}
    H -- Yes --> I[App activates & stores token locally]
    H -- No --> J[App shows error message]
    I --> K[User uses App offline]
```

## 代码示例

下面来看看如何实现这一流程中的技术部分。

### 许可证密钥验证（Node.js / Electron）

如果你使用 Electron，可以使用 Dodo Payments SDK 验证密钥。由于验证端点是公开的，因此无需担心机密信息泄露。

```javascript
import DodoPayments from "dodopayments";

// No API key needed for public license validation
const dodo = new DodoPayments();

async function activateApp(licenseKey) {
  try {
    const response = await dodo.licenses.activate({
      license_key: licenseKey,
      name: "User's MacBook Pro", // Optional: identify the device
    });

    if (response.id) {
      console.log("Activation successful!");
      // Store response.id or a success token locally
      return true;
    }
  } catch (error) {
    console.error("Activation failed:", error.message);
    return false;
  }
}
```

### 许可证密钥验证（Rust / Tauri）

对于 Tauri 应用，你可以直接使用 `reqwest` crate 或类似工具调用 API。

```rust
use serde::{Deserialize, Serialize};

#[derive(Serialize)]
struct ActivateRequest {
    license_key: String,
    name: String,
}

#[derive(Deserialize)]
struct ActivateResponse {
    id: String,
}

async fn validate_license(key: &str) -> Result<bool, reqwest::Error> {
    let client = reqwest::Client::new();
    let res = client.post("https://test.dodopayments.com/licenses/activate")
        .json(&ActivateRequest {
            license_key: key.to_string(),
            name: "User Device".to_string(),
        })
        .send()
        .await?;

    Ok(res.status().is_success())
}
```

### 本地许可证存储

安全存储许可证对于防止简单的"复制粘贴"盗版非常重要。在 macOS 上，你应使用 Keychain；在 Windows 上，Credential Manager 是不错的选择。对于 Electron 应用，`keytar` 等库可以让这一过程变得简单。

```javascript
import keytar from "keytar";

const SERVICE_NAME = "MyAwesomeDesktopApp";
const ACCOUNT_NAME = "LicenseToken";

async function saveLicenseToken(token) {
  await keytar.setPassword(SERVICE_NAME, ACCOUNT_NAME, token);
}

async function getLicenseToken() {
  return await keytar.getPassword(SERVICE_NAME, ACCOUNT_NAME);
}
```

### 订阅 webhook 处理程序

如果你以订阅形式销售应用，就需要知道用户何时取消订阅或付款失败，以便撤销访问权限。Dodo 会针对这些事件发送 webhook。

```javascript
// Example Express.js webhook handler
app.post("/webhooks/dodo", (req, res) => {
  const event = req.body;

  if (event.type === "subscription.cancelled") {
    const subscriptionId = event.data.id;
    // Find the license key associated with this subscription
    // and mark it as invalid in your database or call Dodo API to revoke
    revokeLicenseForSubscription(subscriptionId);
  }

  res.status(200).send("OK");
});
```

## 高级许可证策略

基础功能运行起来后，你可以实施更高级的策略，以保护收入并改善用户体验。

### 基于设备的激活限制

桌面应用开发者最担心的问题之一，是单个许可证密钥被分享到公开论坛。Dodo 允许你设置激活次数上限。当用户尝试在第三台设备上激活时（假设上限为两台），API 会返回错误。此时，你可以提示用户升级套餐，或停用旧设备。

### 订阅许可证

"一次付费，永久使用"模式很不错，但许多开发者正在转向订阅模式，以支持持续开发。Dodo 可以完美处理这一模式。你可以将许可证密钥关联到订阅。如果订阅到期，许可证验证 API 会返回 `valid: false`，你的应用就可以自动锁定功能，直到用户续订。这是[构建可预测收入](https://dodopayments.com/blogs/build-predictable-revenue)的有效方式。

### 自动更新门控

你可以使用 License API 控制对更新服务器的访问。当应用检查新版本时，可以发送许可证密钥。你的服务器会先使用 Dodo 验证密钥，然后再提供下载链接。这样可以确保只有付费客户才能获得最新功能和安全补丁。

## 结语

为桌面应用收款不必成为复杂的工程项目。将购买流程（在网站上）与激活流程（在应用中）分开，你就能为用户打造流畅的体验，同时保持代码整洁。

Dodo Payments 可以替你承担全球税务合规和许可证管理的负担。无论你是在构建小型工具，还是大型创意套件，我们的工具都能帮助你放心地[在线销售软件](https://dodopayments.com/blogs/how-to-sell-software-online)，并为你的产品目录选择[销售数字产品的最佳平台](https://dodopayments.com/blogs/best-platform-sell-digital-products)。

按照本指南中的步骤操作，你可以在数小时内，让 macOS 或 Windows 应用拥有一套完整可用且符合税务合规要求的支付和许可证系统。

## 常见问题

### 如何绕过 Mac App Store 或 Microsoft Store 销售桌面应用？

你可以搭建营销网站，并使用 Dodo Payments 等支付处理商直接向用户销售。你可以在网站上提供安装程序的下载链接（macOS 使用 DMG，Windows 使用 EXE 或 MSI）。用户通过你的结账流程购买许可证密钥后，在应用中输入密钥即可解锁完整功能。这样既能避免 30% 的平台费用，也能直接掌控客户数据。

### Dodo Payments 中的许可证密钥如何工作？

当你为 Dodo Payments 中的产品启用许可证密钥后，我们的系统会为每笔成功交易自动生成唯一密钥。该密钥会包含在发送给客户的自动邮件中。随后，你可以使用 Dodo License API，在桌面应用中激活、验证和停用这些密钥。整个生命周期都由 Dodo 管理，因此你无需自行构建许可证数据库。

### 我可以限制许可证密钥能够激活的设备数量吗？

可以。Dodo Payments 允许你为每个许可证密钥设置激活上限。例如，你可以允许一个密钥在最多三台不同设备上使用。当用户尝试在第四台设备上激活密钥时，API 会返回错误。你还可以允许用户通过应用停用旧设备，为新设备释放名额。

### 我的桌面应用应该采用订阅还是一次性购买？

选择取决于你的开发成本和目标受众。一次性购买在工具类应用中很受欢迎，也通常更容易让用户理解。对于需要持续承担服务器成本或频繁更新的应用，订阅模式更合适。Dodo Payments 同时支持这两种模式，还允许你提供混合方案：用户支付一年的更新费用，但可以永久继续使用当前版本。

### Dodo Payments 会处理桌面应用销售的国际税务吗？

当然。Dodo Payments 会作为 MoR（名义商户），这意味着我们将在 190 多个国家和地区负责计算、代收和缴纳销售税、VAT 及 GST。当世界各地的用户购买你的桌面应用时，Dodo 会根据其所在位置确保应用正确的税费。这可以为你的企业消除全球税务合规带来的巨大行政负担。

如需详细了解如何设置集成，请查看我们的 [License Keys 文档](https://docs.dodopayments.com/features/license-keys)、[Webhook 指南](https://docs.dodopayments.com/developer-resources/webhooks/intents/webhook-events-guide)和 [API 参考](https://docs.dodopayments.com/api-reference/introduction)。你也可以参考我们的[集成指南](https://docs.dodopayments.com/developer-resources/integration-guide)，立即开始使用。进一步了解我们的[定价](https://dodopayments.com/pricing)，以及我们如何帮助你的软件业务拓展全球市场。
---
- [More Payments articles](https://dodopayments.com/blogs/category/payments)
- [All articles](https://dodopayments.com/blogs)