支付系統設計:對帳處理(二)

2020-12-14 人人都是產品經理

可以說,對帳是支付系統最頭疼的事情。每一筆交易,都要做到各參與者的記錄能夠吻合,沒有偏差。對帳系統的工作,是發現有差異的記錄,即軋帳;然後通過人工或者自動的方式,解決這些差異,即平帳。

對電商系統來說,每一筆交易,在所有相關主體側都要能對得上:

  • 交易主體,如果發起人是個人,必須能夠從個人交易歷史記錄中找到這筆交易。但大部分人不會保留電子記錄,所以一般是提供可以下載的帳單或交易記錄,讓用戶自己對去。
  • 交易對手,一般是商戶。商戶側對帳處理同用戶側,也僅僅提供對帳單。
  • 交易渠道側,這是對帳的重點,一是核實交易流水,二是核實交易佣金,畢竟是租用人家通道做結算的。

那有哪些記錄需要對帳? 目前主要是兩個:一個是交易記錄;一個是退款記錄。

對帳處理流程

一般來說,對帳流程涉及到如下步驟: 渠道對帳單下載、本地交易記錄準備、軋帳、平帳。

渠道對帳單下載

銀行,第三方支付,銀聯等,基本都會提供對帳單下載的功能。不過也有少數工作做不到位或者太到位的銀行,只提供帳單查詢後臺,不提供對帳單下載功能。

對開發人員來說,這裡有幾個坑:

  • 對帳單格式不一。文本,XML,csv的都有。為了後續能夠統一處理,在帳單下載完成後,需要進行標準化處理。
  • 下載方式不一,HTTP,HTTPS,FTP的,都有。下載程序需要按照渠道的協議來處理。
  • 下載時間不一,一般是凌晨1點後,到中午12才能用的也有。如果在預定的時間取不到數據,需要注意重試讀取。
  • 穩定性差。FTP伺服器出問題那是常有的事。渠道側解決方案往往就是重啟。所以重試機制是必要的。

看一下第三方支付的對帳單情況:

銀行直連的對帳情況:

技術選型上,HTTP(S)用apache httpclient即可實現連結池和斷點續傳, FTP也可以使用Apache Commons Net API。 但不管是哪一個,都需要設置重試次數和連結超時間。重試次數和間隔的設置需要小心,重試太頻繁,容易把伺服器打死.;時間間隔太大,又會阻塞後續處理步驟。5~10分鐘是一個合適的重試間隔區間。

連結超時指在伺服器出現問題時,連接在指定時間內獲取不到數據即自動斷開。這個很容易被忽略。我們有一次系統出問題,是渠道側的FTP假死後重啟,導致我們的客戶端掛住,一直在等待重新連結。

渠道對帳單標準化

找個例子大家看看, 比如微信的對帳單,他是csv格式的,包括如下信息:

  1. 交易時間:這是在微信側的支付完成的時間。 這個時間會成為一個陷阱。
  2. 公眾帳號ID,商戶號,子商戶號,設備號: 這些信息需要做驗證,確保是自己的單子,不要讓微信把老王家的單子也給發過來了;
  3. 微信訂單號,商戶訂單號: 這兩個是對單的核心。前者是微信側產生的訂單號,在微信支付接口返回值中有。但是萬一收不到這個返回值,那在本地記錄中可能就空了。 後者是我們發送給微信的訂單號,一般用這個來做對單依據。兩邊的數據中都會有這個值。
  4. 用戶標識,交易類型,交易狀態,付款銀行,貨幣種類,總金額,企業紅包金額: 這幾個就是對單的核心欄位,必須確保雙方是一致的。
  5. 商品名稱,商戶數據包,手續費,費率:這些是可選驗證。

而某寶的對帳單,是文本格式的,用空格隔開。他們家的就簡單很多,只有商戶訂單號,交易流水號,交易時間,支付時間,付款方,交易金額,交易類型,交易狀態這些欄位。

由於每個渠道的帳單格式都不盡相同, 在得到帳單後,下一步是對帳單做標準化處理,這樣軋帳以及後續工作就可以統一處理了。 標準化後的帳單數據可以放在文件系統或者資料庫中。這取決於交易數據量。每天百萬以上的量,還是使用文件系統,比較合適。資料庫操作相對比較慢,也浪費資源。

基於文件系統的標準化涉及如下內容:

  • 文件格式標準化:統一使用csv或者json或者xml格式。如果是使用hadoop或者spark來對帳,使用csv是個不錯的選擇。
  • 文件存儲統一化:文件目錄,文件名都需要遵循統一命名規範。

