1 資損
資金損失,有多扣用戶款導(dǎo)致用戶的資金損失,也有多出金或多充值導(dǎo)致支付公司的資金損失的。
2 資損分析
2.1 跟上下游系統(tǒng)交互
2.1.1 重復(fù)請(qǐng)求或者被重復(fù)請(qǐng)求
發(fā)生在系統(tǒng)交互連接處,被調(diào)用方重復(fù)發(fā)起同一筆業(yè)務(wù)訂單,或同一筆訂單調(diào)用其他系統(tǒng)發(fā)起兩次以上請(qǐng)求,如果交互雙方對(duì)“同一筆訂單”的認(rèn)識(shí)不統(tǒng)一,相關(guān)聯(lián)系統(tǒng)沒有對(duì)“同一筆訂單”做好防重處理,都會(huì)導(dǎo)致重復(fù)出金或重復(fù)入金。
2.1.2 交互結(jié)果的返回碼
需要明確調(diào)用別人系統(tǒng)返回碼的含義,區(qū)分代表的是通訊結(jié)果還是業(yè)務(wù)結(jié)果,往往會(huì)因?yàn)榘巡皇钦嬲臉I(yè)務(wù)失敗返回碼映射成失敗的情況居多,還有就是超時(shí)無返回結(jié)果的時(shí)候也按失敗處理的話,也會(huì)造成資損。對(duì)于別人調(diào)用我們的系統(tǒng)時(shí),我們盡量返回盡量少,盡量明確的返回碼,對(duì)方如果處理不好的話也會(huì)出現(xiàn)資損。
2.1.3 并發(fā)
只在代碼上判重訂單還不夠,如果沒有控制好并發(fā),當(dāng)訂單同一時(shí)刻到達(dá)時(shí),程序會(huì)判定無歷史單均進(jìn)入下一步的業(yè)務(wù)處理,會(huì)發(fā)生資損。
2.2 內(nèi)部邏輯錯(cuò)誤
2.2.1 業(yè)務(wù)邏輯過程處理
業(yè)務(wù)處理遵循正常的業(yè)務(wù)處理過程,如果程序處理沒有嚴(yán)格貼合標(biāo)準(zhǔn),比如先扣金額再出金這個(gè)過程中沒有先扣掉金額就去做出金業(yè)務(wù),再或者處理過程中重要數(shù)據(jù)比如金額、收款方信息遭到更改,就會(huì)發(fā)生資損。
2.2.2 手續(xù)費(fèi)
由于好些場(chǎng)景中的手續(xù)費(fèi)扣除是跟主業(yè)務(wù)分開進(jìn)行的,手續(xù)費(fèi)是不是扣了,多扣少扣都不易發(fā)覺,所以此處也有資損的風(fēng)險(xiǎn)。
2.2.3 金額換算
在一些精度要求比較高的場(chǎng)景中,某些數(shù)據(jù)庫支持的不夠,需要將小數(shù)轉(zhuǎn)成整數(shù)存放和讀取,此時(shí)如果處理不當(dāng),會(huì)造成資損。
2.2.4 狀態(tài)控制
狀態(tài)在訂單的流轉(zhuǎn)處理中扮演著非常重要的角色,每種狀態(tài)的變化是有順序的,每個(gè)狀態(tài)下能做的業(yè)務(wù)處理也是有限制的,如果在某個(gè)狀態(tài)下做了不該做的事情,或者狀態(tài)轉(zhuǎn)換時(shí)跳過了設(shè)定的狀態(tài),就有可能會(huì)發(fā)生資損。
2.3 安全漏洞
2.3.1 偽造請(qǐng)求數(shù)據(jù)
報(bào)文被別有用心的人截取后,偽造請(qǐng)求報(bào)文發(fā)起出金請(qǐng)求,一旦安全機(jī)制薄弱的話會(huì)造成資損
2.3.2 內(nèi)部人員調(diào)用系統(tǒng)
內(nèi)部人員根據(jù)系統(tǒng)漏洞,模擬異步通知結(jié)果混淆當(dāng)前系統(tǒng),將本不該處理的訂單處理狀態(tài),引發(fā)后續(xù)一系列操作,可能會(huì)造成資損。
2.3.3 人為修改數(shù)據(jù)庫
如果數(shù)據(jù)庫人為修改出金金額或者狀態(tài)等關(guān)鍵信息,如果不能識(shí)別的話會(huì)造成資損
2.4 人工處理
人工處理異常訂單時(shí)往往跟系統(tǒng)自動(dòng)處理的邏輯不一致,導(dǎo)致有可能會(huì)重復(fù)處理業(yè)務(wù),或者在人工處理時(shí)與系統(tǒng)自動(dòng)處理并發(fā)導(dǎo)致資損。
3 解決方法
3.1 唯一商戶訂單號(hào)
防重表或數(shù)據(jù)庫對(duì)商戶號(hào)+商戶訂單號(hào)做唯一索引約束,控制請(qǐng)求的是否重發(fā)
3.2 解決并發(fā)問題
基于redis分布式鎖
基于數(shù)據(jù)庫排他鎖
增加審核機(jī)制,人工排除并發(fā),然后再進(jìn)行后續(xù)處理
3.3 白名單
系統(tǒng)白名單,重點(diǎn)系統(tǒng)交互比如在異步通知回調(diào)接口要識(shí)別回調(diào)報(bào)文的來源,對(duì)指定的Ip斷才認(rèn)為是合法的。
業(yè)務(wù)白名單,重點(diǎn)業(yè)務(wù)對(duì)重要標(biāo)識(shí)比如交易雙方、業(yè)務(wù)主體等做的白名單,控制業(yè)務(wù)的影響范圍。
3.4 風(fēng)控黑名單或商戶授權(quán)聯(lián)動(dòng)控制
通過風(fēng)控系統(tǒng)或者商戶控制中心對(duì)發(fā)現(xiàn)的可疑商戶及時(shí)制止交易,聯(lián)動(dòng)業(yè)務(wù)系統(tǒng),達(dá)到防止資金損失的效果。
3.5 訂單、流水和狀態(tài)
業(yè)務(wù)邏輯處理中為減少失誤,需要依賴兩個(gè)點(diǎn),一個(gè)是訂單、流水,另一個(gè)是狀態(tài)。訂單記錄了一筆業(yè)務(wù)的詳細(xì)信息,狀態(tài)是訂單狀態(tài),描述的是業(yè)務(wù)處理過程中的某個(gè)點(diǎn),流水是資金變化的依據(jù)。處理過程中做能做哪些事情由當(dāng)前和相鄰狀態(tài)決定,資金操作以之前的資金流水為依據(jù)判斷是否可以執(zhí)行。
3.6 防篡改
接口請(qǐng)求需登錄,請(qǐng)求報(bào)文加時(shí)間戳和簽名。
數(shù)據(jù)庫對(duì)重要記錄加簽存儲(chǔ),做業(yè)務(wù)前判斷。
結(jié)合白名單,拒絕接受不明請(qǐng)求。
4 預(yù)防和監(jiān)控
4.1 事前
事前監(jiān)控主要是功能在上生產(chǎn)環(huán)境前的一系列測(cè)試,包括開發(fā)人員自測(cè)測(cè)試人員測(cè)試和生產(chǎn)模擬環(huán)境測(cè)試,任何改動(dòng)都不能不經(jīng)測(cè)試直接放生產(chǎn)環(huán)境。
開發(fā)完成后要對(duì)做單元測(cè)試和接口測(cè)試。單元測(cè)試可以保證重點(diǎn)邏輯各個(gè)分支處理的準(zhǔn)確性,接口測(cè)試可以保證整個(gè)業(yè)務(wù)大體的貫通。
測(cè)試人員結(jié)合用例進(jìn)行充分的功能測(cè)試和集成測(cè)試。
壓力測(cè)試測(cè)試并發(fā)情況下系統(tǒng)的運(yùn)行狀況。
生產(chǎn)模擬環(huán)境測(cè)試要測(cè)試通過。
4.2 事中
出金前檢查資金鏈路,一旦有問題,立即熔斷,標(biāo)識(shí)異常,拒絕出金,后續(xù)由人工介入處理。
數(shù)據(jù)庫日志監(jiān)控,根據(jù)數(shù)據(jù)庫日志,檢測(cè)到人為變更時(shí),做關(guān)聯(lián)的檢查,資金鏈路有問題時(shí)會(huì)觸發(fā)報(bào)警提示。
4.3 事后
系統(tǒng)上下游之間的對(duì)賬。正常情況下交互的系統(tǒng)間調(diào)用是一一對(duì)應(yīng)的,對(duì)于發(fā)生異?;蚴怯捎谕ㄓ嵉仍螂p方有未完成狀態(tài)的需要進(jìn)行系統(tǒng)對(duì)賬。
資金流和信息流關(guān)于出入金匯總對(duì)賬。這種對(duì)賬可以從宏觀上把控資金往來的準(zhǔn)確性,能夠發(fā)現(xiàn)多入金或者多出金的情況。
?????????????????????????????????????????????????????????