金流服務如何避免重複付款?
整合金流服務 100% 會遇到的經典問題,就是「重複付款」,這原因不外乎是使用者在前端介面按了好幾次的付款,或者後端請款的 API 因為錯誤重試(retry)導致重複請款,這些情況都會導致使用者重複付款,一旦被發現絕對是會重創公司聲譽的情況,一定要小心! 所以針對這種絕對不能重複發生的 API, 開發上會要求羃(ㄇㄧˋ)等性(idempotency),也就是說無論前端或後端怎麼呼叫 API ,只要 API 參數相同,結果就會 100% 相同,譬如付款 API 回傳失敗就是失敗,不會多呼叫幾次就突然變成付款成功。
為了讓 API 有所謂的羃等性,我們通常會在 API 裡添加所謂的 idempotency key (一定愛配 lock ),這個 key 通常由後端產生,最直覺的值就是訂單編號,前端拿到 idempotency key 之後,後續呼叫 API 就得代入這組 key, 後端伺服器在後續的處理都會以這組 idempotency key 進行檢查,例如檢查是否已經訂單取消、或者請過款等等,並回傳結果予前端。
Airbnb 也分享他們怎麼處理重複付款的文章,有興趣的話可以花點時間閱讀一下 Avoiding Double Payments in a Distributed Payments System