訂閱
月費、年費走 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_id 或 subscription_data.metadata 用來對應你系統裡的使用者。
履約事件
| 事件 | 你該做的事 |
|---|---|
checkout.session.completed |
第一次付款完成,開通帳號 |
invoice.paid |
續訂成功,延長到期日 |
invoice.payment_failed |
通知顧客更新卡片,寬限期後停權 |
customer.subscription.deleted |
取消或未繳停用,立刻關權限 |
customer.subscription.updated |
升等、降等、暫停 |
權限以 Stripe 的 Subscription status 為準:active、past_due、canceled、unpaid。
顧客自助入口
不要自己做「改卡、取消」的完整後台,可建立 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
同一個 /webhook 用 event["type"] 分支即可。記得冪等:同一張 invoice 的 invoice.paid 可能重送。