乾貨!支付業務如何防止資損?
防止資損是支付系統最重要的目標之一,不論是進行支付中臺建設,還是作爲業務系統接入支付能力,涉及到資金流轉的場景需謹慎!謹慎!再謹慎!
定義資損
狹義的 “資損” 是直接資金損失,涉及到資金流轉過程發生的賬戶金額損失,比如用戶多扣了錢、商戶少收了錢等等。
廣義的資損是指間接的資金損失,在由於某些原因導致潛在收款失敗,比如系統宕機導致大量用戶無法進行支付付款。
資損的本質是由於產品、技術或安全等原因導致的相關方的資金損失。
預防資損的整體框架
流程規範
規範先行,防患於未然!
在穩定性建設、高可用建設的實踐中總是少不了 “流程規範” 的影子,同樣,在資損預防建設中流程規範的強制管控也必不可少。通過前置動作,識別和避免可能出現的資損問題是有效的工程實踐。
監控體系
及時的預防、發現、定位資損問題是資金安全建設重要的一環,依託完整的監控告警能力建設,團隊能夠及時發現和定位資損的發生。
對賬體系
對賬是支付業務資金安全的最後屏障!通過多方對賬事後發現信息流和資金流流轉鏈路裏發生的資損問題,並通過自動化或人工方式進行平賬。
系統安全
涉及到資金處理的系統,其安全性不言而喻。
工程質量
工程實現是防止資損最重要的環節之一,把控開發實現及測試驗證的質量是防止資損的關鍵。
流程規範
在產品方案評審和技術方案評審環節重點關注涉及到資金的內容。例如,產品方案層面需要關注資金流、資金流轉的合規和安全、涉及資金操作權限和認證等等。再比如,技術方案層面關注資金操作的實現機制。
* 產品方案:信息流、資金流、正向場景、逆向場景、異常場景等
* 技術方案:冪等性、狀態機、異常處理、重試補償、併發、監控覆蓋等
* 上線發佈:預發驗證、灰度發佈、應用回滾和數據回滾策略等
監控體系
監控告警是系統穩定性建設的重要組成部分,系統的穩定性與資金安全息息相關。大體上,監控分爲系統監控和業務監控兩個維度。
* 系統監控維度:在網絡、主機、應用、數據庫、中間件、外部依賴系統等多個監控維度進行覆蓋。
* 業務監控維度:關注業務維度的監控指標,在支付場景下,重點關注比如支付單狀態流轉、金額突變、交易成功率、手續費差異率等等
系統安全
安全層面涉及到多個維度,既有產品功能能力支持、又有系統層面的能力建設。
* 用戶功能:涉及到資金操作需要有登錄認證、功能權限、數據權限控制,同時在某些場景下需要一定的審批機制。資金操作需要在系統留痕,作爲審計追蹤的憑證。
* 客戶端調用: 考慮通信鏈路的安全、敏感數據的脫敏以及權限控制
* 數據存儲:敏感數據密文存儲、數據禁止出域等
* 支付通道:基於下游通道潛在不穩定性假設,支付核心要進行必要的限流、降級、熔斷設計,同時,在業務層面考慮多支付通道的備份。
* 安全平臺:識別、攔截對系統的潛在威脅,掃描異常安全事件並治理
* 風控:對系統內的資金流有一定的風控策略,進行事中和事後的交易攔截管控。
工程質量
常見的工程質量導致的問題包括:
* 計算金額錯誤:內部計算邏輯錯誤,金額不一致,金額計算四捨五入導致丟失等等
* 支付狀態不一致:支付通道相應狀態處理不完備、響應碼處理不嚴謹、
* 重複交易:冪等擊穿、
* 非法交易:功能越權、數據越權、交易筆數異常、金額異常等
冪等性
冪等性設計是支付系統最爲重要的要素之一,諸多不確定性因素都會導致重複請求:
* 用戶多次點擊支付按鈕:在網絡較差或系統過載情況下,用戶由於不確定交易是否完成而重複點擊。
* 自動重試機制:系統在超時或失敗時重試請求,可能導致同一支付多次嘗試。
* 網絡數據包重複:數據包在網絡傳輸過程中,複製出了多份,導致支付平臺收到多次一模一樣的請求。
* 異常恢復:在系統升級或崩潰後,未決事務需要根據已有記錄恢復和完成。內部系統重發操作。
對於冪等性設計,技術方案需要考量:
* 業務單號唯一性
* 分佈式鎖控制
* 事務
* 補償機制
金額計算
涉及到小數場景的金額計算比如包括了費率因子,必須使用 BigDecimal 類型
金額存儲
數據庫表設計對金額字段使用最小單位,比如分,字段類型選擇 Long 或 int,禁止使用浮點型進行存儲
支付狀態機
明確下游系統以及支付通道側的接口相應狀態,完備分析每種狀態在當前系統中如何進行映射。基於下游支付通道支付單狀態機,明確每種狀態上層系統的處理策略。編程實現要對未知狀態進行兜底行的防禦型編程,因爲,渠道側的返回狀態有可能發生變化 (比如系統升級未通知到調用方),因此,一定要對可能出現的位置狀態進行兜底處理並監控這種異常。
支付通道響應碼
明確下游系統以及支付渠道側的響應碼,避免遺漏。支付系統應該明確每個(有時候是每個類別)響應碼的處理策略。比如:
* 返回成功碼如何處理
* 返回失敗碼如何處理
* 返回超過調用 QPS 限制如何處理
* 返回權限認證問題如何處理
* ......
同時,也需要對未知響應碼有兜底策略,不能由於業務邏輯處理不完備導致系統出現資損或不可用。
權限校驗
從產品和工程層面,涉及到資金操作要有權限校驗功能,比如:
* 進行資金操作必須要進行登錄認證鑑權
* 資金操作要進行功能權限校驗
* 資金操作要進行後端數據權限校驗
* 資金操作要進行安全認證和審覈操作
* ......
接口入參校驗
與支付相關的服務需要有嚴格的、強制的入參校驗。典型的校驗包括:
單元測試覆蓋
涉及到金額計算的部分必須要有 100% 的單元測試用例覆蓋,特別是要有邊界值、非法值的驗證。
審計日誌
涉及到資金操作系統要進行留痕,便於後續的審計日誌追蹤以及監控分析。
對賬體系
對賬是支付業務資金安全的最後屏障!
從實時性考慮,對賬可以分爲離線對賬和實時對賬。
* 實時對賬:異構支付單據數據,當數據有變動時,實時查詢雙方系統進行數據覈對。
* 離線對賬:就是把生產數據庫的數據定時清洗到離線庫,通過離線任務進行覈對。
從對賬方考慮,對賬可以分爲系統內對賬和系統間對賬。
* 系統間對賬:支付核心與支付渠道系統、上下游依賴系統間的資金對賬
* 系統內對賬:系統內部不同間的對賬主要是信息流覈對,多建於微服務拆分的子系統間。主要覈對交易金額、筆數、狀態等
結語
涉及到支付資損的場景非常多,預防資損涉及到流程、安全、工程質量、監控、對賬等多個維度。實際工程中好的實踐是從事前、事中、事後對潛在的資損進行識別管控。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/gL97gOKNEhY_4Z88WJpZcA