詳解第三方支付之關於會計對賬
會計學有一個很重要和很出名的公式,相信很多人都見過:
資產 = 負債 + 所有者權益 + 收入 – 費用
但會計學上還有另外一個比較隱蔽的公式,雖然不像上面的公式那麼出名,但也經常能見到它(或者變種運用)的身影。
那就是,即期末值=期初值+期間變化值,也就是期末值=期初值+期間入-期間出。該公式非常簡單,也很容易理解,並且大量的用於計算和核對兩個前後時間點的會計值的關係,它明確的指出,期末這個點的值是由一系列變化而來的,變化來自兩個方面:
1,存量—即期初值;
2,增量—期間變化值。
任何期末值的多少必須由這兩部分變化而已,不能憑空捏造。
在賬戶中,我們也能夠經常看到:資產賬戶的借方餘額=期初借方餘額+借方發生額-貸方發生額。
那麼對一個賬戶來說,必須記錄兩個維度:餘額和流水,餘額記錄的是一個時間點的值,而流水則是反映一段時間內餘額變化的過程,兩者應該是一致的,即餘額的增減一定對應的流水入和流水出,流水入和流水出一定會引起對應餘額的增減,那麼,在實際的實現中,如何確保這兩者是一個事務呢?我們一般會使用db的單機事務去保障。
問題來了?既然我們已經通過事務去保障兩者的一致了,為啥還需要額外的會計對賬呢?必要性在哪裡?
從會計核算的角度看,雖然在具體的賬戶實現中,餘額和流水會在一個db事務的方式進行實現,但還是有必要在會計方面對餘額和流水進行二次對賬核對,目的是提供一個獨立的第三方核算機制,用於發現和核對資金的安全,如餘額被人為修改了,如人為增加100元,雖通過db簽名也能發現,但如果對應的流水沒修改,則可以通過會計核對後發現該問題。那麼如果對應的流水也被更改呢?那麼單獨對該賬戶的流水和餘額進行會計核對(我們稱為分賬戶核對)是無法發現問題的,會計恆等式還是成立的,那麼通過進一步的總賬戶核算也能發現問題(即每個使用者單獨的餘額和流水都是符合恆等式的,但加起來跟外部總賬是對不上的,如對應的銀行收款單,對應的商戶入賬賬戶等),會計核算系統正是需要從獨立第三方核算視角,建立一整套合規的,高效和健壯的系統,從分賬戶,總賬戶等進行多個級別的核算,確保整個第三方支付系統的資金安全。
那麼如何對賬呢?按照及時性的要求,我們分為T+1和準實時的對賬,下面分別介紹:
一, T+1對賬
即今天對昨天的賬,是按天增量對賬的一種,在日切點後,把落入日切點之前的當作昨天的賬目進行彙總核算,得到昨天的一個餘額,即昨日餘額。
在多系統中,一個難點是日切點的統一,在傳統銀行IT系統中,都有一套成熟的日切系統來負責協調各個系統的日切,而對沒有專門搭建日切服務的系統來說,也有一些簡單的處理辦法:如在業務入口點分配業務時間作為貫穿後續各個系統記賬的業務基準,這樣各個系統的流水均會以該業務時間為準,確保同一個時間點的流水在各個系統一定是在同一天內。另外一種方式是跨多一天核對流水,即雖然對賬的是昨天的流水,但會看前天和今天的,通過業務系統進行調整,然後按照其中一個為基準,重新記賬。
二,分鐘級的準實時對賬
一種好的方法是餘額欄位記錄一個事務流水號(流水號自增,通過流水號可以找到對應的流水),餘額和流水增量對賬根據流水裡面的事務流水號進行核對。
前面兩種辦法都存在一個困難:即由於系統餘額總處於交易中,因此餘額的值時刻在變化,很難捕捉某個時刻的餘額,然後和流水進行核對,那為了進行從會計核算層面獲得一個期初的餘額值,有什麼辦法嗎?
方法一:帳戶自動具備按天輪換的機制,這樣的機制本質是以空間換時間,通過兩個定時輪換的賬戶按天輪換來獲得期初的值,該辦法具有一定的操作性,但也帶有較多的風險,特別是個人的賬戶一般只能有一個賬戶,是不能進行隨意切換的,該辦法可以用在一些中轉類的賬戶。
方法二:時間片倒推,比如我們在00:30 拉取00:30的流水和餘額,然後把流水反向推到23:59(即流水一條條扣除直到時間點在00:00之前的流水),那麼23:59對應的餘額就作為期末餘額。
有了前面的辦法,那麼每天的核對其實就是在昨天的期初餘額基礎上,找到變動的部分,相加後得到期末餘額進行核對即可(新的一天,當前的期末餘額變成第二天的期初餘額),類似數學歸納法一樣,只要期初餘額是對的,那麼期末餘額的準確性就是判斷一天內的變動部分是否準確即可,而一天內的變動和核對是相對比較簡單的。