资讯 业界
此为临时链接,仅用于文章预览,将在时失效

支付系统设计:对账处理(二)

作者:人人都是产品经理
2016/12/08 17:51

每一笔交易,都要做到各参与者的记录能够吻合,没有偏差。对账系统的工作,是发现有差异的记录,即轧帐;然后通过人工或者自动的方式,解决这些差异,即平帐

对电商系统来说,每一笔交易,在所有相关主体侧都要能对得上:

那有哪些记录需要对账? 目前主要是两个:一个是交易记录;一个是退款记录。

对账处理流程

一般来说,对账流程涉及到如下步骤: 渠道对账单下载、本地交易记录准备、轧账、平账

渠道对账单下载

银行、第三方支付、银联等,基本都会提供对账单下载的功能。不过也有少数工作做不到位或者太到位的银行,只提供账单查询后台,不提供对账单下载功能。

对开发人员来说,这里有几个坑:

看一下第三方支付的对账单情况:

支付系统设计:对账处理(二)

银行直连的对账情况:

支付系统设计:对账处理(二)

技术选型上,HTTP(S)用apache httpclient即可实现链接池和断点续传, FTP也可以使用Apache Commons Net API。 但不管是哪一个,都需要设置重试次数和链接超时间。重试次数和间隔的设置需要小心,重试太频繁,容易把服务器打死.;时间间隔太大,又会阻塞后续处理步骤。5~10分钟是一个合适的重试间隔区间。

链接超时指在服务器出现问题时,连接在指定时间内获取不到数据即自动断开。这个很容易被忽略。我们有一次系统出问题,是渠道侧的FTP假死后重启,导致我们的客户端挂住,一直在等待重新链接。

渠道对账单标准化

找个例子大家看看, 比如微信的对账单,他是csv格式的,包括如下信息:

支付系统设计:对账处理(二)

而某宝的对账单,采用文本格式,用空格隔开。他们家的就简单很多,只有商户订单号、交易流水号、交易时间、支付时间、付款方、交易金额、交易类型、交易状态这些字段。

支付系统设计:对账处理(二)

由于每个渠道的账单格式都不尽相同, 在得到账单后,下一步是对账单做标准化处理,这样轧帐以及后续工作就可以统一处理了。标准化后的账单数据可以放在文件系统或者数据库中。这取决于交易数据量。每天百万以上的量,还是使用文件系统,比较合适。数据库操作相对比较慢,也浪费资源。

基于文件系统的标准化涉及如下内容:

为了加快处理速度,我们使用hdfs作为文件系统,有利于后续的对账的处理。

本地交易记录准备

本地交易记录的准备,总的来说有如下方法:啥都不做,直接用原始数据。鉴于大部分系统使用的是mysql,这也意味着在MySQL上做对账。对账时需要大量的数据查找工作,必然会影响线上业务。在数据规模较大,比如超过100万时,就不太合适了。

当然,还有一个选择是使用备库来执行对账,这样既简单,也不影响线上业务。这是典型的空间换时间的做法。

如果业务大到需要分表分库才能处理,那对账数据准备也不一样。使用分库也不现实,因为分库一般是按照主体id,而不是渠道id,来分库,这样对账就需要在多个库上进行,效率反而降低了。而对分表分库建立从库也非常耗费资源。这种情况下,需要同步一份数据到(hdfs)文件系统中,或者NOSQL数据库上。

由于交易记录是支付系统核心数据,有大量的应用,如信用、风控等,都需要交易记录数据。这些应用对交易记录的需求还不完全一致,为了提升性能, 交易记录会使用异步的方式来将数据投递给使用方。交易记录在入库时,投递消息到消息系统中。使用方监听这个消息,一旦收到新消息,则从交易记录库中查询数据,获取数据并更新到库中。关于此类数据同步的文章不少,这里就不详细介绍。

轧帐

轧帐是按照客户订单号来比较本地交易记录和渠道交易记录是否一致。从算法角度,是计算两个数组的差异。在单机运行时,可以采用的算法不少,这里不详细介绍。我们推荐采用mapreduce来轧帐,这有个优势,可以按照订单号将渠道提供的记录和本地记录shuffle到同一个reduce处理上,这样就可以很容易进行数据比对。轧帐中最大的坑,莫过于切分点的问题。

比如以整0点为切分点,那存在一个问题,本地23:59发起的交易,到了渠道侧,可能会在00:01处理,这一笔交易变成第二天的帐了。实际处理中,一笔交易在渠道侧处理,花上几分钟都有可能。对于切分点附近无法确认的帐,做一个时间窗,在时间窗内的数据,留待第二天对账时继续处理。

平帐

发现两边不一致的数据,那应该如何处理?数据量不大时,记录起来,人工甄别就行。但如果数据量很大,每天上千条,人工处理就成本太高了。这个没有统一的处理方法,需要根据有问题的数据,做个分析,然后做自动处理。 针对交易记录的对账的处理,主要有如下情况:

针对退款的对账处理,主要有如下情况:

总之,对账工作,即复杂也不复杂。需要细心,对业务要有深入的了解,并选择合适的架构。

相关阅读:

支付系统设计:支付系统的账户模型(一)

雷锋网注:本文由人人都是产品经理社区作者@凤凰牌老熊(微信公众号:shamphone)原创发布。凤凰牌老熊,程序员 & 架构师。先后在中科辅龙、三星(中国)研究院和国内一些大型的互联网公司工作过。2014年加入爱奇艺,负责数据仓库和支付系统的建设。文章未经许可,不得转载。

长按图片保存图片,分享给好友或朋友圈

支付系统设计:对账处理(二)

扫码查看文章

正在生成分享图...

取消
相关文章