從零開始設計對賬系統

来源:https://www.cnblogs.com/goodAndyxublog/archive/2019/01/23/10311345.html
-Advertisement-
Play Games

前言 對賬系統作為支付系統中的基石系統,處於整個支付環節中的最後一層,主要用來保證我方支付數據與第三方支付渠道或銀行的數據一致性。 在沒有對賬系統之前,財務在第二日手工核對前一日的應收與實收。倘若不一致,這就需要一一核對數據,找出不一致的數據。對賬系統出現之後,就可減少以這種繁瑣手工操作,財務只需要 ...


前言

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

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

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

系統整體設計

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

  • 渠道數據處理模塊
  • 數據處理模塊
  • 核對模塊
  • 差異數據處理模塊

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

模塊層次圖

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

渠道數據處理模塊

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

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

  • 第三方渠道定時推送到 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 這種分散式定時調度程式,可以做到快速修改定時任務的時間,而無需重啟程式。以及可以快速觸發定時任務。

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

推薦閱讀

支付對賬系統怎麼設計?

咱們聊聊對賬系統該如何設計

鳳凰老熊-對賬處理


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前面介紹了類的多態性,來自於雞類的實例chicken,既能用來表達公雞實例,也能用來表達母雞實例。可是這導致了一個問題,假如在call方法內部需要手工判斷輸入參數屬於公雞實例還是母雞實例,那該如何是好?所謂“雄兔腳撲朔,雌兔眼迷離,雙兔傍地走,安能辨我是雄雌”,固然編譯器在運行之時能夠自動判斷這是哪 ...
  • 輸入兩個整數 n,m ,求在 m 個數中取 n 個數的方案總數: 1 var 2 n,m:longint; 3 function c(n,m:longint):qword; 4 var 5 i:longint; 6 begin 7 c:=1; 8 for i:=1 to n do 9 c:=c*(m ...
  • Python函數總結 一、函數的基本用法 函數是對程式邏輯進行結構化或是過程化的一種編程方法,其是組織好的,可重覆使用的,用來實現單一,或者相同功能的代碼段。 函數提高了應用點的模塊性和代碼的重覆利用率 本質:函數是對功能的封裝 形式參數:簡稱形參,本質是一個沒有值的變數 ​ 實際參數:簡稱實參,本 ...
  • 什麼是工廠設計模式? 看了好多文章,寫的五花八門,以下是我對工廠模式的理解,重點是文末我通過大量的文章總結出的抽象工廠模式和工廠模式以及之間的區別,可以讓你更好的認識工廠模式。 工廠設計模式,顧名思義,就是用來生產對象的,在java中,萬物皆對象,這些對象都需要創建,如果創建的時候直接new該對象, ...
  • 一.運算符邏輯運算and:兩邊都真則真or:有真則真not:非假是真順序:()>==>not==>and>=or二.while.. elsewhile 條件: 代碼塊else: 當條件為假的時候執行三.主要內容1.編碼 1.最早的電腦編碼是ASCII,美國人創建的,包含了英文字母(大小寫字母). ...
  •   本例所繪圖形選自《Go語言程式設計》(作者:Alan A. A. Donovan與Brian W. Kernighan)。 完整代碼 效果 說明   1、這裡對節點與箭頭線段style的定義放在了tikzpicture環境定義的參數設置中。實際工作中,對於 ...
  • 一、PHP消息隊列實現及應用 二、消息隊列的優缺點 三、消息隊列的配置和準備工作 案例如下: 下麵是隊列表欄位及屬性 四、Mysql訂單隊列 1、接受訂單,並寫入數據 order.php 2、隊列系統處理隊列中的訂單併進行標識goods.php 3、定時任務。每分鐘執行一次goods.sh 要會sh ...
  • 沒有Java編寫畫圖板程式細節-保存已畫圖形 一、為何我們要保存畫圖板上已畫圖形呢? 有很多人會問,為什麼我們一定要保存畫圖板上已經畫好了的圖形呢?原因很簡單。當我們在畫圖板上畫完自己想畫的圖形後,如果進行以下幾個操作,就會發現幾個降低用戶體驗感的問題,而這些問題就是由於沒有保存已畫圖形造成的。 首 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...