對賬系統的設計方案.你有興趣嗎?

前言

對賬系統作爲支付系統中的基石系統,處於整個支付環節中的最後一層,主要用來保證我方支付數據與第三方支付渠道或銀行的數據一致性。

在沒有對賬系統之前,財務在第二日手工覈對前一日的應收與實收。倘若不一致,這就需要一一覈對數據,找出不一致的數據。對賬系統出現之後,就可減少以這種繁瑣手工操作,財務只需要每天關注系統的對賬記錄,釋放了生產力。

本文主要結合實際的項目經驗,聊聊對賬系統的設計方案。

系統整體設計

對賬系統設計主要分爲以下四個模塊:

  • 渠道數據處理模塊

  • 數據處理模塊

  • 數據覈對模塊

  • 差異數據處理模塊

模塊調用順序層次圖如下。

聊聊對賬系統的設計方案

下面先來介紹渠道數據處理模塊。

渠道數據處理模塊

這個模塊主要負責渠道對賬文件的下載,解析,以及數據落庫。

目前市面上第三方支付渠道對賬文件下載方式主要分爲以下幾類:

  • 第三方渠道定時推送到 SFTP/FTP。這種模式比較簡單,我們定時從 SFTP/FTP 取對賬文件。

  • 調用第三方渠道對賬文件下載接口。這種模式需要對接渠道下載對賬文件接口,定時調用下載。支付寶與微信爲該模式。

  • 手動在支付渠道網站下載對賬文件。這種模式最不友好,需要我們花費人力下載文件。

除了下載方式,對賬文件的格式也會存在一些區別。比如支付寶對賬文件格式爲 csv,而微信的對賬文件格式爲 txt,另外有些渠道爲 xml,xls。

第三方渠道對賬文件裏面字段數量以及字段名稱也存在不同。

聊聊對賬系統的設計方案

一般這一層每接入一個渠道需要專門根據這個渠道特性開發。這一層可以抽象化接口,對外暴露下載與解析接口。每次接入渠道,實現該接口相應方法即可。

這一層開發難度不大,只要根據對賬文件格式相應解析文件即可。一般需要提取對賬文件裏面信息如下:


 
  1. 商戶號

  2. 商戶訂單號

  3. 渠道流水號

  4. 交易日期

  5. 交易金額

  6. 手續費

  7. 退款原訂單號

下面說一下開發這一層需要注意的一些細節。

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 這種分佈式定時調度程序,可以做到快速修改定時任務的時間,而無需重啓程序。以及可以快速觸發定時任務。高質量編程視頻shangyepingtai.xin

總之,對賬系統工作不難,就是細節比較繁瑣,前期很難將所有細節都考慮完全,這個過程需要我們不斷改進。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章