Pay2Clone 监听付款,解析出谁买了什么,然后把买家加为你私有 GitHub 仓库的协作者。授权到期,再把人移除。自托管在 Cloudflare 上,一个部署,管你要卖的所有仓库。
{
"eventType": "checkout.completed",
"object": {
"order": {
"id": "ord_6wqYhx4Us6GmkKrhQmj9y",
"product": "prod_3Nle5C6vSYfqRnNMjGboIn",
"amount": 2900,
"currency": "USD",
"status": "paid"
},
"customer": { "email": "buyer@example.com" }
}
}
PUT /repos/acme/widget-pro/collaborators/octocat
{
"permission": "pull",
"invitation": {
"id": 1782043391,
"expired": false
}
}
每一步各自可靠:webhook 丢了会重放,GitHub 调用失败会重试,每天一次的对账把 GitHub 上的实际状态和数据库认为应该的状态对齐。
签名校验的是原始字节,不是解析后的对象。原始报文在别的事情发生之前就已归档。
事件和它意味着的工作写在同一个事务里,幂等键是渠道的事件 id。同一个事件重放十次,还是一笔订单。
买家用 GitHub 登录,然后被邀请进他买的那个仓库。不用手工邀请,不用共享账号,不用发压缩包。
权限是一个期望态,所以退款、拒付、到期的收敛路径和购买完全一样。每晚一次的对账修补偏移。
这个站本身就是一个部署。给你看这个页面的同一个 Worker,跑着一个可以走完的在线 demo:先当顾客,再当运营者——真实的测试付款、真实的 webhook、真实私有仓库的真实邀请。
/app
订单、授权、价格映射、对账日志——运营者这一侧的全部。demo 账号和密码就印在登录页上,不用申请,也不用注册。
打开后台/me
你的顾客看到的东西。绑上你自己的 GitHub 账号,用那里印着的测试卡付款——不会有钱动——然后收下寄来的邀请。
打开买家页demo 里的一切——订单、账号、仓库权限——每小时整点清空一次。请不要往里面放任何真实的东西。
每个适配器都是对着真实抓到的报文或厂商 SDK 写的,不是对着文档页写的。它们的事件列表来自跑起来的产品——因为我们查过的文档页没有一份是对的。
对官方 SDK 的签名器验证过
对一条真实签名事件验证过
对一条真实签名事件验证过
对一条真实签名事件验证过
对官方 SDK 的签名器验证过
大多数人以为私有仓库的协作者是按席位计费的。在 GitHub Free 组织下并不是。卖给一百个买家和卖给一个,成本一样。
| GitHub 套餐 | 私有仓库 | 外部协作者 | 每协作者 |
|---|---|---|---|
| Free 组织 | 不限 | 不限 | $0 |
| Team 组织 | 不限 | 不限 | $4/月 |
对照 GitHub 公布的套餐限制核对过。列出 Team 只是作对比:卖仓库权限并不需要它。
买一次,想部署多少次就部署多少次,想接多少个仓库就接多少个。你的买家从头到尾看不到 Pay2Clone 的账号——他们看到的是你的仓库。
$29 一次性