Payment System 實戰系列(三):開發前的共同須知

當你遺失一筆 Invoice 時,你救不救的回來?

岷錡/Mencher
Starbugs Weekly 星巴哥技術專欄
5 min readFeb 24, 2020

--

Photo by Émile Perron on Unsplash

看完上篇對於支付平台的分析,接下來便來介紹自家 Server 前置準備。筆者大約整理出以下兩點:名詞介紹基礎概念 ,逐一和讀者進行開發前討論:

名詞介紹

在支付系統中,有幾項名詞須先和大家定義,在後續實作講解時,也都會改用以下名詞進行替換:

  1. Subscription : 訂閱 (週期性扣款,如 netflix)
  2. Plan:訂閱方案 (如 Netflix 一個月有 3 種價格方案可以選)
  3. Product:產品(一次性扣款,如在蝦皮上買一個包)
  4. Invoice:發票(不論購買訂閱、產品,都有發票)

基礎概念

  1. Atomic 操作

在支付系統中,Atomic 操作是必需品。筆者先陳述以下情境:

使用者看見的情境:

後端要操作的情境:

而這之間只要任一操作無法成功,就一定得依序重來!否則資料就會有不齊全的狀況,尤其使用者付了,給了錢沒有服務,對於消費體驗是相當差的。

讀者可能認為,自家 DB 操作可以順其自然的使用 Transaction Operation ,確保 Atomic 行為,不行就會 Rollback 。可是讀者需要注意,這一連串行為中,牽涉到與第三方服務(支付系統)的交易,不僅僅是自家 DB 的操作,這部分的處理就需要多費點心。

筆者在此列出幾點重要的開發習慣:

  1. 妥善運用 Database 的 Transaction Operation

2. 全端思考法則

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 呈現出的資料型態便完全不同。

在你自家的 DB 規劃上,要怎麼讓兩種不同格式的資料整合在一起,便是需要面對的課題。

筆者也在前文提過,建議讀者要實踐高兼容的支付系統時,儘量還是以 Stripe 當範本,其他支付平台(Apple / Google …)再去 mapping 相對應的欄位較好喔~

最後,我列了幾項開發支付系統的工程師,必須時時刻刻記載內心的問題:

  1. 當客服進來時,發現重複付費 / 訂閱,你該怎麼辦?
  2. 使用者在付費期間重新整理,或 Server 意外 Crash,你該怎麼辦?
  3. 當你遺失一筆 Invoice 時,你救不救的回來?
  4. 考量後續平台整合,要串接 Line Pay 時,你該怎麼辦?
  5. 橫跨平台的付費及訂閱,如何追蹤?

若你在開發時,能謹記在心這些法則,想出方法解決,恭喜你,你的支付系統已經相當強悍了!

準備好 Server,下一篇就會帶你了解 Stripe 的實作了~(待)

--

--

岷錡/Mencher
Starbugs Weekly 星巴哥技術專欄

Googler. UC Berkeley EECS Master Student. System Architect & Backend Engineer. President of 7th Mei-chu Hackathon, founder of Hackathon Taiwan Junior.