解密支付平臺(tái)建設(shè)資金底線(xiàn)防火墻的殺手級(jí)設(shè)計(jì)方案
在金融支付行業(yè),資金底線(xiàn)的打法是至關(guān)重要的,保證資金不發(fā)生損失是任何一家金融支付行業(yè)的***要?jiǎng)?wù),這也是最困難的一個(gè)任務(wù)之一,一家支付公司每天的支付流水就有幾億、十幾億,甚至幾十億到上百億、上千億都屢見(jiàn)不鮮,在這樣大的資金流水面前,我們應(yīng)該如何保證資金萬(wàn)無(wú)一失呢?
大家應(yīng)該都聽(tīng)過(guò)騎士資本(Knight Capital)的故事,這家美國(guó)股市經(jīng)紀(jì)商因?yàn)殄e(cuò)誤的交易頭寸造成4.4億美元的稅前損失,后來(lái)騎士資本的股價(jià)下跌63%至2.58美元,使得其市值縮水至2.53億美元,只有幾天前的四分之一,隨后股價(jià)再次下跌17%至2.14美元。而這一事件是由騎士資本一個(gè)小小的“技術(shù)問(wèn)題”所引起,致使它向交易所發(fā)出了錯(cuò)誤的股票交易指令。
因此,如果我們做的是金融的交易系統(tǒng),保證資金安全是底線(xiàn),保證了資金安全,我們才能謀取利潤(rùn),謀取利潤(rùn)能夠讓我們的公司活下去,接下來(lái)要讓我們的盈利模型進(jìn)入批量模式,我們才能將公司做大、做強(qiáng)。
資金損失和資金底線(xiàn)
我們?nèi)绾蝸?lái)定義資金損失呢?凡是從事金融支付的活動(dòng)的過(guò)程中,由于人為或者系統(tǒng)導(dǎo)致的資金虧損,都叫做資金損失。例如,在一筆電商交易過(guò)程中,發(fā)生了平臺(tái)單邊,支付未成功,但是通知用戶(hù)訂單成功,并發(fā)貨,這是一個(gè)典型的由于平臺(tái)單邊引起的資金損失。
采取的客觀的和主觀的方法來(lái)保證不發(fā)生資金損失,就是資金底線(xiàn)防火墻,我們把這些方法稱(chēng)為保證資金底線(xiàn)的方法。資金底線(xiàn)是一個(gè)非常專(zhuān)業(yè)化的非主流概念,從百科或者其他的渠道是找不到官方定義的,我們通過(guò)舉例來(lái)說(shuō)明幫助讀者理解資金底線(xiàn),例如,我們通過(guò)對(duì)比支付成功通知和原支付信息中的ID和金額來(lái)保證不發(fā)生單邊,就是保證資金底線(xiàn)的一個(gè)典型案例。
在本文后面部分,我們會(huì)聚焦在第三方支付行業(yè)的資金損失的風(fēng)險(xiǎn)和資金底線(xiàn)防火墻的建設(shè)。
從支付業(yè)務(wù)劃分資金底線(xiàn)風(fēng)險(xiǎn)
在第三方支付行業(yè),通常通過(guò)資金的流向把業(yè)務(wù)分成收單和出款,這里我們分享可能存在的收單和出款的資金底線(xiàn)風(fēng)險(xiǎn)的場(chǎng)景。
收單的資金底線(xiàn)風(fēng)險(xiǎn)
收單業(yè)務(wù)是第三方支付的主要業(yè)務(wù)之一,由于收單業(yè)務(wù)可以結(jié)合多種交易場(chǎng)景,因此,也是***錢(qián)的一種業(yè)務(wù),具有交易量大、風(fēng)險(xiǎn)性高的特點(diǎn)。
單邊是收單業(yè)務(wù)中最典型的資金底線(xiàn)風(fēng)險(xiǎn),單邊這個(gè)詞匯來(lái)自于財(cái)務(wù)行業(yè),在收單的結(jié)算流程中,很容易出現(xiàn)一種“單邊賬”的情況,單邊賬:即一方的賬目發(fā)生變化,而另一方?jīng)]有,那么隨之而來(lái)的問(wèn)題就是,錢(qián)去哪兒了?
這個(gè)場(chǎng)景又進(jìn)而分為長(zhǎng)款和短款兩個(gè)情況。
- 長(zhǎng)款:上游給我的款項(xiàng)比我給下游的多。
- 短款:上游給我的款項(xiàng)比我給下游的少。
我們看到長(zhǎng)款實(shí)際上是我們的資金比賬目多了,實(shí)際上沒(méi)有資金損失,單邊賬有百分之九十九點(diǎn)九九是長(zhǎng)款,如果出現(xiàn)了短款情況,那就是災(zāi)難,也是最嚴(yán)重的資金底線(xiàn)風(fēng)險(xiǎn),是我們應(yīng)該要堅(jiān)決杜絕的。那么我們?cè)诘谌街Ц镀脚_(tái)上,所說(shuō)的單邊通常指的是財(cái)務(wù)行業(yè)里單邊賬的短款,也就是導(dǎo)致了我們有資金損失的那個(gè)情況,因?yàn)楣ぷ髟诘谌街Ц兜男』锇閭兌疾皇秦?cái)務(wù)專(zhuān)業(yè)或者對(duì)財(cái)務(wù)不熟悉的,所以,大家都把單邊賬的短款成為單邊,這里我們也按照這個(gè)習(xí)慣來(lái)講解。
下面是一個(gè)典型的第三方支付收單的示意圖。
第三方支付的系統(tǒng)上接商戶(hù)系統(tǒng),下接銀行系統(tǒng)。由于其處在承上啟下的位置,因此,是最容易產(chǎn)生收單單邊的資金底線(xiàn)風(fēng)險(xiǎn)。
簡(jiǎn)單的來(lái)說(shuō),產(chǎn)生收單單邊資金底線(xiàn)風(fēng)險(xiǎn)的情況都是下游系統(tǒng)失敗了,但是由于某種原因,典型的就是系統(tǒng)bug,返回給上游系統(tǒng)成功,如果上游系統(tǒng)是商戶(hù)的電商系統(tǒng),有可能已經(jīng)發(fā)貨了,這就導(dǎo)致了資金損失。
我們從系統(tǒng)層次上將單邊分成以下3種類(lèi)型。
1.第三方支付的系統(tǒng)與銀行之間的單邊。
這種單邊發(fā)生在第三方支付系統(tǒng)與銀行之間,由于某種原因銀行系統(tǒng)支付失敗,但是第三方支付系統(tǒng)支付成功。
2.第三方支付的系統(tǒng)內(nèi)部的單邊。
這種單邊發(fā)生在第三方支付內(nèi)部的系統(tǒng)之間,由于某種原因第三方支付的底層系統(tǒng)支付失敗,但是上層系統(tǒng)支付成功。
3.第三方支付的系統(tǒng)與商戶(hù)之間的單邊。
這種單邊發(fā)生在第三方支付與商戶(hù)系統(tǒng)之間,由于某種原因第三方支付的系統(tǒng)支付失敗,但是商戶(hù)得到了支付成功的通知。
對(duì)于以上3種情況,都是我們要堅(jiān)決避免,或者及時(shí)發(fā)現(xiàn)進(jìn)行止損的。
另外,還有兩種特殊的單邊場(chǎng)景,一個(gè)叫做金額單邊,一個(gè)叫做訂單號(hào)重復(fù)單邊。
1.金額單邊
訂單在銀行實(shí)際支付金額小于第三方支付的訂單金額。
2.訂單號(hào)重復(fù)單邊
上層交易系統(tǒng)的多個(gè)訂單對(duì)應(yīng)銀行子系統(tǒng)同一個(gè)訂單。
出款的資金底線(xiàn)風(fēng)險(xiǎn)
出款業(yè)務(wù)也是第三方支付的重要業(yè)務(wù)之一,具有體量大、單筆交易額高的特點(diǎn),出款業(yè)務(wù)更容易產(chǎn)生資金底線(xiàn)風(fēng)險(xiǎn),如果不加以防控,發(fā)生重復(fù)出款、多出款、出錯(cuò)款也是家常便飯。
具體的資金損失的場(chǎng)景如下。
1.重復(fù)出款
一筆訂單出款多次,造成了成倍的資金損失。
2.多出款
一筆訂單總共出款金額大于訂單金額,大于部分的資金就是資金損失。
3.出錯(cuò)款
一筆訂單出款給其他商戶(hù)。
4.未扣賬出款
沒(méi)有從商戶(hù)賬戶(hù)扣賬,資金直接從備付金賬戶(hù)扣除并轉(zhuǎn)出給商戶(hù)賬戶(hù)或者對(duì)公銀行卡。
從時(shí)間上劃分避免資金底線(xiàn)風(fēng)險(xiǎn)的方法
我們從發(fā)生資金底線(xiàn)的時(shí)序上總結(jié)避免資金底線(xiàn)的風(fēng)險(xiǎn)的方法,這些方法放在一起構(gòu)成了資金底線(xiàn)防火墻。
事前避免
根據(jù)經(jīng)驗(yàn),分析發(fā)生資金底線(xiàn)的風(fēng)險(xiǎn)的場(chǎng)景,阻斷場(chǎng)景發(fā)生的必要條件,避免這種場(chǎng)景的發(fā)生。這種方案是***的方案,也是最難實(shí)現(xiàn)的一種,一般都是通過(guò)總結(jié)歷史線(xiàn)上事故,找出發(fā)生的典型的資金風(fēng)險(xiǎn)場(chǎng)景,針對(duì)場(chǎng)景的特點(diǎn)設(shè)計(jì)避免方案。
例如:在一筆支付做完后,將資金入賬,入賬的時(shí)候通過(guò)渠道查詢(xún)支付是否成功,如果不成功,講拒絕入賬。
事中攔截
事中攔截是一個(gè)非常重要的避免資金損失的方案,就是在支付過(guò)程中,通過(guò)支付的特點(diǎn)來(lái)識(shí)別是否發(fā)生了資金底線(xiàn)風(fēng)險(xiǎn),如果識(shí)別到了,則可以及時(shí)攔截,不讓事情進(jìn)一步惡化。
例如:渠道在收到銀行返回的支付成功通知的時(shí)候,會(huì)檢查返回通知里面的成功支付金額是否與支付訂單一致,如果一致再向上通知。
事后止損
對(duì)于某些場(chǎng)景,我們通常沒(méi)有辦法完全事前避免和事中攔截,在這種情況下,我們通常通過(guò)對(duì)賬、監(jiān)控等手段發(fā)現(xiàn)問(wèn)題,并且事前預(yù)設(shè)止損的運(yùn)營(yíng)功能,一旦發(fā)現(xiàn)問(wèn)題即使止損。
例如:我們通過(guò)監(jiān)控手段得知某個(gè)渠道的成功率偏低或者偏高,然后進(jìn)行報(bào)警,通過(guò)運(yùn)營(yíng)決策可以關(guān)掉某個(gè)渠道。
主觀方面避免資金損失
很多時(shí)候一次比較大的資金底線(xiàn)事故都是人為因素導(dǎo)致的,經(jīng)常是用人來(lái)把關(guān)的多個(gè)階段都被忽略了才導(dǎo)致最終的“慘案”,這也難怪,我們是人,不是神,每天都收到生活、家庭、工資、心受傷的程度等各種因素的影響,偶爾開(kāi)個(gè)小差是不可避免的。
主觀方面避免資金損失主要是通過(guò)對(duì)人的分析和采取策略,來(lái)避免資金損失。在筆者工作的幾年里,一直負(fù)責(zé)資金底線(xiàn)風(fēng)險(xiǎn)的任務(wù),筆者通過(guò)兩個(gè)重要的主管上的方案來(lái)避免資金損失。
1.定期的對(duì)小伙伴宣講資金底線(xiàn)保護(hù)的重要性
筆者多次對(duì)新員工、小伙伴們進(jìn)行資金底線(xiàn)的培訓(xùn),一方面匯報(bào)資金底線(xiàn)項(xiàng)目的進(jìn)展,之前發(fā)生的資金底線(xiàn)的事故的案例分析,并提醒小伙伴在設(shè)計(jì)中首要考慮資金底線(xiàn)的事情,我常常對(duì)小伙伴說(shuō):一個(gè)業(yè)務(wù)或者功能上線(xiàn),可以不好用,可以不賺錢(qián),但是不能損失錢(qián)。
2.設(shè)計(jì)評(píng)審中要增加一項(xiàng)資金底線(xiàn)的評(píng)審項(xiàng)
筆者在過(guò)去的幾年里一直評(píng)審支付平臺(tái)的架構(gòu)設(shè)計(jì),凡事經(jīng)過(guò)筆者評(píng)審的方案,筆者都會(huì)引導(dǎo)小伙伴來(lái)思考是否有資金風(fēng)險(xiǎn),對(duì)可能的資金風(fēng)險(xiǎn)怎么應(yīng)對(duì),經(jīng)過(guò)筆者評(píng)審的方案,鮮有有資金風(fēng)險(xiǎn)發(fā)生。
客觀方面避免資金損失
盡管我們可以通過(guò)主觀方面的培訓(xùn)、設(shè)計(jì)評(píng)審提醒大家要有資金底線(xiàn)保護(hù)的意識(shí),但是,由于我們每個(gè)人員包括測(cè)試人員每天的狀態(tài)不一樣,情緒不一樣,那么表現(xiàn)也不一樣,因此,我們不能完全仰仗人來(lái)保證資金底線(xiàn),我們應(yīng)該尋找能搞保障資金底線(xiàn)的客觀規(guī)律,把這些客觀規(guī)律做到系統(tǒng)中,這樣就能保證系統(tǒng)的資金是無(wú)法撼動(dòng)的。
我們總結(jié)有一下多種方法。
1.支付、渠道和賬務(wù)的三角校驗(yàn)
前面提到一個(gè)案例,在一筆支付做完后,將資金入賬,入賬的時(shí)候通過(guò)渠道查詢(xún)支付是否成功,如果不成功,講拒絕入賬,通過(guò)這樣的一個(gè)客觀的支付、賬務(wù)、渠道三個(gè)系統(tǒng)的三角閉環(huán)校驗(yàn)可以避免資金損失。
三角校驗(yàn)如下圖所示。
1).通知和渠道的首尾核對(duì)
第三方支付系統(tǒng)與商戶(hù)交互的系統(tǒng)是通知系統(tǒng),與銀行交互的系統(tǒng)是渠道,通知和渠道是系統(tǒng)上下的兩個(gè)邊界,把控住兩個(gè)邊界不產(chǎn)生單邊是非常重要的任務(wù),這可以通過(guò)首尾核對(duì)來(lái)保障。
首尾核對(duì)的示意圖如下。
2)渠道與銀行的核對(duì)
支付成功銀行通知第三方支付后,第三方支付的渠道系統(tǒng)實(shí)時(shí)反查銀行比對(duì)狀態(tài)和金額的查詢(xún)。有些銀行由于設(shè)計(jì)問(wèn)題不支持實(shí)時(shí)查詢(xún),則可以退而求其次,增加一個(gè)分鐘級(jí)異步核對(duì)與銀行之間的核查機(jī)制。
3)渠道成功率監(jiān)控
對(duì)于渠道的成功率太高或者太低的情況進(jìn)行監(jiān)控,能夠防止系統(tǒng)bug導(dǎo)致的不該成功的支付都被認(rèn)為成功了的情況,這個(gè)監(jiān)控也是至關(guān)重要的。
4)自動(dòng)化的底線(xiàn)防火墻
人總是受到各種環(huán)境的影響,完全靠人來(lái)保證代碼質(zhì)量并不是萬(wàn)無(wú)一失的,所以,我們應(yīng)該尋求自動(dòng)化測(cè)試方案,實(shí)際上第三方支付的產(chǎn)品形態(tài)主要是API產(chǎn)品,非常適合進(jìn)行自動(dòng)化測(cè)試,因此,我們要尋求兩個(gè)方面的自動(dòng)化,一個(gè)是測(cè)試用例要自動(dòng)化管理,不斷的積累測(cè)試用例,對(duì)測(cè)試用例進(jìn)行分級(jí),哪些是業(yè)務(wù)測(cè)試用例,哪些是資金底線(xiàn)測(cè)試用例,資金底線(xiàn)測(cè)試用例要在上生產(chǎn)環(huán)境之前的內(nèi)側(cè)環(huán)境進(jìn)行測(cè)試,而且應(yīng)該由系統(tǒng)自動(dòng)觸發(fā),***集成在devops的上線(xiàn)流程中,不可跳過(guò),如果這部分的自動(dòng)化的資金底線(xiàn)測(cè)試失敗,不允許上線(xiàn)。
下圖中,我們看到內(nèi)側(cè)環(huán)境我們構(gòu)建了一個(gè)自動(dòng)化的底線(xiàn)測(cè)試防火墻。
1)渠道的試運(yùn)營(yíng)
通常資金底線(xiàn)風(fēng)險(xiǎn)放生在渠道系統(tǒng),因?yàn)榍老到y(tǒng)總是要對(duì)接新的銀行渠道,常在河邊走,哪有不濕鞋,因此,在新渠道上線(xiàn)的過(guò)程中,一定要保證有試運(yùn)營(yíng)的階段,是運(yùn)營(yíng)要認(rèn)真觀察支付的結(jié)果,并且要有足夠的時(shí)間,至少要到第二天看到銀行的清算文件和對(duì)賬文件,與真實(shí)發(fā)起的交易一致,才能認(rèn)為新渠道上線(xiàn)是成功的。
2)萬(wàn)無(wú)一失的資金對(duì)賬
資金對(duì)賬是第三方支付必不可少的一個(gè)保證資金安全的方式,主要是通過(guò)第三方支付的信息與銀行之間的對(duì)賬,通常銀行回提供清算文件和對(duì)賬文件,清算文件記錄的是第三方支付做過(guò)的所有交易名氣,對(duì)賬文件是銀行提供的備付金賬戶(hù)資金的日初和日末的賬戶(hù)余額,通過(guò)這兩個(gè)對(duì)賬文件,一個(gè)代表信息流,一個(gè)代表資金流,就可以講所有的資金對(duì)清楚。
3)具體到責(zé)任人的底線(xiàn)驗(yàn)收
對(duì)于重要功能上線(xiàn),一定要制定負(fù)責(zé)人,負(fù)責(zé)人要對(duì)資金底線(xiàn)負(fù)責(zé),功能上線(xiàn)之前要驗(yàn)收,這里一定要秉著負(fù)責(zé)到底的原則,不要大家都負(fù)責(zé),結(jié)果大家都不負(fù)責(zé),除了問(wèn)題大家都帥鍋,誰(shuí)負(fù)責(zé),誰(shuí)做底線(xiàn)驗(yàn)收,上線(xiàn)成功誰(shuí)獲得***的回報(bào),只有這樣才能保持一個(gè)良性循環(huán),才能激勵(lì)大家對(duì)事情的負(fù)責(zé)態(tài)度。
4)系統(tǒng)間一致性核對(duì)
在第三方支付系統(tǒng)中,由于業(yè)務(wù)復(fù)雜,通常會(huì)使用分布式架構(gòu)或者微服務(wù)架構(gòu)來(lái)實(shí)現(xiàn)系統(tǒng),一個(gè)流程依據(jù)功能被分散在多個(gè)系統(tǒng)中來(lái)實(shí)現(xiàn),那么每個(gè)系統(tǒng)中都有自己的支付狀態(tài),各個(gè)系統(tǒng)之間如何協(xié)調(diào)一致呢?這就需要系統(tǒng)間一致性核對(duì),也就是系統(tǒng)內(nèi)的任何兩個(gè)相鄰的系統(tǒng)都需要進(jìn)行核對(duì)支付訂單狀態(tài)。
執(zhí)行資金底線(xiàn)保護(hù)任務(wù)的方法論
如果你足夠幸運(yùn)在你所在的支付公司里負(fù)責(zé)資金底線(xiàn)保護(hù)的任務(wù),那么恭喜你,只有關(guān)鍵核心的人才能做這份工作,但是,還有另外一個(gè)說(shuō)法,這個(gè)工作其實(shí)是費(fèi)力不討好的,做好了是應(yīng)該做的,做不好那都是你的責(zé)任,不管怎么樣,事情還是要做好。
如果你接到了這個(gè)任務(wù),感覺(jué)無(wú)從下手,那么請(qǐng)看下面的方法論。
- 回顧以前發(fā)生的所有資金風(fēng)險(xiǎn)的案例。
- 梳理可能發(fā)生資金風(fēng)險(xiǎn)的所有場(chǎng)景。
- 根據(jù)發(fā)生資金風(fēng)險(xiǎn)的案例和場(chǎng)景,形成避免、攔截和止損的方案。
- 做計(jì)劃和跟進(jìn)方案的實(shí)施。
【本文為51CTO專(zhuān)欄作者“李艷鵬”的原創(chuàng)稿件,轉(zhuǎn)載可通過(guò)作者簡(jiǎn)書(shū)號(hào)(李艷鵬)或51CTO專(zhuān)欄獲取聯(lián)系】