天天看點

完整的支付系統整體架構!

2017-12-04 08:57:44

整理于網絡

從産品分類、子產品功能和業務流程,了解支付産品服務的設計。

支付産品子產品是按照支付場景來為業務方提供支付服務。這個子產品一般位于支付網關之後,支付管道之前。 它根據支付能力将不同的支付管道封裝成統一的接口,通過支付網關來對外提供服務。是以,從微服務的角度來說,支付産品本身也是一個代理模式的微服務,它透過支付網關響應業務方請求, 進行一些統一處理後,分發到不同的支付管道去執行,最後将執行結果做處理後,通過支付網關再回傳給業務方。支付産品在支付系統架構圖中的位置,如下圖所示:

完整的支付系統整體架構!

産品分類

在不同的公司由于接入管道和應用的差異,對支付産品分類略有不同。綜合支付場景和流程,支付産品可以分為如下幾類:

完整的支付系統整體架構!

支付産品是由支付系統對支付管道進行封裝而對業務方提供的支付能力。整體上來說,可以提供如下支付産品:

1. 快捷支付

使用者在完成綁卡之後,在支付的時候,不需要再輸入卡或者身份資訊,僅需要輸入支付密碼就可以完成支付。對于小額度的支付,甚至可以開通小額免密,直接完成支付。 這種支付方式不會打斷使用者的體驗,是目前主要的線上支付方式。一般快捷支付産品是通過封裝銀行或者第三方支付平台提供的快捷支付接口或者代付接口來實作的。

2. 網銀支付

使用者在支付的時候,需要跳轉到銀行網銀頁面來完成支付。在網銀頁面,需要輸入使用者的卡号和身份資訊。這種支付方式會中斷使用者目前的體驗,一般僅用于 PC Web 上的支付。 網銀支付是封裝銀行提供的網銀支付來實作。

3. 協定支付

協定支付也稱代收或者代扣,代收指管道授權商戶可以從使用者的銀行賬戶中扣款,一般用于定期扣款,不用于日常消費。比如水電瓦斯、有線電視費。協定支付是通過封裝銀行、第三方支付提供的代扣或者快捷接口來實作。

4. 平台支付

使用微信、支付寶等第三方支付平台來完成支付。使用時,一般需要使用者預先安裝支付平台系統(手機上),注冊并登入到第三方支付平台,并且已經在該平台上完成綁卡等操作。 由于微信、支付寶已經被大量使用,使用者也産生對這些平台的信任,平台支付往往是電商公司的主要支付方式。

5. 外卡支付

對于由海外支付的需求,還需要提供外卡支付支援。 國内不少支付管道都能支援外卡支付,如支付寶全球購等。直接對接 Paypal,也是目前用的最多的外卡支付管道。

6. 話費支付

對于有包月小額類型的支付,手機話費也是一個不錯的選擇。目前也有一些平台可以支援話費支付,比如虹軟、關聯優勢等。

7. 虛币支付

不少公司會有自己的虛拟币,比如京豆、Q币等。這些虛币也可以作為一種支付方式。

8. 賬戶支付

也稱為餘額支付、零錢支付等。 指為使用者建立本地賬戶, 支援充值,之後可以使用這個賬戶來完成支付。

9. 信用支付

如京東的白條,螞蟻花呗等,指使用信用賬戶進行透支,類似信用卡支付。

10. 代付

和代扣相反,代付是平台将錢打給使用者。

子產品功能

支付産品根據其支付能力,對外提供不同的功能。整體上來說,一般支付産品需要提供如下接口:

完整的支付系統整體架構!

1. 簽約和解約

在快捷支付、代扣等産品中,使用者在使用前,需要先完成簽約。簽約可以在管道側進行,一般第三方支付采用這種方式,當電商需要接入時,讓第三方給授權。 銀行和銀聯的簽約一般是在電商側進行, 電商側負責收集使用者的資訊,調用銀行和銀聯的接口進行簽約。簽約後,後續的支付行為就使用簽約号來進行,無需再輸入個人資訊。 和簽約相對應,解約則是取消簽約關系。

2. 支付

支付是少不了的操作。 不同産品中支付行為不一樣。快捷支付是在電商伺服器上發起,請求管道進行支付;網銀支付則是跳轉到銀行支付網關上進行; 而賬戶支付、虛币支付,則是在本地進行的。

3. 撤銷和退款

有些管道區分撤銷和退款,比如銀聯、農行等,撤銷指取消當天在管道側未結算的交易; 而退款僅針對已經結算的交易。有些管道則不作區分。

4. 查詢簽約狀态

對于需要簽約的交易,可以通過這個接口來查詢簽約狀态。

5. 查詢訂單狀态

通過這個接口來查詢支付清單狀态以及退款的訂單狀态。

6. 預授權

預授權交易用于受理方向持卡人的發夾方确認交易許可。受理方将預估的消費金額作為預授權金額,發送給持卡人的發夾方。

