# 如何在 Marketplace 之外销售 VS Code 扩展

> 使用许可证密钥实现 VS Code 扩展变现的指南。销售高级功能、自动交付许可证，并使用 Dodo Payments 验证激活状态。
- **Author**: Ayush Agarwal
- **Published**: 2026-03-27
- **Category**: Payments, License Keys, How-To
- **URL**: https://dodopayments.com/blogs/zh/sell-vscode-extensions

---

VS Code Marketplace 拥有数百万活跃用户，但没有任何内置的变现选项。这里没有付费扩展、原生订阅提示，也没有打赏箱。如果你想靠为其他开发者构建的工具谋生，就必须自己搭建支付基础设施。

大多数开发者都认为，既然 Marketplace 是免费的，他们的扩展也必须免费。这是一个常见误解，导致许多高质量工具始终无法问世。你可以在 Marketplace 上免费分发扩展，同时将高级功能锁定在许可证密钥之后。

本指南将介绍如何弥合这一变现鸿沟。我们会讲解如何使用 Dodo Payments 处理全球销售、生成许可证密钥，并直接在 VS Code 扩展中验证密钥。读完本指南后，你将拥有一份清晰的路线图，将副业项目转变为能够产生收入的产品。

## VS Code 的变现鸿沟

Microsoft 为开发者打造了一个令人难以置信的生态系统，但目前还没有提供让创作者为作品收费的方式。与 Apple App Store，甚至早期的 Chrome Web Store 不同，VS Code Marketplace 严格来说只是一个免费分发平台。这里没有"购买"按钮，也没有用于检查用户是否为某个特定扩展 ID 付费的 API。

> 许可证密钥管理看起来很简单，但当你需要在数千名客户之间实现激活次数限制、设备跟踪和过期逻辑时，情况就不同了。自己构建这些功能会分散你对核心产品的注意力。
>
> \- Ayush Agarwal，Dodo Payments 联合创始人兼 CPTO

基础设施的缺失给独立开发者带来了很大障碍。如果你想实现变现，就需要负责全球税务合规、支付处理和许可证管理。对于个人开发者来说，这些行政工作耗费的时间可能比开发扩展本身还多。

好消息是，Marketplace 并不禁止你在其他地方销售许可证。你可以将 Marketplace 作为主要的分发和发现渠道，同时使用第三方平台处理商业事务。这种"免费到专业版"（Free-to-Pro）模式，是在 VS Code 生态中建立可持续业务的最有效方式。

## 变现策略：免费分发 + 高级密钥

最成功的付费扩展都采用混合模式。你可以在 Marketplace 上发布扩展的免费版本，以最大化覆盖面和 SEO 效果。这个版本本身应提供足够的价值，能够独立使用，从而帮助你获得用户和正面评价。

在扩展中，你需要确定能够解决更复杂问题或节省大量时间的"专业版"功能。这些功能可以展示给用户，但处于锁定状态。当用户想要使用它们时，将被引导至你的网站购买许可证密钥。用户在 VS Code 设置中输入密钥后，扩展会对其进行验证并解锁高级功能。

这一策略之所以有效，是因为它充分利用了 Marketplace 最擅长的能力：分发。你不必担心托管自己的扩展库或管理更新。你可以专注于构建优秀功能，并让专业的支付平台处理收入。

## 为什么 VS Code 扩展应选择 Dodo Payments

