基礎(chǔ)向:從 0 開始學(xué)習(xí)支付系統(tǒng)架構(gòu)
文章主要是從支付架構(gòu)、支付流程分析、支付核心邏輯、支付基礎(chǔ)服務(wù)、支付安全五個(gè)方面來詳細(xì)講述支付系統(tǒng)架構(gòu),一起來看看~
流程圖:
- 架構(gòu)的定義:架構(gòu)一定是基于業(yè)務(wù)功能來展開的,主要是制定技術(shù)規(guī)范、框架,指導(dǎo)系統(tǒng)落地,好的架構(gòu)是需要不斷演變和進(jìn)化而來的。
- 架構(gòu)需要關(guān)注的基礎(chǔ)核心點(diǎn)主要是:安全、穩(wěn)定、可擴(kuò)展。
- 構(gòu)建架構(gòu)時(shí)需要關(guān)注的點(diǎn):目標(biāo)客戶是誰、主要場景有哪些、流程是怎樣的、模型、職責(zé)有哪些、邊界在哪里以及設(shè)計(jì)。其中比較難以理解的點(diǎn)是困難及模型這兩塊。
- 架構(gòu)與業(yè)務(wù)需求的關(guān)系:架構(gòu)的產(chǎn)生來自于業(yè)務(wù)需求,業(yè)務(wù)需求進(jìn)一步抽象形成架構(gòu),架構(gòu)指導(dǎo)后續(xù)研發(fā),研發(fā)最終成果解決業(yè)務(wù)需求的問題。整體是一個(gè)正向循環(huán)的關(guān)系。
一、支付架構(gòu)
二、支付流程分析
- 第一步,用戶選擇支付渠道,進(jìn)入商戶客戶端;
- 第二步,商戶客戶端發(fā)送支付要素,到商戶服務(wù)端;
- 第三步,商戶服務(wù)端發(fā)起支付請求到渠道側(cè)(個(gè)別渠道如支付寶是不需要此步驟);
- 第四步渠道返回支付憑證到商戶服務(wù)端;
- 第五步商戶服務(wù)端返回支付憑證到商戶客戶端;
- 第六步,用戶調(diào)用支付寶控件完成支付。
接下來是重點(diǎn),第七步一般渠道是采用異步通知方法來通知商戶,但是有些企業(yè)是在第六步支付完成之后,在C端會(huì)同步通知支付成功。如果以此結(jié)果來判斷支付是否成功,其實(shí)是不嚴(yán)謹(jǐn)會(huì)出問題的,應(yīng)當(dāng)調(diào)用渠道的支付接口來進(jìn)行核查,然后以渠道返回的結(jié)果為準(zhǔn)。
在日常工作中,許多企業(yè)在選擇第四方服務(wù)商或者渠道的時(shí)候,會(huì)著重關(guān)注「并發(fā)」這個(gè)點(diǎn),認(rèn)為并發(fā)量需要達(dá)到上萬級(jí)才可以滿足日常需求,但實(shí)際上這個(gè)量級(jí)非常大,其實(shí)并沒有必要的。
若直接對接渠道可能會(huì)遇到的問題:
- 接口文檔升級(jí)、變更能及時(shí)得到通知;
- 有些業(yè)務(wù)沒有異步通知;
- 同一業(yè)務(wù)在不同渠道表現(xiàn)不一樣;
- 各種渠道的各自異常。
商戶的要求:
- 清晰的 API 、SDK 文檔;
- 安全;
- 所有應(yīng)用接口統(tǒng)一標(biāo)準(zhǔn)的異步通知;
- 保證出口 IP 穩(wěn)定(安全)。
在系統(tǒng)架構(gòu)設(shè)計(jì)時(shí)需要注意的一些要點(diǎn):
- 提供規(guī)范的 API、SDK;
- 安全(通訊安全、數(shù)據(jù)安全);
- 穩(wěn)定;
- 異步通知統(tǒng)一;
- 各渠道的異常;
- 及時(shí)了解渠道接口調(diào)整。
以上為示例
三、支付核心邏輯
這里講一下,支付成功之后,我們會(huì)把訂單信息同步到財(cái)務(wù)系統(tǒng),在賬務(wù)系統(tǒng)里我們設(shè)計(jì)了諸如轉(zhuǎn)賬、匯款等功能,在前期設(shè)計(jì)時(shí)會(huì)設(shè)計(jì)好賬務(wù)的生成規(guī)則,例如;一筆支付的請求會(huì)生成多筆賬務(wù),對其字段進(jìn)行區(qū)分,這樣方便管理和維護(hù)。
支付網(wǎng)關(guān)
此處特指API網(wǎng)關(guān),支付網(wǎng)關(guān)的功能:
限流最好不要放到業(yè)務(wù)流程中做,會(huì)影響用戶的體驗(yàn)。
支付網(wǎng)關(guān)的內(nèi)容:
- 唯一的請求入口;
- 統(tǒng)一的身份認(rèn)證、簽名、加解密、流控;
- API 調(diào)用計(jì)費(fèi);
- API 的監(jiān)控、報(bào)警分析;
- API 發(fā)布管理;
- 熔斷;
- API 聚合;
- 協(xié)議轉(zhuǎn)換。
上述內(nèi)容除了必要意外,其他不放在業(yè)務(wù)層做,也是為了更好的用戶體驗(yàn)。
支付邏輯
主要是根據(jù)請求的參數(shù)進(jìn)行靜態(tài)檢驗(yàn)和業(yè)務(wù)邏輯校驗(yàn),避免系統(tǒng)異常。
- 適配渠道的參數(shù)校驗(yàn):長度、類型、格式;
- 訂單的支付狀態(tài):是否支付;
- 訂單的有效期等等。
要點(diǎn):
一般商戶是不需要做支付路由,大部分都是指定了最終的某個(gè)支付渠道。
但也有些沒有指定了某個(gè)最終的渠道,比如銀行卡的支付可以選擇哪個(gè)第三方支付來完成支付,還有微信線上線下的封裝,這個(gè)時(shí)候就涉及到支付路由規(guī)則配置。
- 費(fèi)率:單筆費(fèi)率、總額費(fèi)率、階梯費(fèi)率;
- 營銷活動(dòng):固定時(shí)間單筆優(yōu)惠、單筆滿減、單筆這款、直接補(bǔ)貼;
- 額度限制:單筆額度、時(shí)間范圍內(nèi)總額度;
- 服務(wù)指標(biāo):失敗率、平均響應(yīng)時(shí)間、異常率、TPS;
- 特殊配置:特殊要求(比如某渠道能快速結(jié)算)。
支付網(wǎng)關(guān)的目的——省錢。
支付風(fēng)控
要點(diǎn):梳理清楚業(yè)務(wù)風(fēng)險(xiǎn),分析風(fēng)險(xiǎn)原因,制定風(fēng)險(xiǎn)防范規(guī)則。
(1)數(shù)據(jù)來源
內(nèi)部數(shù)據(jù):
- 用(商)戶信息
- 交易數(shù)據(jù)
- 賬戶數(shù)據(jù)
- 黑名單
- 設(shè)備、位置信息
- 日志數(shù)據(jù)
外部數(shù)據(jù):
- 第三方購買
- 央行征信
- 芝麻信用
- 合作數(shù)據(jù)
(2)風(fēng)控流程
事前:
- 入網(wǎng)審核
- 風(fēng)險(xiǎn)評(píng)估
- 單筆限額設(shè)置
- 單日限額設(shè)置
- 頻次設(shè)置
事中:
- 實(shí)時(shí)分析
- 多維度判斷
- 拒絕
- 攔截 – 進(jìn)一步驗(yàn)證– 人工介入
- 延遲操作(例如用戶大額提現(xiàn),需要時(shí)間段進(jìn)行復(fù)核)
事后:
- 數(shù)據(jù)分析
- 巡查、警告
- 降低評(píng)級(jí)
- 升級(jí)防范措施
- 邏輯完善
- 反饋至事前、事中規(guī)則中
賬務(wù)系統(tǒng)
- 賬務(wù)生成
- 內(nèi)部對賬
- 原始賬單下載
- 生成標(biāo)準(zhǔn)賬單
- 對賬
- 差錯(cuò)處理
賬務(wù)生成后首先進(jìn)行內(nèi)部對賬,一直后進(jìn)行原始賬單下載,再生成標(biāo)準(zhǔn)賬單,進(jìn)行對賬之后進(jìn)行差錯(cuò)處理。
內(nèi)部流程如圖:
- 訂閱交易信息;
- 根據(jù)交易事件查詢生成賬務(wù)的規(guī)則。
交易事件:支付、退款、轉(zhuǎn)賬等等。
- 根據(jù)規(guī)則生成賬務(wù)明細(xì);
- 將賬務(wù)明細(xì)落地。
對賬流程(實(shí)現(xiàn)方式之一)
內(nèi)部對賬:
- 保證賬務(wù)和交易信息配對
- 一條交易信息有多條賬務(wù)信息
渠道賬單下載:
- 下載;
- 賬單標(biāo)準(zhǔn)化(對賬字段統(tǒng)一);
- 落地標(biāo)準(zhǔn)化賬單。
對賬:
- 賬務(wù)和標(biāo)準(zhǔn)賬單對賬;
- 雙向?qū)~;
- 差錯(cuò)處理。
賬單下載:
這里提一句,在做異常處理這部分工作時(shí),有的研發(fā)朋友寫代碼時(shí)遇到過類似的問題,例如:訂單在周末下單,但賬單周一才能查詢;等到周一時(shí)發(fā)現(xiàn)查詢不到,選擇立即重試 + X 分鐘后重試就結(jié)束了。
這樣是不行的,因?yàn)殂y行有的是 8 點(diǎn)之后可以查詢到,有的是 9 點(diǎn)之后,所以要選擇遞增時(shí)間重試,然后標(biāo)記人工處理。
對賬:
對賬部分:
- 獲取核對文件;
- 以賬務(wù)系統(tǒng)為準(zhǔn)來逐筆比對(以某個(gè)字段為準(zhǔn)進(jìn)行比對);
- 數(shù)據(jù)一致標(biāo)記成功,數(shù)據(jù)不一致標(biāo)記差錯(cuò)。
反向操作:
- 以渠道賬單為準(zhǔn)來逐筆比對;
- 數(shù)據(jù)一致標(biāo)記成功,數(shù)據(jù)不一致標(biāo)記差錯(cuò)。
差錯(cuò)處理
- 本地丟失:渠道賬單的數(shù)據(jù)未在賬務(wù)中查找到。
- 渠道丟失:賬務(wù)中的數(shù)據(jù)未在渠道賬單中查找到。
- 數(shù)據(jù)差錯(cuò):賬務(wù)與渠道某些對賬字段未能對上。
此處需要注意的是,針對差錯(cuò)都需要向渠道查詢每筆訂單信息再次確認(rèn),同時(shí),有些渠道的交易成功時(shí)間本來就是有錯(cuò)誤的。一般來說是件不會(huì)差錯(cuò)很大,一般出現(xiàn)在跨日交易中,例如:當(dāng)天交易無賬單,先標(biāo)記為差錯(cuò),第二天再改正。
四、支付基礎(chǔ)服務(wù)
- Webhook
- 公共推送服務(wù)
- 主動(dòng)查詢
- 補(bǔ)償
- 鏈路監(jiān)控
Webhook
公共推送服務(wù)
主動(dòng)查詢
異步延時(shí)調(diào)用
場景:
- 訂單創(chuàng)建成功的時(shí)候會(huì)向服務(wù)推送主動(dòng)查詢信息,如果訂單支付成功會(huì)通知服務(wù)取消后續(xù)的主動(dòng)查詢,否則在過期時(shí)間點(diǎn)向渠道主動(dòng)查詢訂單是否支付目的是避免渠道異步通知服務(wù)的異常。
- 退款創(chuàng)建成功的時(shí)候會(huì)向服務(wù)推送主動(dòng)查詢信息,該服務(wù)會(huì)在一定的時(shí)間范圍內(nèi)多次查詢渠道直到有明確的結(jié)果返回(有些渠道沒有異步通知)。
- 轉(zhuǎn)賬也是類似的邏輯,但某些渠道只提供重試的功能,要注意冪等性。
- ……
補(bǔ)償:
- 協(xié)調(diào)保證各模塊間數(shù)據(jù)的一致性;
- 一般會(huì)跟重試、回滾、兜底來協(xié)調(diào)使用;
- 使用條件:系統(tǒng)異常、業(yè)務(wù)異常;
- 補(bǔ)償失敗報(bào)警人工干預(yù)。
鏈路監(jiān)控
展示信息:應(yīng)用、URL、調(diào)用方、調(diào)用時(shí)間、調(diào)用次數(shù)、調(diào)用失敗次數(shù)、本地平均耗時(shí)、總平均耗時(shí)、調(diào)用失敗平均耗時(shí) 、錯(cuò)誤率、依賴度。
關(guān)注:Cache、SQL、HTTP、TCP
基本信息
依賴度
五、支付安全
數(shù)據(jù)安全
防竊聽、防越權(quán)防抵賴、防破壞、防篡改、防重放、防泄漏。
使用范圍:網(wǎng)絡(luò)、系統(tǒng)、應(yīng)用、業(yè)務(wù)等。
數(shù)據(jù)安全要點(diǎn)
- 加密通訊(防竊聽)
- 雙向簽名(防抵賴、防篡改)
- 敏感數(shù)據(jù)加密存儲(chǔ)(防泄漏)
- 密鑰管理(通過認(rèn)證接口獲取,只允許加載到內(nèi)存,不允許直接寫入配置文件)
- 權(quán)限控制(防越權(quán)-非法訪問)
- 數(shù)據(jù)的完整性(放篡改- 數(shù)據(jù)被惡意修改、非法篡改)
其他
- 內(nèi)部接口認(rèn)證。
- 避免內(nèi)部代碼未經(jīng)審核發(fā)布到托管平臺(tái)?。?!
- 數(shù)據(jù)異常分析。
- 安全機(jī)構(gòu)合作。
注意點(diǎn)
- 使用 HTTPS 加密傳輸;
- 傳輸?shù)臄?shù)據(jù)使用簽名;
- 提交的數(shù)據(jù)是符合規(guī)則并且是不存在或者是未支付的;
- 支付成功以服務(wù)端異步通知為準(zhǔn)。
本文由 @ 支付學(xué)院 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載
題圖來自Unsplash,基于CC0協(xié)議
很專業(yè),厲害厲害!學(xué)習(xí)ing
這是高手!
看完頂禮膜拜,邏輯清晰,講述利索不拖泥帶水,求干貨拆分詳細(xì)講解,設(shè)計(jì)技術(shù)類的流程希望有講解部分。
看著就賊特么專業(yè)
寫的非常好 ,一對比 自己寫的都是坑啊
多謝認(rèn)可 ??
對于架構(gòu)的整體情況有了了解,受教了。如果能重點(diǎn)講一下記賬對賬及結(jié)算就完美了
下一篇內(nèi)容更新財(cái)務(wù)對賬,也是基礎(chǔ)向的,敬請關(guān)注。 ??
強(qiáng)烈關(guān)注
?? 感謝關(guān)注,后續(xù)請多支持!
大神,我關(guān)注你了,你能不能寫一些適合小白看的,這個(gè)看不懂??
感謝關(guān)注,未來會(huì)多寫一些基礎(chǔ)向的內(nèi)容。 ??
這個(gè)是干貨
感謝認(rèn)可 ??
只要敢發(fā)這種文章 我就敢好好品讀 必須贊賞!~
?? 多謝贊賞,繼續(xù)努力