為了加快處理速度,我們使用hdfs作為文件系統,有利於後續的對帳的處理。

本地交易記錄準備

本地交易記錄的準備,總的來說有如下方法: – 啥都不做,直接用原始數據。鑑於大部分系統使用的是mysql,這也意味著在MySQL上做對帳。對帳時需要大量的數據查找工作,必然會影響線上業務。在數據規模較大,比如超過100萬時,就不太合適了。

  • 當然,還有一個選擇是使用備庫來執行對帳,這樣既簡單,也不影響線上業務。這是典型的空間換時間的做法。
  • 如果業務大到需要分表分庫才能處理,那對帳數據準備也不一樣。使用分庫也不現實,因為分庫一般是按照主體id,而不是渠道id,來分庫,這樣對帳就需要在多個庫上進行,效率反而降低了。而對分表分庫建立從庫也非常耗費資源。這種情況下,需要同步一份數據到(hdfs)文件系統中,或者NOSQL資料庫上。

由於交易記錄是支付系統核心數據,有大量的應用,如信用、風控等,都需要交易記錄數據。這些應用對交易記錄的需求還不完全一致,為了提升性能, 交易記錄會使用異步的方式來將數據投遞給使用方。 交易記錄在入庫時,投遞消息到消息系統中。使用方監聽這個消息,一旦收到新消息,則從交易記錄庫中查詢數據,獲取數據並更新到庫中。關於此類數據同步的文章不少,這裡就不詳細介紹。

軋帳

軋帳是按照客戶訂單號來比較本地交易記錄和渠道交易記錄是否一致。從算法角度,是計算兩個數組的差異。在單機運行時,可以採用的算法不少,這裡不詳細介紹。 我們推薦採用mapreduce來軋帳,這有個優勢,可以按照訂單號將渠道提供的記錄和本地記錄shuffle到同一個reduce處理上,這樣就可以很容易進行數據比對。 軋帳中最大的坑,莫過於切分點的問題。

比如以整0點為切分點,那存在一個問題,本地23:59發起的交易,到了渠道側,可能會在00:01處理,這一筆交易變成第二天的帳了。實際處理中,一筆交易在渠道側處理,花上幾分鐘都有可能。 對於切分點附近無法確認的帳,做一個時間窗,在時間窗內的數據,留待第二天對帳時繼續處理。

平帳

發現兩邊不一致的數據,那應該如何處理?數據量不大時,記錄起來,人工甄別就行。但如果數據量很大,每天上千條,人工處理就成本太高了。這個沒有統一的處理方法,需要根據有問題的數據,做個分析,然後做自動處理。 針對交易記錄的對帳的處理,主要有如下情況:

  • 本地未支付,支付渠道已支付。這主要是本地未正確接收到渠道下發的異步通知導致。 一般處理是將本地狀態修改為已支付,並做響應的後續處理,比如通知業務方等。
  • 本地已支付,支付渠道已支付,但是金額不同,這個需要人工核查。
  • 本地已支付,但是支付渠道中無記錄;或者本地無記錄,支付渠道有記錄。在排除跨日因素外,這種情況非常少見,需要了解具體原因後做處理。

針對退款的對帳處理,主要有如下情況:

  • 本地未退款,支付渠道已退款,則以支付渠道為準,修改本地為已退款狀態,並觸發後續處理。
  • 本地已退款、支付渠道已退款,但是金額不同,需要人工核查;
  • 本地已退款,但是支付渠道無記錄;或者支付渠道有記錄,但是本地沒有。 在排除跨日因素外, 這種情況非常少見,需要了解具體原因後做處理。

總之,對帳工作,即複雜也不複雜。需要細心,對業務要有深入的了解,並選擇合適的架構。

相關閱讀

支付系統設計:支付系統的帳戶模型(一)

 

作者:鳳凰牌老熊,程式設計師 & 架構師,來自中科大的本科,研究生在軟體所學習。先後在中科輔龍、三星(中國)研究院和國內一些大型的網際網路公司呆過。在中科輔龍公司負責電子政務內容管理系統建設,負責研發龍馭系列產品的研發,這款產品最終實施到2000多個電子政務網站上,期間也參與了一些支付反洗錢以及支付系統的建設。之後在三星中國研究院,負責自然語言處理(NLP)以及智能家居相關項目。智能家居項目在2014CES消費電子展上作為三星重點項目推介。2014年開始加入愛奇藝公司,負責數據倉庫和支付系統的建設。

本文由@鳳凰牌老熊(微信公眾號:shamphone) 原創發布於人人都是產品經理 。未經許可,禁止轉載。

