MySQL表对账设计_从零开始设计对账系统
前言
对账系统作为支付系统中的基石系统,处于整个支付环节中的最后一层,主要用来保证我方支付数据与第三方支付渠道或银行的数据一致性。
在没有对账系统之前,财务在第二日手工核对前一日的应收与实收。倘若不一致,这就需要一一核对数据,找出不一致的数据。对账系统出现之后,就可减少以这种繁琐手工操作,财务只需要每天关注系统的对账记录,释放了生产力。
本文主要结合实际的项目经验,聊聊对账系统的设计方案。
系统整体设计
对账系统设计主要分为以下四个模块:
渠道数据处理模块
数据处理模块
核对模块
差异数据处理模块
模块调用顺序层次图如下。
下面先来介绍渠道数据处理模块。
渠道数据处理模块
这个模块主要负责渠道对账文件的下载,解析,以及数据落库。
目前市面上第三方支付渠道对账文件下载方式主要分为以下几类:
第三方渠道定时推送到 SFTP/FTP。这种模式比较简单,我们定时从 SFTP/FTP 取对账文件。
调用第三方渠道对账文件下载接口。这种模式需要对接渠道下载对账文件接口,定时调用下载。支付宝与微信为该模式。
手动在支付渠道网站下载对账文件。这种模式最不友好,需要我们花费人力下载文件。
除了下载方式,对账文件的格式也会存在一些区别。比如支付宝对账文件格式为 csv,而微信的对账文件格式为 txt,另外有些渠道为 xml,xls。
第三方渠道对账文件里面字段数量以及字段名称也存在不同。
一般这一层每接入一个渠道需要专门根据这个渠道特性开发。这一层可以抽象化接口,对外暴露下载与解析接口。每次接入渠道,实现该接口相应方法即可。
这一层开发难度不大,只要根据对账文件格式相应解析文件即可。一般需要提取对账文件里面信息如下:
商户号
商户订单号
渠道流水号
交易日期
交易金额
手续费
退款原订单号
下面说一下开发这一层需要注意的一些细节。
1、同一渠道若申请了多个商户号。这种情况下,每个商户号若前一日都存在交易,第三方渠道会为每个商户号都会产生一份对账文件。所以这里系统设计时候需要考虑到多份对账文件处理的情况。
2、对账文件需要考虑重复下载的情况。一般情况下,渠道的对账文件一旦生成,就不会改变。但是第三方渠道也可能发生异常,导致我方收到对账文件数据不完整。这种情况下,需要有机制重新下载解析入库。
3、每个第三方渠道下载文件时间都不一样。
数据处理模块
讲完对账文件处理模块,我们来看数据处理模块。
这个模块主要用来提取我方前一日所有支付成功的流水数据以及上一模块入库的前一日对账单的流水数据。为了减少数据库的压力,提取的数据只需要包括必要字段即可,无需将整行数据信息都提取出来。一般来说只要需要提取交易时间,金额,交易订单号,渠道返回流水号。
这一层主要就是数据库的查询行为。最好使用备库进行数据查询。因为这里我们需要提取前一日全量的支付成功的数据,数据量大的情况下,可能会拖慢主库,影响在线的支付交易。
核对模块
这一个模块我们使用上一模块提取出来的数据,核对订单号与金额是否完全一致。核对模块伪代码如下。
这个过程可能产生三类差异数据。
第一种情况为本端数据存在,对端数据不存在,我们称为本端多账。
第二种情况为对端数据存在,本端数据不存在,我们称为对端多账。
第三种情况为金额不一致。
三者如图所示。
这里产生的差异数据存入一张差异表中,以便下个模块使用。
差异数据处理模块
这个模块主要用来处理上个模块产生的差异数据。
上面三类差异数据中,金额不一致相当少见,这种情况需要人工判断。
我们先讨论本端多账的情况。
本端多账是对账系统最常见的一种情况。这种情况可能由于交易的时候发生日切问题,导致双方记账日期不一致,从而发生不平账。
我们先解释日切的概念。
日切,通俗的来说就是更换系统记账的时间,系统从当前工作日切换到下一工作日。这个过程中,若我方的交易订单刚好发生在 T 日 23:59:59,那么我方的记账时间为 T 日。第三方渠道接收到订单的时间为 T+1 日 00:00:01,这样第三方渠道该笔的交易的对账日期为 T+1 日。
第三方渠道 T 日对账文件将缺少这笔,但是我方 T 日数据却存在这笔,这就导致了核对过程中产生一笔本端多账差异数据。
对于这类差异数据,我们可以选择将这笔数据挂账,等待 T+1 工作日对账。T+1 日对账的时候,对账单会相应多出数据,这样在核对过程就会产生对端多账的差异数据。
然后在 T+1 日差异处理模块将前几日差异数据都提取出来,逐笔核对本端多账数据与对端多账数据。若核对一致,将两笔差异状态都更新成处理完成。最后若无剩余差异数据,当天账单平账。
伪代码如下:
对端多账的产生情况可能可能有两种情况.
第一种情况测试环境与生产环境共用一份第三方渠道参数,这就导致测试环境交易订单也会出现在对账单中。若是这种情况,我们确认测试环境存在这批数据之后,我们忽略这批差异数据即可。
第二种情况,本端交易订单存在,但是状态不是成功状态。这种情况下,需要调用第三方渠道提供的查询接口,查询订单最终状态。若查询成功,更新订单状态,然后将差异数据状态更改为处理成功。
若第三方渠道无法查询到订单的状态。这种若与渠道确认订单最终支付成功,我们需要将支付订单改为支付成功,并修改差异账的状态。
最后我们再次重新对账,由于对端多账的数据会有对应的本端数据,将不会产生差异数据,这次对账完成且平账。
系统优化
目前系统的对账系统定时任务采用 Spring 定时功能。后期优化准备接入 elasticjob 这种分布式定时调度程序,可以做到快速修改定时任务的时间,而无需重启程序。以及可以快速触发定时任务。
总之,对账系统工作不难,就是细节比较繁琐,前期很难将所有细节都考虑完全,这个过程需要我们不断改进。
推荐阅读
MySQL表对账设计_从零开始设计对账系统相关推荐
- qq空间网页设计_网页设计中负空间的有效利用
qq空间网页设计 Written by Alan Smith 由艾伦·史密斯 ( Alan Smith)撰写 Negative space is a key design element that y ...
- android课程设计健身,健身软件课程设计_毕业论文设计.doc
健身软件课程设计_毕业论文设计 通信建模与仿真课程设计文档 健身日记 小 组 名: wingman 小组成员: 肖键 潘凌 周治杰 何朝云 2015年07月03日 Communication Mode ...
- 服装设计_服装设计网_服装设计图_服装款式图-POP服饰流行前线
服装设计_服装设计网_服装设计图_服装款式图-POP服饰流行前线 服装设计_服装设计网_服装设计图_服装款式图-POP服饰流行前线 posted on 2015-02-10 20:15 lexus 阅 ...
- 是先设计mysql表再进行php代码_MySQL设计与开发规范_MySQL
1 目的 本规范的主要目的是希望规范数据库设计与开发,尽量避免由于数据库设计与开发不当而产生的麻烦:同时好的规范,在执行的时候可以培养出好的习惯,好的习惯是软件质量的很好保证. 2 适用范围 本规划的 ...
- web大屏展示用到的组件_从零开始设计数据大屏—基于Vue
为什么要做数据大屏? 现如今的大数据逐渐发挥出了它的力量,并无形的改变着我们的生活.但大数据在不是从事技术开发的人来说没有很明显的感受,很多人对大数据的概念只是停留在每年网易云音乐对个人听歌的汇总上. ...
- ui界面颜色设计_界面设计ui的颜色基础
ui界面颜色设计 重点 (Top highlight) Color is a sensory impression that the eyes perceive from the light, tra ...
- 反馈页面设计_获得设计反馈的艺术
反馈页面设计 I'm going to assume that you already know the importance of sharing work early and often to g ...
- mysql 表 区 块 页_数据库 | 001-MySQL梳理系列(一)
MySQL基本组成 SQL执行流程 Server 层主要包括连接器.查询缓存.分析器.优化器.执行器,包含了MySQL主要的很多核心功能,以及所有的内置函数.存储过程.触发器.视图等,其实就是所有跨存 ...
- 壳体花纹怎么设计_换热器设计大全
首先借此机会在这个平台上恭祝大家新年快乐!希望每一个从事压力容器设计的朋友都能通过自己过去一年的努力在2021年里加薪.升职. 2020年整体一年工作都比较忙,公众号内容更新得比较少,但还是获得了不少 ...
最新文章
- Android 6.0 变更
- php缩紧空格,使用php-cs-fixer修复PHP代码文件的缩进
- Mockito –带有注释和静态方法的额外接口
- 塔罗牌第五张是什么牌_塔罗牌四季牌阵:冬至将至,快来看看未来这三个月运势如何?...
- 代码分析 | 单细胞转录组clustering详解
- 深度学习中的损失函数如何画图_如何用深度学习来做检索:度量学习中关于排序损失函数的综述(1)...
- java数据库编程之JDBC
- Android 图片相关整理
- Spring4-使用组件过滤器
- HBase Java API类介绍
- linux /windows 基础篇
- Windows系统盘瘦身
- lsdyna如何设置set中的node_list_如何使用定速巡航功能 图文解说一看就会!
- html怎么给图片加页码,在Word里,怎样让页码显示在插入的图片上?
- Stata:边际效应分析\交乘项的系数含义和图示
- 第十二届蓝桥杯 ——双阶乘
- 如何让游戏手柄joystick的按键映射键盘keyboard按键,方便不支持手柄的pygame游戏可以通过简单设置后用手柄进行操控
- 移动护理C位出道,ip中的vip。
- CMake 与Ninja 组合的关键点
- Filmic Tonemapping Operators
热门文章
- SONOS 无线音响配置思科交换机
- SQL Server中的数据字典
- 三天入门Linux,掌握Linux基本操作(1)
- SWPUACM招新考核题解
- 《Python编程:从入门到实践》_3章:列表简介
- #科技 #资讯 #生活 RTX 4080显卡在欧跌破建议零售价, 小鹏回应自研电池, Meta因泄漏超5亿用户资料被罚款 ,黑猫投诉开启2022“你我同心 反诈同行”系列活动,这就是今天的其它大新闻
- 2020年的618快来了,电脑该怎么选
- malloc分配内存的实现中brk和mmap的区别
- Maven 最全教程,看了必懂,99% 的人都收藏了!
- python面试题-输入一个由n个大小写字母组成的字符,按Ascii码值从小到大排序,查找字符串中第k个最小Ascii码值的字母