說到支付網關,首先看一下網關的定義,網關的作用是實現網絡之間的通訊鏈接,包含兩個基本功能:網間連接和協議轉換。 同理,商戶業務系統中的支付板塊實現的就是商戶業務系統與銀行支付系統之間的鏈接,所起到的作用是類似的,可以被看作為一個網關。
因此,本文要講的支付網關設計,其實就是商戶業務系統的支付板塊設計,下文特指58集團支付網關的設計,但本文重在“網關”,不在“支付”。也所以,支付網關業務特性要求的功能方面就不再展開了,只介紹支付網關在通用網關設計要求上的功能部分,包括統一接口、渠道路由、安全校驗、權限校驗、IP白名單、流量削鋒、服務探活、監控報警、負載均衡等。
支付網關由來
初期,58支付系統為58集團各個業務線提供收銀台與充值頁(支付paycenter系統)的收款功能,58財務系統(apply系統)同樣為各個業務線提供了打款功能,根據用戶及業務要求,需要提供多家銀行收付款支持。初期為了快速迭代,通過分別直接對接第三方支付的系統接口來完成功能開發。這時可以理解為第三方支付系統就是58支付體系的網關。
后期,隨着公司業務發展及商務合作,58支付系統及58財務系統需要對接多家第三方支付服務,這時候需要解決的問題是如何簡單方便接入多家第三方支付服務,另外對58支付體系的需求也發生了變化,支付網關的位置也需要進一步前移,對58支付體系提出了更高的要求。這時我們決定搭建自己的支付網關,並針對常規業務及需求抽象出通用的功能模塊。
支付網關基礎設計
1)統一接口
2)渠道路由
3)安全校驗
4)權限校驗
5)IP表名單
6)流量削峰
7)監控報警
8)服務探活
9)負載均衡
統一接口
不同的第三方支付服務,它們針對基礎的收付款功能接口,各自有自己的接口參數及返回值格式要求。網關需要提供統一通用的接口,規定其參數及返回值,為上層業務屏蔽第三方支付服務接口的復雜性,這就要求支付網關需要具有接口適配能力。
下圖以連連收款與易寶收款為例,展現“統一接口”設計架構與處理流程。
注:以上設計使用到適配器模式實現。
渠道路由
接着上一部分,網關該如何選擇或路由到對應的第三方支付渠道,例如是通過微信或是支付寶,或是其他第三方支付渠道,網關提供多種策略,下面簡單介紹兩種。
1)渠道id策略路由:網關接入方通過顯示傳遞渠道id方式,例如收銀台默認選擇微信收款,則顯示傳遞給網關對應的微信渠道id,則網關通過渠道配置信息,選擇微信渠道進行收款。
2)費率計算策略路由:如上層業務未傳遞渠道id,則網關會根據判斷,選擇費率計算策略,例如第三方支付服務A每一筆收款都將收取1元手續費;第三方支付服務B單筆收款收取0.1%元手續費,則在單筆收款金額低於1000元時,走渠道B更為划算,反之則走渠道A更為划算。
下圖以連連收款與易寶收款為例,展現“渠道路由”設計架構與處理流程。
注:以上設計使用到策略模式實現。
安全校驗
如何判斷網關調用方是否擁有網關的接入權限,我們采用校驗參數簽名的方式。
1)網關的接入方將被分配到一個接入id(parterId)及接入秘鑰(secretKey)。
2)調用方調用網關接口時除了傳遞必要參數,仍將傳遞接入id,及參數簽名sign值;為了安全強度還將加入當前時間戳now作為簽名參數並作為參數並一同傳遞,用於控制安全訪問的時間范圍。
3)網關接到調用請求時將校驗參數簽名的合法性。
下圖以收款為例,展現“安全校驗”設計處理流程。
注:以上設計使用到請求攔截器及參數簽名校驗方式進行實現。
權限校驗
如何判斷網關調用方是否擁調用網關某一功能接口的權限。
1)網關的接入方將被分配到一個接入id(parterId),調用網關某一個功能接口時將作為參數進行傳遞。
2)網關接到調用請求時將根據權限配置,判斷對應的接入id是否擁有當前接口的訪問權限。
下圖以收款為例,展現“權限校驗”設計處理流程。
注:以上設計使用到請求攔截器實現。
IP白名單
如何判斷調用方請求是否來源於某一安全ip或網段。
下圖以收款為例,展現“IP白名單”設計的處理流程。
流量削峰
某些第三方支付服務接口對於一定時間內接口訪問次數存在一定限制,所以在流量高峰時,需要針對網關接口的請求進行流量削鋒。
1)根據redis zset數據結構實現時間窗口算法邏輯,記錄一定時間窗口內網關訪問某第三方支付服務特定接口的訪問次數。
2)與該接口的單位時間內限流值配置進行比較,需要限流則放入將調用請求信息放入redis隊列中。
3)異步補償模塊在流量低峰時,拉取redis隊列中的請求信息,完成接口調用;再通過消息模塊,異步通知網關的接入方調用結果。
注:通過redis zset實現的時間窗口算法,此處不再展開,可自行查閱網上資料。
監控報警
網關的異常根據分類可分為業務異常及系統異常,可以采用AOP實現異常的統一捕獲並進行細化分類,通過按照不同的分類作為不同屬性,上報wmonitor實現網關的監控報警。
服務探活
第三方支付服務接口的可用性,即包括其自身可用性,往往也包括網絡是否可達的問題。第三方支付服務不會主動通知網關其當前可用性信息,所以需要網關實現探活模塊,主動進行心跳檢測。
1)通過一定時間間隔窗口訪問各個第三方支付服務查詢接口,封裝探活模塊。
2)當發現某個第三方支付服務不可用時,異常屬性上報WMonitor,進行報警;並將該服務接口標識為不可用狀態,作為支付網關的渠道路由功能的前置判斷依據。
負載均衡
關於負載均衡,支付網關不需要保證對第三方支付服務的調用請求進行負載均衡控制,而是由第三方支付服務接口自身保證其可靠性及健壯性。但是支付網關依然針對特殊業務場景做了一些調用請求的均衡工作,例如支付網關通過輪詢方式調用招行3台前置機,方案也相對簡單,此處不表。
支付網關整體架構
支付網關除了上面介紹的一些通用網關的要求功能外,還有着支付體系要求的秘鑰服務、通知、配置、開放平台、預算、推薦等基礎功能。
以下是支付網關的功能架構圖
支付網關意義及運營現狀
意義

運營現狀
