对账系统

对账系统 #

业务需求 #

  • 双向对账。先以平台方数据为基准,再以渠道方数据为基准。
  • 总账结合明细账。总账平不代表明细账平,业务系统刚上线时可以直接对明细账。进入平稳期后为提高对账效率,可以先对总账,不平后再对明细账。
  • 对账依据:
    • 平台方信息流数据与资金流数据进行对账。
    • 平台方资金流数据与渠道方资金流数据进行对账。
    • 平台资金流数据与平台账户余额数据进行对账。
  • 对账方法
    • 只实时对账。对账成功的数据成为待清算数据。
    • 只批处理对账。对账成功的数据成为待清算数据。
    • 实时对账+批处理对账。实时对账防止出金资损,批处理对账做兜底保护。批处理对账成功的数据成为待清算数据。

实时对账 #

消息队列实时对账 #

  1. 实时通过消息队列获取平台支付订单。
  2. 调用渠道接口实时获取渠道交易结果。
  3. 将支付订单信息和渠道交易结果进行对账,对账成功的数据作为待清算数据。
    • 渠道返回交易成功:
      • 金额不一致,对账失败,记为差错记录,等待人工处理。
      • 金额一致,
        • 支付系统返回成功,对账成功,支付数据可作为待清算数据。
        • 支付系统返回失败,对账商标,记为差错记录,等待人工处理。
        • 支付系统返回处理中,对账成功,自动纠错,更新支付数据为交易成功。
    • 渠道返回交易失败:
      • 支付系统返回成功,对账失败,记为差错记录,等待人工处理。
      • 支付系统返回失败,对账成功。
      • 支付系统返回处理中,对账成功,自动纠错,更新支付数据为交易失败。
    • 渠道返回交易不存在:
      • 对账失败,记为平台长款,等待人工处理。
  4. 按清算周期生成商户对账文件,推送给商户。
  5. 根据对账文件和商户进行结算。
  6. 提供异常单查询功能供商户查看未及时进行结算的交易。

Flink实时对账 #

同时读入两条流的数据来做合并处理。利用connect将两条流进行连接,然后用collect进行处理或者使用join。

分布式实时对账 #

  1. 各交易流水同步到实时对账系统。
  2. 调度器根据流水号分片,将新对账任务交给分区对账节点。
  3. 对账节点扫描交易发起方和接收方的记录数据,生成对账结果。为了防止主从延迟,接收到对账请求后延迟一段时间后再执行。

批处理对账 #

存疑帐,缓存数据表

差集对账 #

  1. 利用pipeline功能将平台方支付数据(流水号+交易金额)批量插入Redis的Set中。
  2. 利用pipeline功能将渠道方支付数据(流水号+交易金额)批量插入Redis的Set中。
  3. 以平台支付订单为基准,利用sdiff,找出平台方差集。
  4. 以渠道方支付订单为基准对账,利用sdiff,找出渠道方差集。
  5. 根据差集结果区分金额不一致、平台方长款和平台方短款。

HashMap对账 #

  1. 利用Hmset将平台方支付数据(流水号+交易金额)批量插入Redis的Hash表中,key=流水号。
  2. 利用Hmset将渠道方支付数据(流水号+交易金额)批量插入Redis的Hash表中,key=流水号。
  3. 以平台支付订单为基准,获取渠道方Hash表中的数据,进行对比。
    • 金额一致,对账成功,删除双方Hash表中的数据。
    • 金额不一致,对账失败,记为差错记录,删除双方Hash表中的数据。
    • 渠道方不存在,对账失败,平台长款,记为差错记录,删除渠道方Hash表中的数据。
  4. 检查渠道方Hash表中是否还有数据,还存在的数据记为平台短款,记为差错记录。

滚动对账 #

  1. 平台方数据和渠道方数据按流水号有序保存在数据库中。
  2. 从平台方数据和渠道方数据中各取N条数据。
  3. 从第1条开始对比,流水号和金额都一致则双方游标向后滑动一条记录。
  4. 金额不一致则记为差错数据,转人工处理,双方游标向后滑动一条记录。
  5. 流水号不一致,较小的一方记为差错数据,转人工处理。较小一方的游标向后滑动一条记录。
  6. N条数据用完后,再取N条数据放入内存中,重复对账过程。

哈希对账 #

可以节约对账文件的传输时间。

  1. 渠道方将数据按批次划分,划分依据可以是累计N个交易或N元。
  2. 渠道方对某一批次的数据进行hash计算。如果数据较多,可以对该批次进行分片,计算出一组hash值。
  3. 渠道方将hash值发送给平台方。
  4. 平台方使用同样算法从数据库抽取数据进行计算。
  5. 双方hash值一样则对账成功。否则要求渠道方发送对账文件。

基于数据库变更对账 #

  1. 在对账系统录入对账任务和过滤器。任务可以是Grooy脚本,参数为data1和data2,脚本经过解析后保存到Redis中。
  2. 利用canal获取数据库变更记录,推送到消息队列上。
  3. 对账系统消费消息,从Redis中获取最新的过滤器后,对数据进行过滤,过滤条件可以是insert、update、delete,或者某列为特定值等。
  4. 对账系统从Redis中获取对账任务缓存。
  5. 执行对账任务。
沪ICP备17055033号-2