7. 預授權撤銷

對已成功的預授權交易,在結算前使用預授權撤銷交易,通知發夾方取消付款承諾。預授權撤銷交易必須是對原始預授權交易或追加預授權交易最終承兌金額的全額撤銷。

8. 預授權完成交易

對已準許的預授權交易,用預授權完成做支付結算。

9. 預授權完成撤銷

預授權完成撤銷交易必須是對原始預授權完成交易的全額撤銷。預授權完成撤銷後的預授權仍然有效。

10. 對賬

通過 FTP 或者 HTTP 方式提供對賬檔案供商戶側對賬。

11. 餘額查詢

查詢商戶的交易賬戶的餘額,避免由于餘額不足導緻交易失敗。 注意,不是客戶的餘額。 當然,不是所有的銀行或者第三方支付都提供這個接口。

業務流程

上述操作,除了對賬、查單外,每個操作實作的主流程,一般會包括“參數校驗,支付路由,生成訂單,風險評估,調用管道服務,更新訂單和發送消息”這 7 步,對于一些比較複雜的服務,還會涉及到異步通知處理的步驟。

完整的支付系統整體架構!

1. 執行參數校驗

所有的支付操作,都需要對輸入執行參數校驗,避免接口受到攻擊。驗證輸入參數中各字段的有效性驗證,比如使用者ID、商戶ID、價格、傳回位址等參數。驗證賬戶狀态,交易主體、交易對手等賬戶的狀态是處于可交易的狀态。驗證訂單,如果涉及到預單,還需要驗證訂單号的有效性,訂單狀态是未支付。為了避免使用者緩存某個 URL 位址,還需要校驗下單時間和支付時間是否超過預定的間隔。驗證簽名,簽名也是為了防止支付接口被僞造。 一般簽名是使用分發給商戶的 key 來對輸入參數拼接成的字元串做 MD5 Hash 或者 RSA 加密,然後作為一個參數随其他參數一起送出到伺服器端,簽名驗證也可以在網關中統一完成。

2. 根據支付路由尋找合适的支付服務

根據使用者選擇的支付方式确定用來完成該操作的合适的支付管道。使用者指定的支付方式不一定是最終的執行支付的管道。比如使用者選擇通過工行信用卡來執行支付,但是我們沒有實作和工行的對接,而是可以通過第三方支付,比如支付寶、微信支付、易寶支付,或者銀聯來完成。那如何選擇合适的支付管道,就通過支付路由來實作。支付路由會綜合考慮收費、管道的可用性等因素來選擇最優方案。

3. 評估交易風險

檢查本次交易是否有風險。風控接口傳回三種結果:阻斷交易、增強驗證和放行交易。阻斷交易,說明該交易是高風險的,需要終止,不執行第 5 個步驟;增強驗證,說明該交易有一定的風險,需要确認下是不是使用者本人在操作。這可以通過發送短信驗證碼或者其他可以驗證使用者身份的方式來做校驗,驗證通過後,可以繼續執行該交易。放行交易,即本次交易是安全的,可以繼續往下走。

4. 生成交易訂單

将訂單資訊持久化到資料庫中。當通路壓力大的時候,資料庫寫入會成為一個瓶頸。

5. 調用支付管道提供的服務

所有的支付服務都需要第三方通道來完成執行。一般銀行管道的調用比較簡單,可以直接傳回結果。而一些第三方支付,支付寶,微信支付等,則會通過異步接口來告知支付結果。

6. 更新訂單

對于同步傳回的結果,需要在主線程中更新訂單的狀态,标記是支付成功還是失敗。對于異步傳回的管道,需要在異步程式中處理。

7. 發送消息

通過消息來通知相關系統關于訂單的變更。風控,信用 BI 等,都需要依賴這資料做準實時計算。

8. 異步通知

如上述流程,其中涉及到調用遠端接口,其延遲不可控。如果調用方一直阻塞等待,很容易逾時。引入異步通知機制,可以讓調用方在主線程中盡快傳回,通過異步線程來得到支付結果。對于通過異步來擷取支付結果的管道接口,也需要對應的在異步通知中将結果傳回給調用方。 異步通知需要調用方提供一個回調位址,一般以 http 或者 https 的方式。這就有技術風險,如果調用失敗,還需要重試。而重試不能過于頻繁,需要逐漸拉大每一次重試的時間間隔。在異步處理程式中,訂單根據處理結果變更狀态後,也要發消息通知相關系統。

支付系統架構整體設計

每個公司根據其業務和公司發展的不同階段,所設計的支付系統也會有所不同。我們先看看網際網路公司的一些典型的支付系統架構。

1. 支付寶

完整的支付系統整體架構!

