到底是校验什么数据?
对账就是校验数据。即校验数据是否相等。普通的校验数据,就是单个数据。现在,是多个字段,订单金额,等等。
数据来源?
一个是远程数据,即银行数据。一个是本地数据,即第三方支付数据。
数据基本上是一样的,就是基于订单号,去校验金额是否一样,这个是最主要的目的。
远程数据
从哪里来?
都是对账文件(可能不太格式,比如excel等等)。不同渠道可能不一样,一般就是两种方法:
1.银行——本地ftp(银行定时往第三方支付公司提供的ftp地址写数据)——第三方支付公司读ftp——本地库。
2.支付宝微信下载接口——第三方支付公司调用下载接口——本地库。
为什么要入本地数据?
因为每个通道的数据格式可能不一样(比如,字段名字不一样),为了对账系统服务可以统一处理,所以我们需要把数据转换为统一的格式,这个格式(其实就是表和字段),是我们自己定义的。

本地数据
从哪里来?就是定时任务,扫本地的数据。
数据量大小?
一般来说,每个银行的数据不会太多。哪怕你每天有百万级别的数据,但是具体到每个通道,其实数据是不多的。可能也就十万级别。
所以,对于数据量特别大的,基本上基于定时任务线程池 + 内存,就可以了。除非每天数据量有千万级别。
注:公司项目,百万级别。威富通,有千万级别。
架构图
定时任务-单线程

定时任务-多线程

代码
伪代码

代码解释
1.数据 // 1.远程数据集合 2.本地数据集合
2.校验数据 //是否包含
3.校验结果 // 有三种1.本地数据有,远程数据没有 2.远程数据有,本地数据没有 3.都有,但是金额不一致


校验数据
本地数据多了
最佳实践
一般来说,失败情况,最常见的是第一种。即本地数据多了,远程数据没有。原因是由于日切,即本地数据是头一天,到了远程数据,就成了第二天的数据。
如何解决?看代码。

核心思想,是基于取最近几天的数据,而不是只是头一天的数据。
远程数据多了
对端多账的产生情况可能可能有两种情况。
1.第一种情况测试环境与生产环境共用一份第三方渠道参数,这就导致测试环境交易订单也会出现在对账单中。若是这种情况,我们确认测试环境存在这批数据之后,我们忽略这批差异数据即可。//测试环境,用了生产环境的商家号
2.第二种情况,本端交易订单存在,但是状态不是成功状态。这种情况下,需要调用第三方渠道提供的查询接口,查询订单最终状态。若查询成功,更新订单状态,然后将差异数据状态更改为处理成功。
若第三方渠道无法查询到订单的状态。这种若与渠道确认订单最终支付成功,我们需要将支付订单改为支付成功,并修改差异账的状态。//本地数据,支付状态是未支付。怎么办?1.调用查询接口,成功就更新为支付成功。2.失败,人工确认数据是否成功,人工手动修改为支付成功,在总后台。
最后我们再次重新对账,由于对端多账的数据会有对应的本端数据,将不会产生差异数据,这次对账完成且平账。
金额不一致
以远程数据为准。
参考
tech.youzan.com/practice-of… //有赞。电商公司对账系统。比较复杂。因为数据量比较大。数据量千万级别/天。
juejin.cn/post/684490… //有细节,代码说明。属于中小支付公司的解决方法。数据量百万级别/天。//引用的文章,写的也比较好。
mp.weixin.qq.com/s/SOpwMsVB5… //有代码示例