当你在全球销售软件时，你处理的不只是收款，还会进入一个涉及销售税、VAT 和财务合规的复杂世界。Dodo Payments 充当 [SaaS 的 MoR（名义商户）](https://dodopayments.com/blogs/merchant-of-record-for-saas)，这意味着我们会为你处理所有税费的征收和缴纳。

对于 VS Code 扩展开发者来说，Dodo 提供了一套完整的变现工具：

- **自动生成许可证**：Dodo 可以为每笔购买自动生成唯一的许可证密钥，并通过电子邮件发送给客户。
- **验证 API**：扩展可以调用一个简单的端点，验证许可证密钥是否有效且处于激活状态。
- **全球支付**：支持来自 220 多个国家和地区的付款，并提供 UPI、Pix 和信用卡等本地化支付方式。
- **支付链接**：无需编写任何前端代码，即可在几秒钟内创建结账页面。

使用 Dodo，你可以避免"定价门槛"问题：为了出售第一张 10 美元的许可证，就必须花费数千美元购买合规软件。你可以立即了解 [如何接受在线支付](https://dodopayments.com/blogs/how-to-accept-online-payments)，并随着用户群增长进行扩展。

## 用户流程

了解用户从免费用户转变为付费客户的过程，对于打造流畅体验至关重要。下图展示了变现型 VS Code 扩展的典型流程。

```mermaid
flowchart TD
    A[用户安装免费扩展] --> B[用户探索功能]
    B --> C{想使用专业版功能？}
    C -->|否| B
    C -->|是| D[点击升级到专业版]
    D --> E[在浏览器中打开定价页面]
    E --> F[通过 Dodo Payments 购买许可证]
    F --> G[许可证密钥通过电子邮件发送给用户]
    G --> H[用户在 VS Code 设置中输入密钥]
    H --> I[扩展通过 Dodo API 验证密钥]
    I --> J[解锁专业版功能]
```

## 变现分步指南

### 1. 发布免费版本

首先，将扩展发布到 VS Code Marketplace。专注于某个具体领域或问题。你的目标是建立用户群并收集反馈。确保扩展遵循标准的 [软件许可证管理](https://dodopayments.com/blogs/software-license-management) 原则，并在清晰的 README 中说明有专业版可供使用。

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

登录 Dodo Payments 控制面板并创建新产品。你可以选择一次性购买或订阅模式。如果不确定该选哪种模式，可以阅读我们的 [订阅模式与许可证模式对比指南](https://dodopayments.com/blogs/subscription-vs-license-model)。

在产品设置中启用许可证密钥生成。你可以指定密钥格式，以及每个密钥允许的激活次数。这对于防止单个许可证未经你许可就在整个组织内共享至关重要。

### 3. 构建定价页面

你需要为用户提供购买许可证的入口。不必为此搭建复杂的网站，一个带有"立即购买"按钮的简单落地页就足够了。将此按钮链接到你的 Dodo 支付链接。

Dodo 会处理完整的结账体验，包括税费计算和支付方式选择。这是 [销售数字产品的最佳平台](https://dodopayments.com/blogs/best-platform-sell-digital-products)，因为它免去了搭建自定义结账流程的复杂工作。

### 4. 添加许可证密钥设置

在扩展的 `package.json` 中添加一个配置项，让用户可以输入许可证密钥。这样，用户就能通过标准的 VS Code 设置界面轻松管理许可证。

```json
{
  "contributes": {
    "configuration": {
      "title": "我的扩展专业版",
      "properties": {
        "myExtension.licenseKey": {
          "type": "string",
          "default": "",
          "description": "输入专业版许可证密钥以解锁高级功能。"
        }
      }
    }
  }
}
```

### 5. 验证许可证密钥

当扩展激活，或许可证密钥设置发生变化时，你需要验证密钥。你将使用 Dodo Payments API 检查许可证状态。

最佳实践是将验证结果在本地缓存一小段时间，避免用户每次打开文件时都发起 API 调用。不过，你仍应定期重新验证，以确保许可证没有被取消或过期。

### 6. 解锁高级功能

在扩展中使用全局状态或上下文变量跟踪"专业版"状态。将高级功能逻辑放在条件检查中。例如，如果你正在构建代码补全扩展，可以仅在许可证有效时启用高级 AI 模型。

### 7. 添加升级提示

不要让用户自己去寻找定价页面。在扩展的侧边栏或状态栏项目中添加"升级到专业版"按钮。点击后，应在用户的默认浏览器中打开定价页面。这是有效实现 [在线销售软件](https://dodopayments.com/blogs/how-to-sell-software-online) 的关键环节。

## 实现：在 TypeScript 中验证许可证

下面是一个在 VS Code 扩展环境中处理许可证验证的实际示例。这段代码使用 Dodo Payments API 验证用户在设置中输入的密钥。

```typescript
import * as vscode from "vscode";
import axios from "axios";

export async function activate(context: vscode.ExtensionContext) {
  const config = vscode.workspace.getConfiguration("myExtension");
  let licenseKey = config.get<string>("licenseKey");

  // 启动时检查许可证
  let isPro = await validateLicense(licenseKey);

  // 配置变化时更新状态
  vscode.workspace.onDidChangeConfiguration(async (e) => {
    if (e.affectsConfiguration("myExtension.licenseKey")) {
      licenseKey = vscode.workspace
        .getConfiguration("myExtension")
        .get<string>("licenseKey");
      isPro = await validateLicense(licenseKey);
      if (isPro) {
        vscode.window.showInformationMessage("专业版功能已解锁！");
      }
    }
  });

  // 注册仅限专业版用户使用的命令
  let disposable = vscode.commands.registerCommand(
    "myExtension.premiumFeature",
    () => {
      if (isPro) {
        vscode.window.showInformationMessage("正在运行高级功能......");
      } else {
        vscode.window
          .showErrorMessage("这是专业版功能，请升级。", "升级")
          .then((selection) => {
            if (selection === "升级") {
              vscode.env.openExternal(
                vscode.Uri.parse("https://dodopayments.com/pricing"),
              );
            }
          });
      }
    },
  );

  context.subscriptions.push(disposable);
}

async function validateLicense(key: string | undefined): Promise<boolean> {
  if (!key) return false;

  try {
    // 许可证验证端点是公开的----无需 API 密钥
    const response = await axios.post(
      "https://test.dodopayments.com/licenses/validate",
      {
        license_key: key,
      },
    );

    return response.data.valid === true;
  } catch (error) {
    console.error("许可证验证失败", error);
    return false;
  }
}
```

这段代码展示了核心逻辑。有关请求参数和响应格式的详细信息，请参阅 [API 参考](https://docs.dodopayments.com/api-reference/introduction)。

## 哪些功能应放在付费墙之后

决定哪些内容收费，是 [如何在线销售数字产品](https://dodopayments.com/blogs/how-to-sell-digital-products-online) 中最困难的部分。如果锁定太多功能，就没有人会使用扩展；如果锁定太少，就没有人愿意付费。

适合放入专业版的功能包括：

- **高级自定义**：主题、自定义图标或复杂的配置选项。
- **云同步**：在多台设备之间同步设置或代码片段。
- **AI 功能**：访问更强大的模型或获得更高的使用额度。
- **优先支持**：用于提交错误报告和功能请求的专属渠道。
- **企业功能**：安全审计、SSO 集成或团队管理。

目标是让免费版本"足够好"，从而获得广泛使用；同时让专业版对高级用户来说"好到无法拒绝"。

## 在扩展内进行营销

你的扩展就是最好的营销工具。利用它温和地提醒用户，他们可以从专业版中获得哪些价值。

- **状态栏**：在状态栏中添加一个小型"专业版"或"升级"图标。
- **欢迎页面**：显示一次性的欢迎页面，突出介绍专业版功能。
- **命令面板**：将专业版命令加入命令面板，但用户选择这些命令时显示升级提示。
- **输出频道**：操作成功后，在输出频道显示一条不显眼的消息。

避免过度打扰。开发者通常对"骚扰软件"非常敏感。如果你的扩展通过弹窗打断工作流程，他们会卸载扩展并留下负面评价。

## 处理更新与安全问题

当你在 Marketplace 之外销售许可证时，需要确保验证逻辑安全可靠。虽然在 VS Code 这样的客户端环境中，不可能完全阻止盗版，但你可以提高破解难度，让大多数用户打消尝试的念头。

- **代码混淆**：使用 Webpack 或 Esbuild 等打包工具混淆扩展代码。
- **服务端检查**：如果扩展依赖后端服务，在处理请求前始终在服务器上验证许可证密钥。
- **Webhooks**：使用 [webhooks](https://docs.dodopayments.com/developer-resources/webhooks) 监听订阅取消或支付失败事件。当支付失败时，可以立即在数据库中停用许可证密钥。

有关保护集成的更多详情，请查看我们的 [集成指南](https://docs.dodopayments.com/integration-guide)。

## 常见问题

### 我可以直接在 Marketplace 上销售 VS Code 扩展吗？

不可以。VS Code Marketplace 目前不支持付费扩展或内置支付处理。你必须通过 Dodo Payments 等外部平台处理支付和许可证管理。

### 在其他地方销售许可证是否违反 Microsoft 的条款？

Microsoft 针对 Marketplace 的服务条款并不禁止你通过第三方服务销售扩展许可证或订阅。许多热门扩展都采用这种模式为开发提供资金。

### 如何将许可证密钥交付给用户？

当用户通过 Dodo Payments 完成购买后，系统会自动生成许可证密钥并发送到用户的电子邮件地址。你也可以在结账后的"感谢你"页面上显示密钥。

### 我可以为扩展使用订阅模式吗？

可以。Dodo Payments 同时支持一次性购买和周期性订阅。对于能够持续提供价值的扩展，例如 AI 驱动的工具或云同步服务，订阅模式通常更合适。

### 如何处理全球客户的销售税？

Dodo Payments 充当 MoR（名义商户），这意味着我们会在全球范围内为每笔交易计算、收取并缴纳销售税和 VAT。你无需担心不同国家和地区的税务合规问题。

## 总结

通过 VS Code 扩展实现变现，是开发者构建可持续工具的一条可行路径。利用 Marketplace 进行分发，利用 Dodo Payments 处理收入，你可以专注于自己最擅长的事情：编写代码。

先确定扩展的核心价值，以及高级用户愿意付费购买的功能。在 Dodo 中设置产品，集成 [许可证密钥](https://docs.dodopayments.com/features/license-keys) 验证逻辑，然后开始将用户转化为客户。

如果你准备开始，请查看我们的 [SDK](https://docs.dodopayments.com/developer-resources/dodo-payments-sdks)，了解将 Dodo 集成到开发工作流中有多么简单。有关价格和功能的更多信息，请访问 [dodopayments.com](https://dodopayments.com)，或查看我们的 [定价](https://dodopayments.com/pricing) 页面。
---
- [More Payments articles](https://dodopayments.com/blogs/category/payments)
- [All articles](https://dodopayments.com/blogs)