前言 對賬系統作為支付系統中的基石系統,處於整個支付環節中的最後一層,主要用來保證我方支付數據與第三方支付渠道或銀行的數據一致性。 在沒有對賬系統之前,財務在第二日手工核對前一日的應收與實收。倘若不一致,這就需要一一核對數據,找出不一致的數據。對賬系統出現之後,就可減少以這種繁瑣手工操作,財務只需要 ...
前言
對賬系統作為支付系統中的基石系統,處於整個支付環節中的最後一層,主要用來保證我方支付數據與第三方支付渠道或銀行的數據一致性。
在沒有對賬系統之前,財務在第二日手工核對前一日的應收與實收。倘若不一致,這就需要一一核對數據,找出不一致的數據。對賬系統出現之後,就可減少以這種繁瑣手工操作,財務只需要每天關註系統的對賬記錄,釋放了生產力。
本文主要結合實際的項目經驗,聊聊對賬系統的設計方案。
系統整體設計
對賬系統設計主要分為以下四個模塊:
- 渠道數據處理模塊
- 數據處理模塊
- 核對模塊
- 差異數據處理模塊
模塊調用順序層次圖如下。
下麵先來介紹渠道數據處理模塊。
渠道數據處理模塊
這個模塊主要負責渠道對賬文件的下載,解析,以及數據落庫。
目前市面上第三方支付渠道對賬文件下載方式主要分為以下幾類:
- 第三方渠道定時推送到 SFTP/FTP。這種模式比較簡單,我們定時從 SFTP/FTP 取對賬文件。
- 調用第三方渠道對賬文件下載介面。這種模式需要對接渠道下載對賬文件介面,定時調用下載。支付寶與微信為該模式。
- 手動在支付渠道網站下載對賬文件。這種模式最不友好,需要我們花費人力下載文件。
除了下載方式,對賬文件的格式也會存在一些區別。比如支付寶對賬文件格式為 csv,而微信的對賬文件格式為 txt,另外有些渠道為 xml,xls。
第三方渠道對賬文件裡面欄位數量以及欄位名稱也存在不同。
一般這一層每接入一個渠道需要專門根據這個渠道特性開發。這一層可以抽象化介面,對外暴露下載與解析介面。每次接入渠道,實現該介面相應方法即可。
這一層開發難度不大,只要根據對賬文件格式相應解析文件即可。一般需要提取對賬文件裡面信息如下:
商戶號
商戶訂單號
渠道流水號
交易日期
交易金額
手續費
退款原訂單號
下麵說一下開發這一層需要註意的一些細節。
1、同一渠道若申請了多個商戶號。這種情況下,每個商戶號若前一日都存在交易,第三方渠道會為每個商戶號都會產生一份對賬文件。所以這裡系統設計時候需要考慮到多份對賬文件處理的情況。
2、對賬文件需要考慮重覆下載的情況。一般情況下,渠道的對賬文件一旦生成,就不會改變。但是第三方渠道也可能發生異常,導致我方收到對賬文件數據不完整。這種情況下,需要有機制重新下載解析入庫。
3、每個第三方渠道下載文件時間都不一樣。
數據處理模塊
講完對賬文件處理模塊,我們來看數據處理模塊。
這個模塊主要用來提取我方前一日所有支付成功的流水數據以及上一模塊入庫的前一日對賬單的流水數據。為了減少資料庫的壓力,提取的數據只需要包括必要欄位即可,無需將整行數據信息都提取出來。一般來說只要需要提取交易時間,金額,交易訂單號,渠道返迴流水號。
這一層主要就是資料庫的查詢行為。最好使用備庫進行數據查詢。因為這裡我們需要提取前一日全量的支付成功的數據,數據量大的情況下,可能會拖慢主庫,影響線上的支付交易。
核對模塊
這一個模塊我們使用上一模塊提取出來的數據,核對訂單號與金額是否完全一致。核對模塊偽代碼如下。
這個過程可能產生三類差異數據。
第一種情況為本端數據存在,對端數據不存在,我們稱為本端多賬。
第二種情況為對端數據存在,本端數據不存在,我們稱為對端多賬。
第三種情況為金額不一致。
三者如圖所示。
這裡產生的差異數據存入一張差異表中,以便下個模塊使用。
差異數據處理模塊
這個模塊主要用來處理上個模塊產生的差異數據。
上面三類差異數據中,金額不一致相當少見,這種情況需要人工判斷。
我們先討論本端多賬的情況。
本端多賬是對賬系統最常見的一種情況。這種情況可能由於交易的時候發生日切問題,導致雙方記賬日期不一致,從而發生不平賬。
我們先解釋日切的概念。
日切,通俗的來說就是更換系統記賬的時間,系統從當前工作日切換到下一工作日。這個過程中,若我方的交易訂單剛好發生在 T 日 23:59:59,那麼我方的記賬時間為 T 日。第三方渠道接收到訂單的時間為 T+1 日 00:00:01,這樣第三方渠道該筆的交易的對賬日期為 T+1 日。
第三方渠道 T 日對賬文件將缺少這筆,但是我方 T 日數據卻存在這筆,這就導致了核對過程中產生一筆本端多賬差異數據。
對於這類差異數據,我們可以選擇將這筆數據掛賬,等待 T+1 工作日對賬。T+1 日對賬的時候,對賬單會相應多出數據,這樣在核對過程就會產生對端多賬的差異數據。
然後在 T+1 日差異處理模塊將前幾日差異數據都提取出來,逐筆核對本端多賬數據與對端多賬數據。若核對一致,將兩筆差異狀態都更新成處理完成。最後若無剩餘差異數據,當天賬單平賬。
偽代碼如下:
對端多賬的產生情況可能可能有兩種情況.
第一種情況測試環境與生產環境共用一份第三方渠道參數,這就導致測試環境交易訂單也會出現在對賬單中。若是這種情況,我們確認測試環境存在這批數據之後,我們忽略這批差異數據即可。
第二種情況,本端交易訂單存在,但是狀態不是成功狀態。這種情況下,需要調用第三方渠道提供的查詢介面,查詢訂單最終狀態。若查詢成功,更新訂單狀態,然後將差異數據狀態更改為處理成功。
若第三方渠道無法查詢到訂單的狀態。這種若與渠道確認訂單最終支付成功,我們需要將支付訂單改為支付成功,並修改差異賬的狀態。
最後我們再次重新對賬,由於對端多賬的數據會有對應的本端數據,將不會產生差異數據,這次對賬完成且平賬。
系統優化
目前系統的對賬系統定時任務採用 Spring 定時功能。後期優化準備接入 elasticjob 這種分散式定時調度程式,可以做到快速修改定時任務的時間,而無需重啟程式。以及可以快速觸發定時任務。
總之,對賬系統工作不難,就是細節比較繁瑣,前期很難將所有細節都考慮完全,這個過程需要我們不斷改進。