轉(zhuǎn)載:http://www.woshipm.com/it/459445.html
可以說,對賬是支付系統(tǒng)最頭疼的事情。每一筆交易,都要做到各參與者的記錄能夠吻合痪伦,沒有偏差侄榴。對賬系統(tǒng)的工作,是發(fā)現(xiàn)有差異的記錄网沾,即軋帳癞蚕;然后通過人工或者自動的方式,解決這些差異辉哥,即平帳桦山。
對電商系統(tǒng)來說,每一筆交易醋旦,在所有相關(guān)主體側(cè)都要能對得上:
交易主體恒水,如果發(fā)起人是個人,必須能夠從個人交易歷史記錄中找到這筆交易饲齐。但大部分人不會保留電子記錄钉凌,所以一般是提供可以下載的賬單或交易記錄,讓用戶自己對去箩张。
交易對手甩骏,一般是商戶窗市。商戶側(cè)對賬處理同用戶側(cè)先慷,也僅僅提供對賬單。
交易渠道側(cè)咨察,這是對賬的重點论熙,一是核實交易流水,二是核實交易傭金摄狱,畢竟是租用人家通道做結(jié)算的脓诡。
那有哪些記錄需要對賬? 目前主要是兩個:一個是交易記錄媒役;一個是退款記錄祝谚。
對賬處理流程
一般來說,對賬流程涉及到如下步驟: 渠道對賬單下載酣衷、本地交易記錄準(zhǔn)備交惯、軋賬、平賬穿仪。
渠道對賬單下載
銀行席爽,第三方支付,銀聯(lián)等啊片,基本都會提供對賬單下載的功能只锻。不過也有少數(shù)工作做不到位或者太到位的銀行,只提供賬單查詢后臺紫谷,不提供對賬單下載功能齐饮。
對開發(fā)人員來說捐寥,這里有幾個坑:
對賬單格式不一。文本沈矿,XML上真,csv的都有。為了后續(xù)能夠統(tǒng)一處理羹膳,在賬單下載完成后睡互,需要進行標(biāo)準(zhǔn)化處理。
下載方式不一陵像,HTTP就珠,HTTPS,F(xiàn)TP的醒颖,都有妻怎。下載程序需要按照渠道的協(xié)議來處理。
下載時間不一泞歉,一般是凌晨1點后逼侦,到中午12才能用的也有。如果在預(yù)定的時間取不到數(shù)據(jù)腰耙,需要注意重試讀取榛丢。
穩(wěn)定性差。FTP服務(wù)器出問題那是常有的事挺庞。渠道側(cè)解決方案往往就是重啟晰赞。所以重試機制是必要的。
看一下第三方支付的對賬單情況:
銀行直連的對賬情況:
技術(shù)選型上选侨,HTTP(S)用apache httpclient即可實現(xiàn)鏈接池和斷點續(xù)傳掖鱼, FTP也可以使用Apache Commons Net API。 但不管是哪一個援制,都需要設(shè)置重試次數(shù)和鏈接超時間戏挡。重試次數(shù)和間隔的設(shè)置需要小心,重試太頻繁晨仑,容易把服務(wù)器打死.褐墅;時間間隔太大,又會阻塞后續(xù)處理步驟寻歧。5~10分鐘是一個合適的重試間隔區(qū)間掌栅。
鏈接超時指在服務(wù)器出現(xiàn)問題時,連接在指定時間內(nèi)獲取不到數(shù)據(jù)即自動斷開码泛。這個很容易被忽略猾封。我們有一次系統(tǒng)出問題,是渠道側(cè)的FTP假死后重啟噪珊,導(dǎo)致我們的客戶端掛住晌缘,一直在等待重新鏈接齐莲。
渠道對賬單標(biāo)準(zhǔn)化
找個例子大家看看, 比如微信的對賬單磷箕,他是csv格式的选酗,包括如下信息:
交易時間:這是在微信側(cè)的支付完成的時間。 這個時間會成為一個陷阱岳枷。
公眾賬號ID芒填,商戶號,子商戶號,設(shè)備號: 這些信息需要做驗證,確保是自己的單子空繁,不要讓微信把老王家的單子也給發(fā)過來了殿衰;
微信訂單號,商戶訂單號: 這兩個是對單的核心。前者是微信側(cè)產(chǎn)生的訂單號盛泡,在微信支付接口返回值中有闷祥。但是萬一收不到這個返回值,那在本地記錄中可能就空了傲诵。 后者是我們發(fā)送給微信的訂單號凯砍,一般用這個來做對單依據(jù)。兩邊的數(shù)據(jù)中都會有這個值拴竹。
用戶標(biāo)識,交易類型,交易狀態(tài),付款銀行,貨幣種類,總金額,企業(yè)紅包金額: 這幾個就是對單的核心字段悟衩,必須確保雙方是一致的。
商品名稱,商戶數(shù)據(jù)包,手續(xù)費,費率:這些是可選驗證殖熟。
而某寶的對賬單局待,是文本格式的斑响,用空格隔開菱属。他們家的就簡單很多,只有商戶訂單號舰罚,交易流水號纽门,交易時間,支付時間营罢,付款方赏陵,交易金額,交易類型饲漾,交易狀態(tài)這些字段蝙搔。
由于每個渠道的賬單格式都不盡相同, 在得到賬單后考传,下一步是對賬單做標(biāo)準(zhǔn)化處理吃型,這樣軋帳以及后續(xù)工作就可以統(tǒng)一處理了。 標(biāo)準(zhǔn)化后的賬單數(shù)據(jù)可以放在文件系統(tǒng)或者數(shù)據(jù)庫中僚楞。這取決于交易數(shù)據(jù)量勤晚。每天百萬以上的量枉层,還是使用文件系統(tǒng),比較合適赐写。數(shù)據(jù)庫操作相對比較慢鸟蜡,也浪費資源。
基于文件系統(tǒng)的標(biāo)準(zhǔn)化涉及如下內(nèi)容:
文件格式標(biāo)準(zhǔn)化:統(tǒng)一使用csv或者json或者xml格式挺邀。如果是使用hadoop或者spark來對賬揉忘,使用csv是個不錯的選擇。
文件存儲統(tǒng)一化:文件目錄端铛,文件名都需要遵循統(tǒng)一命名規(guī)范癌淮。
為了加快處理速度,我們使用hdfs作為文件系統(tǒng)沦补,有利于后續(xù)的對賬的處理乳蓄。
本地交易記錄準(zhǔn)備
本地交易記錄的準(zhǔn)備,總的來說有如下方法: – 啥都不做夕膀,直接用原始數(shù)據(jù)虚倒。鑒于大部分系統(tǒng)使用的是mysql,這也意味著在MySQL上做對賬产舞。對賬時需要大量的數(shù)據(jù)查找工作魂奥,必然會影響線上業(yè)務(wù)。在數(shù)據(jù)規(guī)模較大易猫,比如超過100萬時耻煤,就不太合適了。
當(dāng)然准颓,還有一個選擇是使用備庫來執(zhí)行對賬哈蝇,這樣既簡單,也不影響線上業(yè)務(wù)攘已。這是典型的空間換時間的做法炮赦。
如果業(yè)務(wù)大到需要分表分庫才能處理,那對賬數(shù)據(jù)準(zhǔn)備也不一樣样勃。使用分庫也不現(xiàn)實吠勘,因為分庫一般是按照主體id,而不是渠道id峡眶,來分庫剧防,這樣對賬就需要在多個庫上進行,效率反而降低了辫樱。而對分表分庫建立從庫也非常耗費資源峭拘。這種情況下,需要同步一份數(shù)據(jù)到(hdfs)文件系統(tǒng)中,或者NOSQL數(shù)據(jù)庫上棚唆。
由于交易記錄是支付系統(tǒng)核心數(shù)據(jù)暇赤,有大量的應(yīng)用,如信用宵凌、風(fēng)控等鞋囊,都需要交易記錄數(shù)據(jù)。這些應(yīng)用對交易記錄的需求還不完全一致瞎惫,為了提升性能溜腐, 交易記錄會使用異步的方式來將數(shù)據(jù)投遞給使用方。 交易記錄在入庫時瓜喇,投遞消息到消息系統(tǒng)中挺益。使用方監(jiān)聽這個消息,一旦收到新消息乘寒,則從交易記錄庫中查詢數(shù)據(jù)望众,獲取數(shù)據(jù)并更新到庫中。關(guān)于此類數(shù)據(jù)同步的文章不少伞辛,這里就不詳細介紹烂翰。
軋帳
軋帳是按照客戶訂單號來比較本地交易記錄和渠道交易記錄是否一致。從算法角度蚤氏,是計算兩個數(shù)組的差異甘耿。在單機運行時,可以采用的算法不少竿滨,這里不詳細介紹佳恬。 我們推薦采用mapreduce來軋帳,這有個優(yōu)勢于游,可以按照訂單號將渠道提供的記錄和本地記錄shuffle到同一個reduce處理上毁葱,這樣就可以很容易進行數(shù)據(jù)比對。 軋帳中最大的坑曙砂,莫過于切分點的問題头谜。
比如以整0點為切分點骏掀,那存在一個問題鸠澈,本地23:59發(fā)起的交易,到了渠道側(cè)截驮,可能會在00:01處理笑陈,這一筆交易變成第二天的帳了。實際處理中葵袭,一筆交易在渠道側(cè)處理涵妥,花上幾分鐘都有可能。 對于切分點附近無法確認的帳坡锡,做一個時間窗蓬网,在時間窗內(nèi)的數(shù)據(jù)窒所,留待第二天對賬時繼續(xù)處理。
平帳
發(fā)現(xiàn)兩邊不一致的數(shù)據(jù)帆锋,那應(yīng)該如何處理吵取?數(shù)據(jù)量不大時,記錄起來锯厢,人工甄別就行皮官。但如果數(shù)據(jù)量很大,每天上千條实辑,人工處理就成本太高了捺氢。這個沒有統(tǒng)一的處理方法,需要根據(jù)有問題的數(shù)據(jù)剪撬,做個分析摄乒,然后做自動處理。 針對交易記錄的對賬的處理残黑,主要有如下情況:
本地未支付缺狠,支付渠道已支付。這主要是本地未正確接收到渠道下發(fā)的異步通知導(dǎo)致萍摊。 一般處理是將本地狀態(tài)修改為已支付挤茄,并做響應(yīng)的后續(xù)處理,比如通知業(yè)務(wù)方等冰木。
本地已支付穷劈,支付渠道已支付,但是金額不同踊沸,這個需要人工核查歇终。
本地已支付,但是支付渠道中無記錄逼龟;或者本地?zé)o記錄评凝,支付渠道有記錄。在排除跨日因素外腺律,這種情況非常少見奕短,需要了解具體原因后做處理。
針對退款的對賬處理匀钧,主要有如下情況:
本地未退款翎碑,支付渠道已退款,則以支付渠道為準(zhǔn)之斯,修改本地為已退款狀態(tài)日杈,并觸發(fā)后續(xù)處理。
本地已退款、支付渠道已退款莉擒,但是金額不同酿炸,需要人工核查;
本地已退款涨冀,但是支付渠道無記錄梁沧;或者支付渠道有記錄,但是本地沒有蝇裤。 在排除跨日因素外廷支, 這種情況非常少見,需要了解具體原因后做處理栓辜。
總之恋拍,對賬工作,即復(fù)雜也不復(fù)雜藕甩。需要細心施敢,對業(yè)務(wù)要有深入的了解,并選擇合適的架構(gòu)狭莱。