如何為你的 App 加入付款功能:結帳、訂閱同 Webhook
喺你嘅 App 加入付款功能,最簡單嘅方法係用 Stripe:如果你只需要一個「購買」按鈕,並且可以人手處理訂單,就用付款連結;如果你嘅 App 需要知道邊個付咗款,並自動作出反應,就用 Stripe Checkout;如果係定期收費,就用訂閱模式嘅 Checkout 加 Stripe 客戶入口網站。除咗最簡單嘅情況之外,你都需要 Webhook,即係付款成功時 Stripe 會呼叫嘅伺服器端點。喺改用正式金鑰之前,應該用 Stripe 嘅測試金鑰同測試卡號,把所有功能完整測試一次。
本指南會解釋每個選項、大部分教學都會略過嘅 Webhook 部分,以及正式收錢之前要檢查嘅事項。Stripe 嘅資料取自其 2026 年 9 月嘅官方文件。
點解要用付款供應商
唔好喺你自己嘅表格入面收集卡號。處理原始卡資料會令你要符合 PCI DSS(信用卡行業嘅安全標準),而且風險好高。Stripe 之類嘅付款供應商會託管付款表格、儲存卡資料、處理銀行驗證,並將結果通知你嘅 App。你嘅 App 只會知道「客戶 X 已為 Y 付款」。
本指南採用 Stripe,因為佢被廣泛使用、文件完善,亦得到大部分 AI App 生成工具支援。市面上亦有其他供應商,有啲以「Merchant of Record」身份運作,會代你處理銷售稅;如果稅務合規令你擔心,呢種模式值得比較。
用 Stripe 收款嘅三種方式
| 選項 | 需要寫程式 | 你嘅 App 會知道邊個付咗款? | 最適合 |
|---|---|---|---|
| 付款連結 | 唔需要 | 只有加咗 Webhook 先會知道 | 銷售少量固定產品、收取捐款、測試市場需求 |
| Checkout(一次性) | 需要伺服器程式碼建立會話 | 會,透過 Webhook | 商店、付費下載、一次性購買 |
| Checkout(訂閱) | 需要伺服器程式碼加 Webhook 處理 | 會,透過 Webhook | SaaS、會員制、任何定期收費嘅服務 |
付款連結
付款連結係 Stripe 託管嘅付款頁面,你可以喺 Stripe 後台建立,唔需要寫程式。你會得到一個網址,可以放喺 App 嘅按鈕後面、用電郵分享,或者顯示做 QR code。Stripe 文件指出,付款連結可以銷售產品、訂閱,或者收取捐款;你可以讓客戶自行選擇付款金額,或者限制購買數量。
不過有一個限制:你嘅 App 唔會自動知道某位已登入嘅用戶付過款。對於捐款頁面,或者人手根據 Stripe 電郵通知處理訂單嘅小型商店,呢樣就足夠。但如果要做「付款解鎖 Pro 功能」,就唔夠。
Stripe Checkout
Checkout 係你嘅伺服器按需要為某次特定購買而建立嘅付款頁面。你嘅伺服器告訴 Stripe 買緊乜嘢(以及可選擇指定邊位客戶購買),Stripe 會回傳一個網址,然後你將客戶帶去嗰度。Stripe 文件表示,Checkout 同時支援一次性付款同訂閱付款,可以係完全由 Stripe 託管嘅頁面、嵌入你網站嘅頁面,或者嵌入式表格。
流程如下:
- 客戶喺你嘅 App 撳「購買」。
- 你嘅伺服器使用私密金鑰建立 Checkout 會話,並包含一個 ID,將該會話連結到你嘅用戶或訂單。
- 客戶被轉去 Stripe 並完成付款。
- Stripe 將客戶帶返回你嘅成功頁面。
- Stripe 向你嘅 Webhook 發送
checkout.session.completed事件,然後你嘅伺服器將訂單標示為已付款,或者開通存取權。
第 2 步必須喺伺服器進行,因為它要用到你嘅私密金鑰。呢個就係 Checkout 需要後端嘅主要原因。
訂閱
訂閱會使用訂閱模式嘅 Checkout,配合你喺 Stripe 設定好嘅定期價格。首次付款嘅流程與上述相同。之後嘅續期、信用卡失敗、升級同取消,都會隨時間發生,而且好多時客戶根本唔喺你嘅 App 入面,所以你嘅 App 只會透過 Webhook 得知呢啲事件。
如果要讓客戶自行管理訂閱,Stripe 提供一個託管嘅客戶入口網站。根據 Stripe 文件,客戶可以喺度更新付款方式同帳單資料、更改或取消訂閱,以及查看同下載發票。你喺 Stripe 後台設定好,然後加入一個「管理帳單」按鈕,將客戶帶去該入口網站。咁樣你就唔需要自己開發呢啲畫面。
Webhook:唔可以跳過嘅部分
Webhook 係 Stripe 喺某件事發生時發送去你伺服器嘅 HTTP 請求。(一般概念可參閱什麼是 Webhook。)Stripe 嘅訂單履行指南講得好清楚:你唔可以只依賴成功頁面去履行訂單,因為客戶可能付咗款,但喺該頁面載入之前已經斷線。對於訂閱同延遲付款方式,Webhook 係必需嘅。
值得處理嘅事件
| 事件 | 代表咩意思 | 你嘅 App 要做咩 |
|---|---|---|
checkout.session.completed | Checkout 已完成 | 將訂單標示為已付款,或者開始提供存取權 |
checkout.session.async_payment_succeeded | 延遲付款方式(例如銀行扣款)之後成功 | 即時履行訂單 |
checkout.session.async_payment_failed | 該延遲付款失敗 | 通知客戶;唔好履行訂單 |
invoice.paid | 訂閱付款成功,包括續期 | 延長存取權 |
invoice.payment_failed | 續期失敗 | 警告用戶;Stripe 可能會重試 |
customer.subscription.updated | 計劃已更改,或已排定取消 | 更新用戶嘅計劃 |
customer.subscription.deleted | 訂閱已結束 | 移除付費存取權 |
正確 Webhook 處理程式嘅規則
以下內容直接來自 Stripe 嘅 Webhook 文件,而 AI 生成嘅處理程式有時會漏掉其中一項:
- 驗證簽名。 每個事件都包含一個
Stripe-Signature標頭。你嘅處理程式會用端點嘅簽名金鑰(以whsec_開頭)檢查它。冇咗呢一步,任何人都可以向你嘅伺服器發送假冒嘅「付款成功」訊息。 - 使用原始請求內容。 如果你嘅框架喺此之前解析或修改咗內容,簽名檢查就會失敗。
- 快速回傳 2xx 回應,然後再做較慢嘅工作。逾時會被視為失敗。
- 處理重複事件。 Stripe 可能會多次送達同一事件。記錄已處理嘅事件 ID,或者令履行訂單即使執行兩次都安全。
- 唔好假設次序。 Stripe 唔保證事件會按發生次序送達。
- 預期會有重試。 正式模式下,Stripe 會最多重試失敗嘅送達三日,所以短暫嘅服務中斷唔會令付款遺失,但你嘅處理程式必須應付遲到嘅事件。
Webhook 需要一個公開嘅 HTTPS 地址,所以通常只有你嘅 App 發布之後才會運作(Stripe CLI 可以將事件轉送到開發者嘅本機)。
涵蓋整個流程嘅提示詞
用 Stripe Checkout 為「Pro 套件」加入一次性購買(價格 ID 放喺 STRIPE_PRICE_ID)。喺伺服器上使用機密中嘅 STRIPE_SECRET_KEY 建立 Checkout 會話,並將已登入用戶嘅 ID 放入會話。加入 POST /api/stripe/webhook 端點,使用 STRIPE_WEBHOOK_SECRET 並以原始請求內容驗證 Stripe 簽名,處理 checkout.session.completed,並將該用戶標示為已擁有 Pro 套件。如果同一事件被送達兩次,都要保持安全。加入成功及取消頁面。私密金鑰絕對唔可以暴露俾瀏覽器。
如果需要訂閱,再加上:「使用 STRIPE_PRICE_ID 嘅訂閱模式。處理 invoice.paid、invoice.payment_failed、customer.subscription.updated 同 customer.subscription.deleted。加入一個「管理帳單」按鈕,開啟 Stripe 客戶入口網站。」
測試模式
Stripe 有獨立嘅沙盒(測試)同正式環境,各自有獨立金鑰。沙盒金鑰以 pk_test_、sk_test_ 或 rk_test_ 開頭;正式金鑰以 pk_live_、sk_live_ 或 rk_live_ 開頭。測試交易唔會轉移金錢。
Stripe 測試文件中有用嘅測試卡(有效日期可以填任何未來日期,CVC 填任何三位數字):
| 卡號 | 結果 |
|---|---|
4242 4242 4242 4242 | 付款成功 |
4000 0000 0000 0002 | 卡被拒絕 |
4000 0000 0000 3220 | 需要 3D Secure 驗證,然後成功 |
至少要測試以下項目:
- 成功付款後,正確用戶獲得正確嘅功能
- 卡被拒絕時,顯示清楚嘅訊息,而且唔會解鎖任何嘢
- 付款後即時關閉瀏覽器分頁,仍然會獲得存取權(呢個證明 Webhook 有效,而唔只係成功頁面)
- 喺 Stripe 頁面取消付款,會返回你嘅 App,並且冇收取任何費用
- 訂閱方面:喺客戶入口網站取消,並確認存取權會喺應該結束嘅時候結束
正式上線
- 啟用你嘅 Stripe 帳戶,填寫商業同銀行資料。
- 喺你嘅 App 機密入面換成正式金鑰。 Stripe 建議使用受限金鑰,只授予你整合所需嘅權限,而唔係使用無限制嘅私密金鑰。
- 建立正式 Webhook 端點,指向你已發布嘅 App。它有自己嘅簽名金鑰,唔同於測試金鑰,所以要更新。
- 喺正式模式重新建立產品同價格;測試模式嘅 ID 喺正式模式並不存在。
- 進行一次真實嘅小額購買,然後退款。
所有金鑰都要放喺專案機密入面,絕對唔可以放喺程式碼或聊天入面。我哋嘅安全檢查清單會更詳細講解金鑰同 Webhook 驗證。
稅務、退款同文件工作
收款會帶來一些程式碼解決唔到嘅責任。以下並非稅務意見,請向會計師查詢。
- 銷售稅、增值稅同商品及服務稅。 視乎你同客戶所在地,你可能需要登記、收稅同申報。Stripe Tax 可以喺結帳時計算並收取稅款,監察你嘅銷售可能產生嘅責任,並協助登記同申報,但責任始終在你身上。Merchant of Record 供應商係另一個選擇,會代你承擔更多呢類工作。
- 退款同爭議。 上線之前先決定退款政策,並放喺你嘅網站上。爭議(拒付)係會發生嘅,要保留購買同交付嘅紀錄。
- 收據同發票。 Stripe 可以用電郵發送收據;商業用途可能需要正式發票。
- 費用。 每間供應商都會按交易收費。請查閱供應商目前嘅定價頁面,而唔好只依賴文章中嘅數字。
邊種設定適合你嘅 App
- **捐款或少量產品:**付款連結。參閱如何建立非牟利捐款網站。
- **有購物車嘅商店:**附有購買項目嘅 Checkout 加 Webhook。參閱如何建立網上商店。
- **SaaS 或會員制:**訂閱模式嘅 Checkout、Webhook 同客戶入口網站。參閱如何建立 SaaS MVP同如何為 SaaS 產品定價。
- **向賣家付款嘅市集:**需要另一套受更多規管嘅設定(Stripe Connect 或類似方案)。要另外規劃。
喺 Mythex 加入付款功能
喺 Mythex 建立嘅 App 收款,使用的是你自己嘅 Stripe 帳戶同金鑰;你嘅 App 冇一鍵「連接 Stripe」功能。一般流程如下:
- 取得 Stripe 測試金鑰。
- 將
STRIPE_SECRET_KEY(以及之後嘅 Webhook 機密)加入專案機密,可透過/secrets、專案設定,或者 Agent 需要金鑰時顯示嘅機密卡片。 - 用類似上面嘅提示詞,要求 Agent 加入 Checkout。
- 喺 Preview 用測試卡測試。登記 Webhook 之前要先發布,因為佢需要你嘅公開網址。
- 換成正式金鑰之後,再發布一次,令正式版 App 讀取新金鑰。
文件中可參閱使用 Stripe 收款同喺後端處理 Webhook。
常見問題
喺 App 入面收款最簡單嘅方法係咩?
Stripe 付款連結唔需要寫程式:你喺 Stripe 後台建立一個連結,然後由你嘅 App 連到佢就可以。如果你嘅 App 需要知道邊個付咗款,並自動解鎖某啲功能,就應該改用 Stripe Checkout 加 Webhook。
收款一定要用 Webhook 嗎?
如果你嘅 App 需要因應付款作出反應,例如解鎖帳戶、標示訂單已付款,或者處理續期,就一定要。Stripe 文件指出,你唔可以只依賴成功頁面,因為客戶可能付咗款,但從來冇到達該頁面。訂閱亦一定需要 Webhook。
點樣喺唔用真錢嘅情況下測試付款?
使用 Stripe 嘅沙盒(測試)API 金鑰同測試卡號,例如 4242 4242 4242 4242,有效日期可以填任何未來日期,CVC 填任何三位數字。測試交易唔會轉移真實金錢。
Stripe 會幫我處理銷售稅同增值稅嗎?
Stripe Tax 可以喺結帳時計算並收取稅款,亦會監察你可能需要喺邊度登記,但你仍然要對自己嘅稅務責任負責。請向會計師查詢你嘅情況。