可以說,對帳是支付系統最頭疼的事情。每一筆交易,都要做到各參與者的記錄能夠吻合,沒有偏差。對帳系統的工作,是發現有差異的記錄,即軋帳;然後通過人工或者自動的方式,解決這些差異,即平帳。
對電商系統來說,每一筆交易,在所有相關主體側都要能對得上:
那有哪些記錄需要對帳? 目前主要是兩個:一個是交易記錄;一個是退款記錄。
一般來說,對帳流程涉及到如下步驟: 渠道對帳單下載、本地交易記錄準備、軋帳、平帳。
銀行,第三方支付,銀聯等,基本都會提供對帳單下載的功能。不過也有少數工作做不到位或者太到位的銀行,只提供帳單查詢後臺,不提供對帳單下載功能。
對開發人員來說,這裡有幾個坑:
看一下第三方支付的對帳單情況:

銀行直連的對帳情況:

技術選型上,HTTP(S)用apache httpclient即可實現連結池和斷點續傳, FTP也可以使用Apache Commons Net API。 但不管是哪一個,都需要設置重試次數和連結超時間。重試次數和間隔的設置需要小心,重試太頻繁,容易把伺服器打死.;時間間隔太大,又會阻塞後續處理步驟。5~10分鐘是一個合適的重試間隔區間。
連結超時指在伺服器出現問題時,連接在指定時間內獲取不到數據即自動斷開。這個很容易被忽略。我們有一次系統出問題,是渠道側的FTP假死後重啟,導致我們的客戶端掛住,一直在等待重新連結。
找個例子大家看看, 比如微信的對帳單,他是csv格式的,包括如下信息:
![]()
而某寶的對帳單,是文本格式的,用空格隔開。他們家的就簡單很多,只有商戶訂單號,交易流水號,交易時間,支付時間,付款方,交易金額,交易類型,交易狀態這些欄位。

由於每個渠道的帳單格式都不盡相同, 在得到帳單後,下一步是對帳單做標準化處理,這樣軋帳以及後續工作就可以統一處理了。 標準化後的帳單數據可以放在文件系統或者資料庫中。這取決於交易數據量。每天百萬以上的量,還是使用文件系統,比較合適。資料庫操作相對比較慢,也浪費資源。
基於文件系統的標準化涉及如下內容:
為了加快處理速度,我們使用hdfs作為文件系統,有利於後續的對帳的處理。
本地交易記錄的準備,總的來說有如下方法: – 啥都不做,直接用原始數據。鑑於大部分系統使用的是mysql,這也意味著在MySQL上做對帳。對帳時需要大量的數據查找工作,必然會影響線上業務。在數據規模較大,比如超過100萬時,就不太合適了。
由於交易記錄是支付系統核心數據,有大量的應用,如信用、風控等,都需要交易記錄數據。這些應用對交易記錄的需求還不完全一致,為了提升性能, 交易記錄會使用異步的方式來將數據投遞給使用方。 交易記錄在入庫時,投遞消息到消息系統中。使用方監聽這個消息,一旦收到新消息,則從交易記錄庫中查詢數據,獲取數據並更新到庫中。關於此類數據同步的文章不少,這裡就不詳細介紹。
軋帳是按照客戶訂單號來比較本地交易記錄和渠道交易記錄是否一致。從算法角度,是計算兩個數組的差異。在單機運行時,可以採用的算法不少,這裡不詳細介紹。 我們推薦採用mapreduce來軋帳,這有個優勢,可以按照訂單號將渠道提供的記錄和本地記錄shuffle到同一個reduce處理上,這樣就可以很容易進行數據比對。 軋帳中最大的坑,莫過於切分點的問題。
比如以整0點為切分點,那存在一個問題,本地23:59發起的交易,到了渠道側,可能會在00:01處理,這一筆交易變成第二天的帳了。實際處理中,一筆交易在渠道側處理,花上幾分鐘都有可能。 對於切分點附近無法確認的帳,做一個時間窗,在時間窗內的數據,留待第二天對帳時繼續處理。
發現兩邊不一致的數據,那應該如何處理?數據量不大時,記錄起來,人工甄別就行。但如果數據量很大,每天上千條,人工處理就成本太高了。這個沒有統一的處理方法,需要根據有問題的數據,做個分析,然後做自動處理。 針對交易記錄的對帳的處理,主要有如下情況:
針對退款的對帳處理,主要有如下情況:
總之,對帳工作,即複雜也不複雜。需要細心,對業務要有深入的了解,並選擇合適的架構。
支付系統設計:支付系統的帳戶模型(一)
作者:鳳凰牌老熊,程式設計師 & 架構師,來自中科大的本科,研究生在軟體所學習。先後在中科輔龍、三星(中國)研究院和國內一些大型的網際網路公司呆過。在中科輔龍公司負責電子政務內容管理系統建設,負責研發龍馭系列產品的研發,這款產品最終實施到2000多個電子政務網站上,期間也參與了一些支付反洗錢以及支付系統的建設。之後在三星中國研究院,負責自然語言處理(NLP)以及智能家居相關項目。智能家居項目在2014CES消費電子展上作為三星重點項目推介。2014年開始加入愛奇藝公司,負責數據倉庫和支付系統的建設。
本文由@鳳凰牌老熊(微信公眾號:shamphone) 原創發布於人人都是產品經理 。未經許可,禁止轉載。
