自動儲值 · Sprint 功能流程文件 ⚡ 第二階段
⚡ 自動儲值設定 — 功能流程
涵蓋「用戶設定流程」與「後端自動觸發流程」兩段,搭配 UI 模擬與業務規則說明。
1
用戶設定流程
💡
用戶進入 帳號設定 › 使用額度 › API 生成點數 區塊,設定自動購買方案與觸發門檻後儲存啟用。
步驟
U用戶
F前端
B後端
1
進入頁面
開啟 使用額度 Tab
帳號設定 › 使用額度
GET API 生成點數餘額
顯示剩餘點數、現有設定值
2
前置檢查
✦ 前置條件檢查
❌ 未主動購買過 API 點數
→ Toast「請先購買 API 點數,即可開啟自動儲值」
❌ 未綁定信用卡
→ 彈出「新增付款資訊」Modal → 導向 ECPay 綁卡
✅ 已購買 + 已綁卡 → 開放設定區塊
3
填寫設定
選擇自動購買方案
方案 A(9 萬點)/ 方案 B(75 萬點)/ 方案 C(300 萬點)
設定觸發門檻
上限 = 所選方案點數 ÷ 10(如方案 A → 上限 9,000 點)
選擇方案後自動帶入預設門檻
預設值 = 上限值(方案點數 ÷ 10)
更新上限提示文字
「上限:X 點(超出將自動修正)」
4
儲存啟用
點擊「儲存並啟用」
POST 儲存自動儲值設定
方案、門檻、啟用狀態
寫入自動儲值設定
存至 Api_Quota 或獨立 collection
✅ 成功 → 回傳 200
❌ 失敗 → 回傳 4xx/5xx
5
結果呈現
✅ 成功
標題右側顯示「● 自動儲值:已啟用」綠色 badge
「儲存設定」→ disabled
顯示「停用自動儲值」按鈕
❌ 失敗
Toast「設定更新失敗,請稍後再試」
6
停用(選項)
點擊「停用自動儲值」
POST 更新設定(enabled: false)
✅ Toast「自動儲值已停用」,還原初始 UI
2
後端自動觸發流程
此流程不由用戶操作觸發,而是後端定時(最多每小時一次)檢查餘額並自動扣款。
步驟
U用戶
B後端(排程)
P金流(ECPay)
T1
排程觸發
定時任務執行
每小時輪詢:找出「已啟用自動儲值」的帳號
T2
餘額判斷
✦ 查詢 API 點數餘額
餘額 ≥ 觸發門檻 → 略過,不觸發
餘額 < 觸發門檻 → 進入購買流程 ↓
T3
扣款請求
取得綁定信用卡 token
從 DB 讀取用戶綁卡資訊
呼叫 ECPay 定期定額 / 重複交易 API
金額 = 選定方案售價(NT$900 / $6,000 / $18,000)
接收扣款請求
✅ 扣款成功 → 回傳成功
❌ 扣款失敗 → 回傳失敗原因
成功路徑
收到自動儲值成功通知 Email
含:購買方案、金額、新增點數、扣款時間(信件規格待補)
寫入 API 點數(+ 方案點數)
寄送成功 Email 通知
觸發時間、方案名稱、點數、剩餘餘額
記錄本次觸發時間(防 1 hr 內再觸發)
失敗路徑
收到自動扣款失敗 Email
含:失敗原因、請自行前往購買或更換卡片(信件規格待補)
不補充點數
寄送扣款失敗 Email 通知
仍記錄觸發時間(防 1 hr 內再次嘗試)
3
業務規則 & 邊界條件
規則說明執行層
每小時最多觸發一次 同一帳號即使餘額持續偏低,每小時最多執行一次自動扣款 後端
先主動購買才能啟用 用戶必須至少主動購買過一次 API 點數,才能開啟自動儲值;前端檢查 hasPurchased 狀態 前端
需已綁定信用卡 未綁卡時點擊「儲存並啟用」→ 開 ECPay 綁卡 Modal;綁卡完成後才能儲存 前端
門檻最低 / 上限 最低 1,000 點;上限 = 所選方案點數 ÷ 10(例如方案 A 9 萬點 → 上限 9,000 點);超出自動修正 前端
門檻選項可配置 門檻清單與方案對應建議值應設為 config / DB 可配置,不寫死於程式碼 後端
點數永久有效 透過自動儲值購入的點數同樣永久有效、Roll over,不受訂閱狀態影響 後端
Email 規格待補 「自動儲值成功通知」與「自動扣款失敗通知」信件內容規格尚未完成,PM 補充後才能實作寄信功能 待規劃
4
UI 模擬 — 自動儲值設定區塊
📍
位置:帳號設定 › 使用額度 Tab › API 生成點數 卡片下半段。點數餘額顯示於上方,自動儲值設定在分隔線之後。
狀態 A — 尚未啟用
⚡ 自動儲值設定
自動儲值:未啟用

請設定您的自動購買方案與觸發門檻,觸發後系統將會自動購買與儲值點數,並寄送 Email 通知。

當點數低於以下設定值,將自動觸發補充點數
最低 1,000 點;上限依所選方案而定
狀態 B — 已啟用
⚡ 自動儲值設定
自動儲值:已啟用

請設定您的自動購買方案與觸發門檻,觸發後系統將會自動購買與儲值點數,並寄送 Email 通知。

當點數低於以下設定值,將自動觸發補充點數
最低 1,000 點;上限:9,000 點(超出將自動修正)