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 能讓私人檔案在限定時間內被下載,而不暴露永久的儲存存取權。

相關指南

接著閱讀