相關焦點

  • 支付系統設計:對帳處理二
    交易渠道側,這是對帳的重點,一是核實交易流水,二是核實交易佣金,畢竟是租用人家通道做結算的。那有哪些記錄需要對帳? 目前主要是兩個:一個是交易記錄;一個是退款記錄。對帳處理流程一般來說,對帳流程涉及到如下步驟: 渠道對帳單下載、本地交易記錄準備、軋帳、平帳。渠道對帳單下載銀行、第三方支付、銀聯等,基本都會提供對帳單下載的功能。
  • 如何設計一套支付系統-對帳模塊
    整個支付系統可以被拆分成了多個子系統,如交易系統、帳戶系統、會計系統、帳戶系統,每個子系統在處理各自的業務並記錄,其實就相當於會記理論中的帳簿。系統間的對帳,主要用於修正內部系統的數據不一致。3)帳實核對:是各項資產物資的記錄數值與實際真實數額間的核對。
  • 支付系統中,帳戶體系的設計與記帳處理
    帳戶體系和會計的設計是整個支付系統的底層基礎,是支付系統在基礎支付服務的基礎上,為個人用戶及企業商戶提供的對於資金收、付、管的服務。(4)清結算算系統交易清分,算出給每個帳戶打多少錢,同時從每個帳戶收多少錢;交易結算出款:調用銀行/通道代付接口,自動出款。對帳:核算通道與支付系統的應收應付。
  • 電商平臺是如何與多家支付公司對帳的?
    本文以電商為例,講解商戶如何與多家支付公司對帳。一、為什麼要對帳?對帳其實是對一定周期內的交易進行雙方確認的過程,一般都是在第二天第三方支付公司對前一日交易進行清分,生成對帳單供電商平臺下載,並將應結算款結算給電商平臺。
  • 訂單系統:財務收入對帳
    關於收入部分的對帳由於財務收入的對帳與產品設計的訂單系統、交易系統是息息相關的,本篇文章以描述收入部分業務訂單與交易資金對帳時會計流程與核對內容為主,為產品經理在設計訂單系統、交易系統或對帳平臺欄位設計和定義時提供一些參考。關於收入資金對帳:是將系統保存的訂單流水和銀行返回的清算流水行對帳。
  • 支付清結算之帳戶和帳務處理
    在按月、季度和年作為會計周期時也採用類似的方法處理。 除了日切是必須的,其它時間段的處理是根據財務需要來實現。在實現上,帳戶的各個屬性更新時間並不一致,所以在設計帳戶表的時候,可以按照更新時機來劃分表。
  • 如何設計進銷存系統的財務模塊(2)——對帳與報表
    編輯導語:進銷存系統是為了對企業生產經營中進貨、出貨、批發銷售、付款等進行全程進行(從接獲訂單合同開始,進入物料採購、入庫、領用到產品完工入庫、交貨、回收貨款、支付原材料款等)跟蹤、管理而設計的整套方案。接下來,本文作者為我們講解了如何設計進銷存系統的對帳與報表。
  • 詳解:支付清結算之帳戶和帳務處理
    正文開始前可複習《支付清結算之基本概念和入門》和《支付清結算之渠道側處理》,以便理解這裡的流程。一、帳戶體系在設計清結算系統前,首先需要完成帳戶體系的梳理。 帳戶是用來記錄會計科目所反映的業務內容的工具,它根據會計科目來開設的。 帳戶有多種維度的分類。
  • 電商交易系統:財務記帳與對帳思考
    以上三點,前兩點是目前帳戶系統就有的功能,要實現第三點功能,首先需要建立一套完備的帳戶體系二、帳戶系統結構我認為就電商交易來看,一套完備的帳戶包括:收入、成本、費用、庫存、應收、應付、實收,實付幾大類帳戶。
  • 支付系統功能介紹:商戶清結算
    為了滿足商戶需求,第三方支付系統一般支持D+0結算方式,又稱為實時到帳,先結算後對帳,需要第三方支付系統墊資,第三方支付系統風險較大,商戶支付手續費較高。支付階段第三方支付機構的作用:風險管理,風險企業,風險支付訂單控制;支付處理,根據支付接口,組織支付請求,將支付結果及時通知商戶,支付方式的選擇,支付通道(銀行)的選擇;結算處理,支付手續費的計算,結算金額的計算,結算金額的累積。
  • 支付系統設計:應用內支付(五)
    ,和微信支付、支付寶相比,還是有一定差距的,但是為什麼要開發應用內支付呢?用戶訪問AppStore時使用的是Apple的帳號,不是應用系統的帳號。也就是說,我們並不知道到底是誰在購買這個內容。比如在應用中有兩個帳號A和B,用A帳號登錄後,上IAP買了東西,然後用B帳號來登錄,也上IAP買東西, 這兩次購買,用的是同一個Apple帳號。蘋果也不會告訴你,到底是哪個帳號付了錢。帳號坑在單次購買中還沒什麼問題,但碰到訂閱的情況,得好好處理下。
  • 電商後臺:財務對帳系統總結
    enjoy~進入這家公司做的第一個項目就是財務對帳系統規劃,當時對公司業務還不是特別了解,只是根據業務的需要梳理了一期的功能點;大概了解了財務對帳的流程,就秉著能解決釋放人力的想法開始做原型。因為不了解業務,也在該項目進行的過程中發現了無數的坑,不過也是因為這個項目,讓自己真正了解了公司的很多業務;也開始對各個系統逐步都有了深入的了解。
  • 支付系統詳解(上篇):帳務系統
    相應的,帳務系統本身也可以分成針對外部帳戶的帳務系統和會計系統,這樣的設計可以更快的實時的響應用戶帳戶資金的變化。不過這裡還是以兩者合一的帳務系統為例,雖然本質上沒有什麼區別,但個人覺得這樣更為貼合記帳的實際情況。
  • 財務系統:資金對帳(一)
    每月關帳前,都會進行對帳,每次對帳都會持續一周,混亂爆肝的一周。由於公司業務多樣性,交易量大,線上線下業務都有;因此目前財務系統-對帳模塊分為門店對帳、大客戶對帳、資金對帳、收入成本核對等。本文主要分享資金對帳,資金管理相關的內容,包括資金流水的生成及核對還有日記帳的生成。
  • 紐西蘭跨境聚合支付系統介紹
    Merchant Service集合了支付API,支付網關通知及merchant portal的所有功能,是系統的核心服務;Trade Service為公司內部交易管理系統提供服務;Notify Service不是支付回調的通知服務,支付通知回調功能在Merchant Service中實現。Notify Service是用在微信公眾號通知商戶收到消費者支付。
  • 異步處理在支付環節的應用
    本文主要向初步接觸支付業務的讀者簡要普及同步與異步處理的基本概念、關於異步處理在支付環節的應用、支付系統向商戶通知支付結果時,為什麼要使用「異步通知」?異步處理方式在支付環節可能會產生的哪些問題?在產品設計上如何避免這些問題的發生?
  • 網際網路支付系統整體架構詳解
    業務流程上述操作,除了對帳、查單外,每個操作實現的主流程,一般會包括參數校驗,支付路由,生成訂單,風險評估,調用渠道服務,更新訂單和發送消息這7步,對於一些比較複雜的服務,還會涉及到異步同通知處理的步驟。
  • 中國支付清算體系(二) —— 大額實時支付系統
    前面文章我們說過,大額支付系統只是支付的「業務系統」,真正的資金轉移是在SAPS系統中完成的,那麼我們就直奔主題,看看大額支付系統到底能處理哪些具體的支付業務吧,先放一張圖看一下大額支付系統在哪兒。因為每天大額支付系統營業結束之後會讓銀行間拆借交易系統下載當日的拆借和歸還明細,用來做內部的對帳,你不標註,人家系統怎麼對帳?我們以出借方(拆出方)發起的借錢指令為例子畫一個簡單的流程圖(假設是招商銀行借錢給民生銀行),如下所示:
  • 財務對帳產品解決方案
    財務發現問題之後會聯繫孩子的班主任老師,在業務系統一查發現他的退費申請由於超時過期,退費申請自動關閉了。發現問題後需要採取措施,補退費記錄,對帳號做停課處理。3 設計思路其一,每個金融帳戶分開獨立對帳,指微信和支付寶其二,以金融帳戶數據為參照物,拿海豚業務訂單數據往上對齊其三,對帳不區分學科,學科是對帳完畢之後用來出財務餅狀圖的自動對帳是按照每日對帳,當天拉取前一日的微信和支付寶對帳單
  • 以在線教育公司為例,如何做一款財務對帳產品?
    筆者以一個虛構的在線教育公司的對帳業務為背景,分享了怎麼做對帳產品以及對應的設計要點。設計思路其一,每個金融帳戶分開獨立對帳,指微信和支付寶其二,以金融帳戶數據為參照物,拿海豚業務訂單數據往上對齊其三,對帳不區分學科,學科是對帳完畢之後用來出財務餅狀圖的二、對帳工作流自動對帳是按照每日對帳,當天拉取前一日的微信和支付寶對帳單,和海豚的前一日的業務訂單進行自動化匹配