Payment System 實戰系列(三):開發前的共同須知
當你遺失一筆 Invoice 時,你救不救的回來?
看完上篇對於支付平台的分析,接下來便來介紹自家 Server 前置準備。筆者大約整理出以下兩點:名詞介紹、基礎概念 ,逐一和讀者進行開發前討論:
名詞介紹
在支付系統中,有幾項名詞須先和大家定義,在後續實作講解時,也都會改用以下名詞進行替換:
- Subscription : 訂閱 (週期性扣款,如 netflix)
- Plan:訂閱方案 (如 Netflix 一個月有 3 種價格方案可以選)
- Product:產品(一次性扣款,如在蝦皮上買一個包)
- Invoice:發票(不論購買訂閱、產品,都有發票)
基礎概念
- Atomic 操作
在支付系統中,Atomic 操作是必需品。筆者先陳述以下情境:
使用者看見的情境:
A 用戶訂閱你的服務 → 喔訂閱成功了!
後端要操作的情境:
收到 A 用戶訂閱 → 更新使用者狀態為 Purchasing → 向支付平台提出刷卡需求 → Webhook 收到刷卡成功,自家 DB 建立一筆訂閱 → 自家 DB 建立發票 → 更新使用者權限(也許他是月訂閱,就給他一個月的使用權限) → 更新使用者狀態 Finish 。
而這之間只要任一操作無法成功,就一定得依序重來!否則資料就會有不齊全的狀況,尤其使用者付了錢,給了錢沒有服務,對於消費體驗是相當差的。
讀者可能認為,自家 DB 操作可以順其自然的使用 Transaction Operation ,確保 Atomic 行為,不行就會 Rollback 。可是讀者需要注意,這一連串行為中,牽涉到與第三方服務(支付系統)的交易,不僅僅是自家 DB 的操作,這部分的處理就需要多費點心。
筆者在此列出幾點重要的開發習慣:
- 妥善運用 Database 的 Transaction Operation
用 Transaction 交易包住同一系列(series)的操作,避免一系列的資料發生無法比對情況。而若系列操作中牽涉 Third Party API,則想想:
1. 將 Third Party API 放在 DB Operation series 的頭或尾。
2. 若不行,一定要處理 Third Party API 的 Undo。
2. 全端思考法則
從前端起步 → 前後端 API 串接 → 後端邏輯處理 → 後端 Webhook events 處理由於支付流程上,任一環節出錯都會導致付費失敗,譬如前端使用者付費時重新整理...因此,務必確保這一趟流程,主掌開發支付系統的工程師都可以掌握,方便後期維運時不至於在找問題身上花太多心思。
2. Third Party API 串接經驗
因為支付流程大部分的心力,不是在企求運算多快,反而是確保行為完整。串接 Third Party API 並不困難,反而是需要有閱讀英文 Document 的能力!
而當然,大部分操作都是 IO 與 Third Party API Communication ,因此選用 Node / PHP … 開發環境,應該就符合你的需求了。
3. Payment Flow
畫出你的後端處理流程圖,譬如 一次性付費 / 週期性付費 / 訂閱 / 退訂 / 退款 …… ,這些行為預計在你系統怎麼跑。
由於大部分支付系統的行為,都會牽涉到 Webhook 的串接(什麼是 Webhook 可以參考這裏),因此操作的程式碼也許不會是上行接下行。因此完整的流程圖可以方便開發者的你 / 客服人員 / 後續接手的工程師快速了解這些流程怎麼跑。
4. 如何整合多家平台
當你想兼容各家支付平台時,你的首要議題便是,如何在自家 DB 規劃出清晰資料面。
以 Stripe + Apple In-App Purchase 為例,如果你要實踐週期性付費系統,Stripe 與 Apple In-App Purchase 呈現出的資料型態便完全不同。
Stripe: User -> Subscription -> Invoice
Apple : Receipt (就只有 receipt!)
在你自家的 DB 規劃上,要怎麼讓兩種不同格式的資料整合在一起,便是需要面對的課題。
筆者也在前文提過,建議讀者要實踐高兼容的支付系統時,儘量還是以 Stripe 當範本,其他支付平台(Apple / Google …)再去 mapping 相對應的欄位較好喔~
最後,我列了幾項開發支付系統的工程師,必須時時刻刻記載內心的問題:
- 當客服進來時,發現重複付費 / 訂閱,你該怎麼辦?
- 使用者在付費期間重新整理,或 Server 意外 Crash,你該怎麼辦?
- 當你遺失一筆 Invoice 時,你救不救的回來?
- 考量後續平台整合,要串接 Line Pay 時,你該怎麼辦?
- 橫跨平台的付費及訂閱,如何追蹤?
若你在開發時,能謹記在心這些法則,想出方法解決,恭喜你,你的支付系統已經相當強悍了!
準備好 Server,下一篇就會帶你了解 Stripe 的實作了~(待)