一、什么是对账?
对账作为会计学习中重要的一环,一般发生在记账之后,结账之前。在我们的日常测试中,基本上各个项目都包含了 对账 这一重要部分,有的是月度对账,有的是日总对账,也有的是小时段对账,甚至年终决算时还有年度对账。那么,什么是 对账 呢?我们来看一下下面这个场景,你一定不陌生:
我们每天早上在公司楼下路边摊买完一份早餐,然后用微信/支付宝扫码支付了 5 元。你跟老板说支付了 5 元,甚至给老板看一下支付结果,又或者老板的大音响发出“收到 5 元”的提示,老板一看手机确实收到了 5 元的进账,然后交易结束。整个过程,你说支出了 5 元,老板说收到了 5 元,这就是一个简单的 对账 过程。我们经常使用微信或者支付宝就会发现,微信钱包功能中,每个月会统计月度账单,支付宝或者淘宝每年会有年度账单汇总,我们拿到汇总账单,可以和当前统计时段中每一笔详细交易做对比,这也是做 对账。
二、为什么需要对账?
那么我们为什么需要对账呢,正常情况下我们扫码支付完早餐钱,不是可以直接拿着早餐就走了吗?那你也一定遇到过这种场景:你的手机显示支付完成,老板那边的大音响迟迟没有发出收到支付款的提示,这个时候这笔交易存在疑问的时候,就是 存疑数据。对账系统就是要及时发现这些存疑数据,找出存疑数据,生成差错数据汇总,然后系统或者业务人员根据这些差错数据报表及时进行干预处理,确保两方的账务交易正确一致。
三、对账系统
一个简单的对账系统主要可以分为四个大的部分:本地数据处理模块,第三方数据处理模块,账务核对处理模块,差异数据处理模块。
3.1 第三方渠道数据处理
第三方渠道数据主要是以文件的形式进行交互下载,通常对账过程中,会以第三方渠道推送过来的对账文件为准。文件类型主要有TXT,csv等类型,获取方式主要有定时推送,接口调用传输,人工下载等,其中人工下载效率最低。
通常第三方推送过来的对账文件内容也不尽相同,从文件路径,文件名,文件头,文件详细记录等,都有一定的规范和约定。但是一些必须的字段基本都是包含在内的如:
- 商户号;
- 订单号/交易流水;
- 账户号;
- 交易日期;
- 交易金额;
- 交易状态;
- 原订单号;
- 备注等;
3.2 本地数据处理
本地数据处理主要指的是我方流水数据记录汇总处理。按照一定的时段、规则对数据库中的数据进行查询汇总,为了减少数据库和后续对账的压力,这里一般只需要对核对的字段进行提取组合,无需提取整条流水记录。
3.3 数据核对处理
数据核对处理部分,就是将我们上述经过处理得到的两部分数据,进行差异对比。这里经对比通常会出现以下几种情况:
- 本地系统数据有,对方文件数据无,我们称为 本地有,三方无;
- 本地系统数据无,对方文件数据有,我们称为 本地无,三方有;
- 本地系统数据有,对方文件数据有,但是金额或者某个字段存在差异;
- 本地系统数据和对方文件数据一致,通常称为 平账;
我们经过特定的 规则,把两方数据记录进行比较核对,筛选出 平账 以外的 存疑 数据,然后把这些数据存在另一张表中,这通常是diff差异表。差异表中的数据存储起来便于后续继续处理(如有的项目会在规则允许的时效内,把这一部分 存疑 数据捞起继续进行核对处理)。核对处理的方式也是多种多样,有的项目会自己写一套核对规则放在系统中进行对账处理,也有的项目因为需要处理的数据量庞大,选择接入大数据进行处理操作。
3.4 差异数据处理
首先我们简单讲解一下为什么会有差异数据,还是以支付为例,像每年的双十一,双十二,这种发生交易量巨大的时刻,通常产生差异数据的情况是很多的,比如2021年11月10日23:59:50的时候,你输入完支付密码,这个时候一般会有短暂的转菊花的界面(假设此时系统没有崩,服务器正常),大约数秒后,会返回一个对钩显示支付成功/完成,那么本地会认为这笔交易发生的日期是2021年11月10日,通常trans_data字段会存 20211110,当这笔交易传送到第三方渠道记录时,时间可能已经是2021年11月11日00:00:03,那么在第三方渠道数据库中,这笔交易的trans_data字段会存20211111,可以发现同一笔交易,在两方的标记交易时间是不一致的,前后会差一天(这里我们默认日切时间为每天0点,也有系统的日切时间为每天15点,暂不考虑非工作日),当取数据完成每日对账时,必然会有一天存在单边数据。除了这种日切问题造成的单边数据差异外,造成单边数据情况原因还有可能是网络波动,数据环境原因(一方的测试/灰度等公用)等。
对于差异数据的处理,在对账后这些存疑数据通常会被放到diff差异表中,存疑,不代表 错误,这里我们要注意甄别。我们只是对这笔交易暂时存在疑问,不做定论,相当于挂起,我们再过一天(也有两天、三天)继续尝试将该笔数据捞起进行对账。如果超过规定的时间,假如连续三天都没有对上,那么这笔数据通常会被标记为 超时失效 的状态(具体项目差异处理)。
四、对账测试要点
现在对对账有了一个简单的了解,那么从测试的角度如何进行测试呢?这里我们可以通过将对账按照上述的几个模块进行划分测试,即本地数据测试,第三方数据测试,对账场景测试,差异数据处理落库测试等。
第三方数据通常来源第三方,我们只能模拟造一些虚拟数据,但是为了对账合理性,这里我们以本地交易数据为基准,根据一定地格式和名称,模拟生成第三方给过来的待对账的文件。本地数据则来源于我们通过接口报文发起的交易数据,两方数据均有了后,开始埋数,结合后续对账会出现的场景,通常我们增删修改本地数据来模拟在对账过程中会出现的差异情况。数据埋好后,开始进行对账处理测试,处理完成后,检查对账结果,明细,差异数据等。
简单来说有以下几点:
- 待对账数据提取加工验证;
- 待对账文件格式、内容、路径、空文件验证;
- 对账处理字段比对,相同差异处理等验证;
- 差异数据落库处理验证;
- 一些异常场景如:对账批次中断,续作,失败重做,空批处理,非终态交易记录处理,历史数据对账等;
小技巧:
- 数据库中的数据,前后状态保存备份,便于比较变化;
- 大数据抽数任务,善于查看日志,便于定位抽数逻辑,抽数表;
- 重跑时记得清理上一次的结果,删除语句及时注释掉,防止勿删;