Skip to content

建立 2026-09-14 更新 2026-09-14

訂閱

月費、年費走 Checkout Session + mode="subscription",不必自己排程扣款。Stripe 到期會開 Invoice 並請款,你用 webhook 開關會員權限。

建立訂閱結帳

先在 Dashboard 建 Product,Price 設為 Recurring(例如每月 TWD 199)。程式只傳 Price ID:

session = stripe.checkout.Session.create(
    mode="subscription",
    line_items=[{"price": "price_每月方案", "quantity": 1}],
    success_url=DOMAIN + "/success?session_id={CHECKOUT_SESSION_ID}",
    cancel_url=DOMAIN + "/cancel",
    client_reference_id=str(current_user.id),
)
return redirect(session.url, code=303)

client_reference_idsubscription_data.metadata 用來對應你系統裡的使用者。

履約事件

事件 你該做的事
checkout.session.completed 第一次付款完成,開通帳號
invoice.paid 續訂成功,延長到期日
invoice.payment_failed 通知顧客更新卡片,寬限期後停權
customer.subscription.deleted 取消或未繳停用,立刻關權限
customer.subscription.updated 升等、降等、暫停

權限以 Stripe 的 Subscription status 為準:activepast_duecanceledunpaid

顧客自助入口

不要自己做「改卡、取消」的完整後台,可建立 Customer Portal

portal = stripe.billing_portal.Session.create(
    customer=stripe_customer_id,
    return_url=DOMAIN + "/account",
)
return redirect(portal.url, code=303)

Dashboard 先開啟 Billing Portal,設定允許取消、改方案等。

與一次付清共用同一支 webhook

同一個 /webhookevent["type"] 分支即可。記得冪等:同一張 invoice 的 invoice.paid 可能重送。