這個整體架構上并沒有與衆不同之處。在子產品劃分上,這個圖顯示的是最頂層的劃分,也無法告知更多細節。 但支付寶架構文檔有兩個搞支付平台設計的人必須仔細揣摩的要點。 一個是賬務處理,在記賬方面,涉及到内外兩個子系統,外部子系統是單邊賬,滿足線上性能需求;内部子系統走複式記賬,滿足财務需求,如記賬、對賬和平賬。

完整的支付系統整體架構!

另一個是柔性事務處理,利用消息機制來實作跨系統的事務處理,避免資料庫鎖導緻的性能問題。

完整的支付系統整體架構!

2. 京東金融

完整的支付系統整體架構!

京東金融是在網銀線上的基礎上發展起來的。 網銀線上的原班技術人員有不少來自易寶公司,在京東收購之後,又引入了支付寶的人才,因而從架構上受這兩個公司的影響很大。

3. 去哪兒

完整的支付系統整體架構!

這些架構文檔全部來自網際網路公開資料, 對于架構是否真實反映實際系統情況,需要大家自行判斷。 咱們僅是以這些文檔為基礎,分析支付系統應有的軟體架構。

參考架構

一般來說,支付系統典型架構會包含如下子產品:

完整的支付系統整體架構!

支付系統從架構上來說,分為三層;

支撐層: 用來支援核心系統的基礎軟體包和基礎設施, 包括運維監控系統、日志分析系統等。

核心層: 支付系統的核心子產品,内部又分為兩個部分: 支付核心子產品以及支付服務子產品。

産品層: 通過核心層提供的服務組合起來,對最終使用者、商戶、營運管理人員提供的系統。

1. 支撐系統

支撐系統是一個公司提供給支付系統運作的基礎設施。 主要包括如下子系統:

運維監控: 支付系統在運作過程中不可避免的會受到各種内部和外部的幹擾,光纖被挖斷、黑客攻擊、資料庫被誤删、上線系統中有 bug 等等,運維人員必須在第一時間内對這些意外事件作出響應,又不能夠一天 24 小時盯着。這就需要一個運維監控系統來協助完成。

日志分析: 日志是支付系統統計分析、運維監控的重要依據。公司需要提供基礎設施來支援日志統一收集和分析。

短信平台: 短信在支付系統中有重要作用,如身份驗證、安全登入、找回密碼、以及報警監控,都需要短信的支援。

安全機制: 安全是支付的生命線。 SSL、證書系統、防刷接口等,都是支付的必要設施。

統計報表: 支付資料的可視化展示,是公司進行決策的基礎。

遠端連接配接管理、分布式計算、消息機制、全文檢索、檔案傳輸、資料存儲、機器學習等,都是建構大型系統所必須的基礎軟體,這裡不再一一詳細介紹。

2. 支付核心系統

支付核心系統指使用者執行支付的核心流程,包括:

使用者從支付應用啟動支付流程;

支付應用根據應用和使用者選擇的支付工具來調用對應的支付産品來執行支付;

支付路由根據支付工具、管道費率、接口穩定性等因素選擇合适的支付管道來落地支付;

支付管道調用銀行、第三方支付等管道提供的接口來執行支付操作,最終落地資金轉移。

3. 支付服務系統

支援支付核心系統所提供的功能,服務系統又分為基礎服務系統、資金系統、風控和信用系統。

基礎服務系統提供支撐線上支付系統運作的基礎業務功能:

客戶資訊管理:包括對使用者、商戶的實名身份、基本資訊、協定的管理;

卡券管理: 對優惠券、代金券、折扣券的制作、發放、使用流程的管理;

支付通道管理: 通道接口、配置參數、費用、限額以及 QOS 的管理;

賬戶和賬務系統: 管理賬戶資訊以及交易流水、記賬憑證等。這裡的賬務一般指對接線上系統的賬務,采用單邊賬的記賬方式,内部賬記錄在會計核算系統中。

訂單系統: 一般訂單系統可以獨立于業務系統來實作的,這裡的訂單,主要指支付訂單。

資金系統指圍繞财務會計而産生的背景資金核實、排程和管理的系統,包括:

會計核算: 提供會計科目、内部賬務、試算平衡、日切、流水登記、核算和歸檔的功能。

資金管理: 管理公司在各個支付管道的頭寸,在餘額不足時進行打款。 對第三方支付公司,還需要對備付金進行管理。

清算分潤: 對于有分潤需求的業務,還需要提供清厘清算、對賬處理和計費分潤功能。

風控系統是支付系統必備的基礎功能,所有的支付行為必須做風險評估并采取對應的措施;信用系統是在風控基礎上發展的進階功能,京東的白條,螞蟻花呗等,都是成功的案例。

4. 支付應用

支撐系統、核心系統和服務系統,在每個網際網路公司的架構上都是大同小異的,都是必不可少的子產品。而支付應用是每個公司根據自己的業務來建構的,各不相同。

總體來說,可以按照使用對象分為針對最終使用者的應用、針對商戶的應用、針對營運人員的營運管理、BI 和風控背景。