所有的支付系統都對接了很多的外部支付、流出、外匯等各種類型的渠道,這些渠道的接口和報文格式各異。今天和大家一起聊聊如何實現一種簡潔高效的低代碼報文網關設計,主要包括:報文網關的定位,三種形態,低代碼報文網關的設計思路,系統架構,核心代碼實現。
如果你做過支付系統并寫過腳本或代碼對接過渠道,或者你好奇如何通過低代碼來對接外部千奇百怪的渠道,歡迎一起探索。
1. 前言
在數字支付領域的深處,存在著一個關鍵的、卻往往被忽視的英雄——報文網關。作為支付系統與外部世界溝通的橋梁,報文網關承擔著參數轉換、報文組裝與解析、安全加密、簽名驗簽等多重重要任務。
一般來說,小型公司可能根本就沒有報文網關這一說法,直接引入HttpClient包,手擼幾個類,就把一個渠道對接搞定。稍大的公司,可能做一些模板方法的抽象,或者一些組件的抽象,也能實現一定的高效接入及復用。但對于更大型跨國公司,如果接入的渠道有幾百條,這樣手寫接入渠道,往往伴隨著代碼高復雜性和高維護成本。因應這一挑戰,"低代碼報文網關"的概念應運而生。
在本文中,我們將一起探索這種低代碼報文網關的創新設計。我們會從報文網關在支付系統中的角色和重要性入手,然后深入探討低代碼報文網關的工作原理、產品架構、系統架構以及核心代碼實現。我們的目標不僅是理解其技術細節,更是領悟其背后的設計哲學——如何在保證系統強大功能的同時,實現更高的接入效率和可維護性。
這篇文章旨在為廣大支付技術從業者、軟件開發者以及對支付系統感興趣的讀者們,提供一個全新視角來理解和應用低代碼報文網關。
2. 報文網關在支付系統中的定位
報文網關最核心的職責就是對接外部渠道的API接口,把內部的請求發出去,把渠道返回的數據轉成內部的參數。
這里面還涉及到很多技術細節,比如參數轉換、簽名驗簽、加密解密、報文組裝解析,發送接收等。
在前面的兩篇文章中,我們介紹了渠道網關,兩者的區別在于:
渠道網關:是一個更大范圍的網關,還包括渠道路由、渠道開關、渠道咨詢等能力。
報文網關:是渠道網關的一部分,只負責對接渠道的接口,小團隊可能只是一個小模塊,大團隊可能會獨立出應用。
3. 報文網關的幾種形態
一般來說,從簡單到復雜、從固定到靈活,報文網關會存在四種形態:
- 純手擼代碼:
- 在這種最初級的形態中,每個外部渠道都需要單獨的代碼實現。這意味著為每個新接入的銀行或支付服務,開發團隊需要編寫一套新的接口邏輯。
- 優點:針對性強,可以精確控制每個渠道的交互細節。
- 缺點:隨著接入渠道的增多,代碼變得越來越復雜,維護和擴展的成本急劇上升。
- 模板方法報文網關:
- 這種形態通過引入模板方法模式,將報文處理流程的共通部分抽象出來,為各個渠道提供統一的處理框架,同時留有接口供具體渠道實現其特定邏輯。
- 優點:提高了代碼的重用性,降低了維護成本。
- 缺點:對于一些特殊需求,模板方法可能仍然不夠靈活,需要額外的定制。
- 低代碼報文網關:
- 低代碼報文網關把所有核心的代碼邏輯實現后,只需要寫幾個配置文件,就可以完成渠道的接入。
- 優點:極大地提高了靈活性和易用性,加快了新渠道的接入速度,核心代碼由有經驗的資深員工編寫,減少出錯可能性。
- 缺點:復雜場景下可能需要寫一些內聯函數,造成了一定復雜度。
- 產品化配置報文網關:
- 在低代碼報文網關基礎上,提供圖形化配置界面,進一步降低使用難度。
- 優點:極大地提高了易用性,加快了新渠道的接入速度,以前寫代碼可能需要4、5天才接一個接口,變成可能0.5天就能接一個接口。
- 缺點:平臺的初始研發成本很高,如果總體接入的渠道不多,ROI可能不高。
每種形態都反映了各公司在特定時期的技術水平和方案造型,但總體來說,對于中大型公司來說,低代碼報文網關和產品化配置報文網關是一個比較不錯的選擇。一方面可以提高效率,另一方面也有足夠的研發資源來建平臺。
4. 一種低代碼報文網關設計思路
首先我們要知道報文網關核心只做這么幾件事:
- 接收內部應用的請求。
- 內部標準參數轉成外部渠道的參數。比如內部叫mobileNo,渠道可能叫:mobile_id。
- 特定字段加密(可選,由渠道定)。
- 組裝需要簽名的明文字符串并簽名。
- 組裝發送報文,比如有json,kv,xml等。
- 對報文整體加密(可選,由渠道定)。
- 發送請求,并接收請求。
- 對報文整體解密(可選,由渠道定)。
- 解析報文。
- 組裝驗簽明文字符串并驗簽。
- 特定字段解密(可選,由渠道定)。
- 外部返回參數轉成內部標準參數。
- 返回給內部應用。
通過上面的流程分析,我們很容易想到流程引擎或責任鏈處理,再加一個上下文,就可以實現全部的操作。
具體包括:
- 可視化配置:提供直觀的用戶界面,允許用戶通過圖形化方式配置報文的處理流程,無需編寫復雜的代碼。
- 模塊化處理邏輯:將報文處理的各個步驟模塊化,如報文解析、加密/解密、數據映射等,用戶可以根據需要組合這些模塊來構建完整的處理流程。
- 靈活的適配能力:支持靈活地適配不同的支付渠道,包括但不限于銀行接口、電子錢包、第三方支付平臺等。
- 動態配置管理:所有配置信息動態管理,支持實時更新,無需重啟系統或重新部署。
5. 低代碼報文網關的系統架構
說明:
- 最上層是API:核心服務和管理服務分離。
- 核心上下文:主要是用于保存接口配置,原始請求,中間處理結果等。
- 核心處理Handler:參數轉換、加密、解密等全部基礎功能全部組件化。
- 流程引擎:負責串起所有的Handler依次運行。
- 內聯函數:解決特殊場景下的報文轉換。
- 配置中心:配置內部接口,外部接口,參數映射等。
- 流程管控:發布、回滾、權限管理等能力。
通過這種系統架構,低代碼報文網關不僅能夠提供強大靈活的配置能力,還能確保處理流程的穩定執行,同時保持高度的可維護性。這樣的架構使得報文網關能夠適應不斷變化的業務需求,同時降低了總體的維護成本和技術復雜性。
6. 低代碼報文網關的核心代碼實現
代碼實現有很多種方式,且報文網關也是一個獨立的應用,把所有的代碼展示出來也不太現實。這里給出上面系統架構圖中的核心代碼示例。讀者可以擴展實現細節,有興趣的同學也可以私信我。
整體思路如下:
- 設計數據庫表結構:用于存儲內部接口定義,外部接口定義,接口映射關系,外部渠道參數等。這部分在這里略過。
- 設計運行上下文:GatewayContext(保存處理的上下文信息,包括接口配置、內部請求參數、加解密臨時數據、加驗簽臨時數據、發送渠道報文、渠道返回原始報文、解析后報文等)。
- 設計各種處理Handler:內部參數轉外部參數Handler,加密handler,簽名Handler,報文組裝Handler,發送Handler,報文解析Handler,驗簽Handler,解密Handler,外部參數轉內部參數Handler等。
- 設計Handler工廠類:GatewayHandlerFactory(通過getHandlers()獲取處理的責任鏈)。
- 設計內聯函數:用于處理一些復雜操作。比如外部渠道返回的幣種和金額兩個字段轉成內部的一個Money類。這部分在這里略過。
下面是核心代碼組件包括GatewayContext、GatewayHandlerFactory 和一系列的 GatewayHandler 基本實現:
GatewayContext 類用于保存處理過程中的上下文信息,包括臨時參數、報文信息等。
public class GatewayContext { // 接口配置信息 private interfaceInfo interfaceInfo; // 原始請求 private Map<String, Object> originalRequestParam; // 轉換后參數 private String requestParam; // 簽名明文 private String signPlanContext; // 省略部分參數,以及getter和setter方法 ... ...}
GatewayHandlerFactory 是一個工廠類,用于構建處理責任鏈。
public class GatewayHandlerFactory { private static final List<GatewayHandler> handlers = new ArrayList<>(); static { handlers.add(new ParameterTransformHandler()); handlers.add(new EncryptionHandler()); handlers.add(new SignatureHandler()); // 添加其他handler ... ... } public List<GatewayHandler> getHandlers() { // 添加其他handler return handlers; }}
GatewayHandler 接口定義了處理邏輯的執行方法。
public interface GatewayHandler { void execute(GatewayContext context);}
具體的 Handler 實現:
內部參數轉外部參數Handler
public class ParameterTransformHandler implements GatewayHandler { @Override public void execute(GatewayContext context) { // 實現內部參數到外部參數的轉換邏輯 }}
簽名Handler
public class SignatureHandler implements GatewayHandler { @Override public void execute(GatewayContext context) { // 不需要簽名 if (!context.isNeedSign()) { return; } context.setSignMessage(sign(context.getSignPlainContext(), context.getInterfaceInfo().getSignConfig())); } // 簽名方法略}
其它Handler的實現略。
執行Service
public class GatewayServiceImpl implements GatewayService { @Override public GatewayResponse execute(GatewayRequest request) { // 轉成網關的上下文 GatewayContext context = buildGatewayContext(request); // 獲取責任鏈,依次執行 List<GatewayHandler> handlers = GatewayHandlerFactory.getHandlers(); for(GatewayHandler hander : handlers) { hander.execute(context); } // 轉換返回 return convertResponse(context.getResponseParam); } // 其它代碼略 ... ...}
這些組件和處理器共同構成了低代碼報文網關的核心功能,允許系統靈活地配置和處理支付系統與外部渠道之間的報文交換。通過這種設計,報文網關可以輕松適應不同支付渠道的接入和業務流程的變更,同時大大減少了傳統編碼方式所需的開發和維護工作。
7. 結束語
在本文中,我們深入探討了報文網關在支付系統中的重要性,從其在支付系統中的定位、不同形態的發展,到一種具體的低代碼設計思路,以及詳細的系統架構。我們還看到了核心代碼的實現,展示了如何通過靈活的處理器和上下文管理,實現報文網關的關鍵功能。
產品化配置的低代碼報文網關通過提供直觀的配置界面和強大的后端處理能力,使得支付系統更加靈活,能夠快速適應新的支付渠道和業務模型。同時,它也降低了技術門檻,使得初始技術人員能夠更容易地參與到支付渠道的對接中,而不用擔心技術太菜可能導致的各種各樣的問題。
這是《百圖解碼支付系統設計與實現》專欄系列文章中的第(23)篇。點擊上方關注,和墨哥一起深入解碼支付系統的方方面面。
前一篇:《圖解渠道網關(二):模型、狀態機與流程編排》
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。