Builder Notes

使用 Supabase、Stripe、R2 与 Cloudflare 的受保护下载

实用地概述 ImgKit 如何串联登录、结账、产品访问、私有文件与签名的下载 URL。

付费数字产品需要一个乏味但重要的基础:购买者应当能够付款、登录,并在不暴露公开 ZIP 链接的情况下下载正确的文件。

ImgKit 采用一个简单的受保护下载模式:

  1. Supabase 负责登录。
  2. Stripe 负责结账。
  3. 应用程序记录产品访问权。
  4. R2 存储私有文件。
  5. Cloudflare Functions 返回短期有效的签名 URL。

为什么受保护下载很重要

如果付费 ZIP 文件放在公开文件夹,任何拥有 URL 的人都能分享它。对免费样本或许可以接受,但对付费产品来说太薄弱。

受保护下载增加了一道服务器端检查:

  • 用户是谁?
  • 这位用户购买了该产品吗?
  • 下载资产是否仍启用?
  • 服务器能否生成临时的 URL?

用户仍然会得到普通的浏览器下载,但永久的存储路径并不公开。

Supabase 登录

Supabase 为 ImgKit 提供账号身份。购买者以电子邮件登录后,结账与下载就能绑定到该账号。

对早期产品来说,电子邮件登录就足够了。购买者不需要复杂的仪表板,只是为了下载一个受保护的文件。

Stripe 结账

Stripe 处理付款环节。购买者从网站开始结账、付款,然后回到 ImgKit。

接着,服务器需要把完成的环节连接到产品访问权。这可通过 webhook 与结账同步端点来实现,让购买者在付款后很快看到访问权。

产品访问

产品访问应与一般的会员标签区分开来。购买者可能拥有某个产品,却没有另一个。

以 ImgKit 为例,已退役的 Builder Case Study 使用它自己的产品权限。这个模型仍允许未来的产品存在,而不必把每位购买者都变成广泛的订阅会员。

R2 私有存储

R2 将实际的 ZIP 包存放在公开网站包之外。网站不直接链接到 R2 对象。

相反地,下载端点会检查访问权,并向存储索取临时的 URL。

签名 URL

签名 URL 提供对私有文件的临时访问。如果 URL 在短时间后过期,就较难被永久分享。

这不是重量级的 DRM。它是 MVP 实用的付费传递边界。

ImgKit 学到了什么

已归档的 ImgKit Builder Case Study 页面保留了周边的实现决策:为什么付费软件销售被暂停、受保护下载如何成形,以及源代码包如何作为第一个付费方案被测试。

这个背景很重要,因为技术流程只是产品的一半。另一半是决定应该先卖什么。

常见问题

为什么不把付费 ZIP 文件放在公开文件夹?

公开文件可以直接被分享。受保护的传递会让服务器检查账号访问权,并返回短期有效的下载 URL。

Stripe 会存储文件吗?

不会。Stripe 负责付款。产品访问与下载传递由应用程序与私有存储处理。

为什么要使用签名 URL?

签名 URL 能让私有文件在限定时间内被下载,而不暴露永久的存储访问权。

相关指南

接着阅读