# 如何销售私有 GitHub 仓库的访问权限

> 了解如何使用 Dodo Payments 许可证密钥和 GitHub API，在付款成功后自动发送私有 GitHub 仓库邀请。
- **Author**: Ayush Agarwal
- **Published**: 2026-03-28
- **Category**: Payments, Developer Tools, How-To
- **URL**: https://dodopayments.com/blogs/zh/sell-github-repo-access

---

销售私有 GitHub 仓库的访问权限，已经成为开发者实现工作变现的一种流行方式。无论你销售的是 SaaS 模板、入门套件还是专用库，挑战始终相同：付款确认后，如何自动授予访问权限？

在本指南中，我们将向你介绍如何结合 Dodo Payments 和 GitHub API，构建一个完全自动化的 GitHub 仓库访问权限销售系统。我们会使用 Dodo 的原生许可证密钥功能来授权用户，并通过一个简单的 webhook 处理程序触发 GitHub 邀请。这样一来，你的客户可以立即访问代码，而你可以专注于产品开发。

## 为什么要销售 GitHub 仓库访问权限？

GitHub 是代码的天然归宿。通过销售私有仓库的访问权限，你可以为客户提供一个熟悉的环境，让他们接收更新、报告问题并参与贡献。这比通过电子邮件发送 ZIP 文件专业得多。

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

对于开发者而言，这种模式具有很强的可扩展性。你可以将同一个模板或库销售给数百名客户，无需任何人工干预。将其与 Dodo Payments 结合后，你还可以获得 MoR（名义商户）的支持，由它为你处理全球税务和合规问题。

## 自动化访问权限系统的架构

我们要构建的系统由三个主要部分组成：Dodo Payments 结账页面、服务器上的 webhook 处理程序，以及 GitHub API。当用户完成购买后，Dodo 会向你的服务器发送 webhook。随后，你的服务器会使用 GitHub API，邀请用户加入你的私有仓库。

```mermaid
flowchart LR
    A[客户] -->|"购买访问权限"| B[Dodo Payments]
    B -->|"Webhook：payment.succeeded"| C[你的服务器]
    C -->|"GitHub API：邀请用户"| D[GitHub 仓库]
    D -->|"电子邮件邀请"| A
    C -->|"发放许可证密钥"| B
    B -->|"发送密钥"| A
```

这一流程可以确保用户几乎立即收到软件许可证密钥和仓库邀请。

## 为许可证密钥设置 Dodo Payments

第一步是在 Dodo Payments 控制面板中配置产品，使其发放许可证密钥。许可证密钥是用于授权产品访问权限的唯一令牌，非常适合控制 GitHub 仓库等数字商品的访问。

1. **创建产品**：在 Dodo 控制面板中，为仓库访问权限创建一个新产品。
2. **启用许可证密钥**：在产品设置中，打开"License Keys"选项。
3. **配置有效期**：你可以将许可证密钥设置为永不过期；如果销售的是订阅，也可以设置为在指定时间后过期。
4. **设置激活次数限制**：对于仓库访问权限，你可能希望限制单个许可证密钥可以关联的 GitHub 账户数量。

配置完成后，Dodo 会在每次购买成功后自动生成唯一的许可证密钥，并将其包含在客户的确认邮件中。

## 使用 GitHub API 进行身份验证

要自动发送邀请，你需要一个具有 `repo` 和 `admin:org` 权限范围的 GitHub Personal Access Token（PAT）。此令牌允许你的服务器代表你邀请用户加入仓库。

```bash

# 将 GitHub 令牌存储在 .env 文件中

GITHUB_TOKEN=your_github_pat_here
GITHUB_REPO_OWNER=your_username
GITHUB_REPO_NAME=your_private_repo
```

我们建议使用细粒度 PAT 来提升安全性，并将其访问范围限制为你销售的特定仓库。

## 构建 Webhook 处理程序

现在，让我们构建系统的核心部分：webhook 处理程序。本例使用 Node.js 和 Express，但其逻辑适用于任何后端框架。我们将使用 `octokit` 库与 GitHub API 交互。

```javascript
const { Octokit } = require("@octokit/rest");
const DodoPayments = require("dodopayments");

const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN });
const dodo = new DodoPayments({
  bearerToken: process.env.DODO_PAYMENTS_API_KEY,
  webhookKey: process.env.DODO_PAYMENTS_WEBHOOK_KEY,
});

app.post("/webhook", async (req, res) => {
  try {
    const event = dodo.webhooks.unwrap(req.body.toString(), {
      headers: {
        "webhook-id": req.headers["webhook-id"],
        "webhook-signature": req.headers["webhook-signature"],
        "webhook-timestamp": req.headers["webhook-timestamp"],
      },
    });

    if (event.type === "payment.succeeded") {
      const { customer, metadata } = event.data;
      const githubUsername = metadata.github_username;

      // 邀请用户加入 GitHub 仓库
      await octokit.repos.addCollaborator({
        owner: process.env.GITHUB_REPO_OWNER,
        repo: process.env.GITHUB_REPO_NAME,
        username: githubUsername,
        permission: "pull",
      });

      console.log(
        `Invited ${githubUsername} to ${process.env.GITHUB_REPO_NAME}`,
      );
    }

    res.status(200).send("OK");
  } catch (error) {
    console.error("Webhook error:", error);
    res.status(401).send("Invalid signature");
  }
});
```

在本例中，我们假设你已在结账过程中使用 Dodo 的自定义元数据字段收集用户的 GitHub 用户名。这样可以确保你拥有发送邀请所需的正确用户信息。

## 在结账过程中收集 GitHub 用户名

要实现自动化，你需要知道客户的 GitHub 用户名。你可以在结账页面中向 Dodo Payments 结账会话添加自定义字段，以收集此信息。

```javascript
const session = await dodo.checkoutSessions.create({
  product_cart: [{ product_id: "pdt_123", quantity: 1 }],
  customer: { email: "customer@example.com" },
  metadata: {
    github_username: "customer_github_handle",
  },
});
```

付款成功后，这些元数据会随 webhook payload 一起传递，让你的服务器准确知道应该邀请哪位用户。

## 管理访问权限和撤销权限

如果用户申请退款，或其订阅到期，会发生什么？你需要一种撤销其仓库访问权限的方法。Dodo Payments 的 webhook 系统可以轻松实现这一点。你可以监听 `refund.succeeded` 或 `subscription.cancelled` 事件，并触发从 GitHub 仓库中移除用户的操作。

```javascript
if (event.type === "subscription.cancelled") {
  const { metadata } = event.data;
  const githubUsername = metadata.github_username;

  await octokit.repos.removeCollaborator({
    owner: process.env.GITHUB_REPO_OWNER,
    repo: process.env.GITHUB_REPO_NAME,
    username: githubUsername,
  });

  console.log(`Removed ${githubUsername} from ${process.env.GITHUB_REPO_NAME}`);
}
```

这样可以确保你的私有代码受到保护，只有仍在付费的活跃客户才能访问。

## 销售代码访问权限的最佳实践

销售 GitHub 仓库访问权限时，请牢记以下最佳实践：

- **使用专用组织**：如果你销售多个仓库，可以考虑创建一个 GitHub Organization。这样更便于管理权限和团队。
- **提供清晰的说明**：在确认邮件中，明确说明用户将如何收到邀请，以及接受邀请需要执行哪些操作。
- **实现全面自动化**：人工步骤越多，出错的可能性就越大。应尽量实现"零接触"的交付流程。
- **监控滥用行为**：密切关注仓库活动。如果发现某个用户从不同 IP 多次下载整个仓库，他们可能正在分享访问权限。
- **持续更新代码**：人们购买仓库访问权限的主要原因之一就是获得更新。请确保定期发布改进和错误修复。

## MoR（名义商户）：关键所在

在全球销售数字商品，税务问题令人头疼。每个国家对增值税、销售税和数字服务都有不同规定。如果由你自行处理这些事务，花在文书工作上的时间可能会超过写代码的时间。

Dodo Payments 充当你的 MoR（名义商户），也就是说，它是你产品的法定销售方。Dodo 会为每位客户计算正确的税额、收取税款，并将其缴纳给相应的政府机构。同时，Dodo 还会处理 GDPR 和 CCPA 等全球法规的合规要求。这样，你就能向 220 多个国家和地区的客户销售 GitHub 仓库访问权限，而无需承担税务责任。

## 总结

销售私有 GitHub 仓库的访问权限，是将专业知识变现的强大方式。将 GitHub 的专业开发环境与 Dodo Payments 强大的支付和许可证管理功能结合起来，你就能构建一个高度自动化且可扩展的业务。

无论你销售的是 [SaaS 模板](https://dodopayments.com/blogs/replace-stripe-saas-boilerplate)，还是专用的[数据产品](https://dodopayments.com/blogs/sell-datasets-data-products)，原则都相同：自动化访问权限管理，保护你的代码，并让 Dodo 处理税务问题。

如需进一步了解如何使用 Dodo Payments 构建业务，请查看我们的指南：[如何在线销售软件](https://dodopayments.com/blogs/how-to-sell-software-online)和[软件许可证管理](https://dodopayments.com/blogs/software-license-management)。你还可以探索[销售数字产品的最佳平台](https://dodopayments.com/blogs/best-platform-sell-digital-products)，了解 Dodo 的优势。

准备开始销售了吗？立即[注册 Dodo Payments](https://dodopayments.com)，几分钟内即可开始实现 GitHub 仓库变现。

## 常见问题

### 我可以通过一次购买销售多个仓库的访问权限吗？

可以！你可以修改 webhook 处理程序，邀请用户加入多个仓库。只需遍历仓库名称列表，并分别为每个仓库调用 GitHub API。

### 没有 GitHub 账户的用户该如何处理？

在结账说明中明确指出需要 GitHub 账户。如果用户提供了无效用户名，你的 webhook 处理程序应捕获该错误，并可以发送自动邮件，请用户提供有效的用户名。

### 将 GitHub PAT 存储在服务器上安全吗？

安全，只要你使用环境变量并遵循标准安全实践即可。请确保服务器不会公开访问，并且 `.env` 文件绝不会提交到版本控制系统。

### 我可以通过订阅形式销售仓库访问权限吗？

当然可以。Dodo Payments 原生支持订阅。你可以监听订阅事件，并根据用户付款状态的变化授予或撤销访问权限。

### 如果用户更改了 GitHub 用户名怎么办？

如果用户更改了用户名，他们需要联系你来更新访问权限。随后，你可以在 GitHub 中手动更新其协作者状态，或构建一个简单的管理工具来处理此操作。

## 最后思考

开发者经济正在蓬勃发展，而销售代码正是其中的核心。借助 Dodo Payments 和 GitHub 等工具，你可以同时发挥两者的优势：世界一流的开发者平台与世界一流的支付基础设施。

查看我们的[许可证密钥文档](https://docs.dodopayments.com/features/license-keys)和 [webhook 指南](https://docs.dodopayments.com/developer-resources/webhooks)，深入了解技术细节。代码变现之旅，就从今天开始。
---
- [More Payments articles](https://dodopayments.com/blogs/category/payments)
- [All articles](https://dodopayments.com/blogs)