账目核算是财务工作的必要部分,随着线上交易体量越来越大或者说对财务自动化线上化的效率提升需求越来越高,为了提升核对效率以及准确性,要将核对业务系统化、线上化、自动化。如何构建设计一套不同业务场景下的对账系统是本文的重点。
日常生活中每天都在对账,比如去餐馆吃饭付款,会对老板说一声“老板,钱付过去了”,老板检查收款情况或者听到语音播报后回复一声“好嘞,下次再来”,这就是一次最简单的对账。再比如在淘宝开了一个店铺,每个月几千单的交易、发货;次月末都拿着所有的订单明细和支付宝收款记录逐笔做一次核对,保证发过货的订单都收到款了,这是一次更复杂的核对。
1.1.对账的定义
对账就是“账证实”的核对,“账”是账目,“证”是凭证,“实”是实际资金或者商品。常见的核对模式有三种:账证核对、账账核对、账实核对,确保账证实两两的一致性。如在饭馆吃了一碗面,其中点菜单就是原始凭“证”,付了10元钱是“账”,老板电脑记录10元是“账”,老板看到账户中余额增加了10元是“实”。
从财务范畴来看,证就是会计凭证,比如发票、小票、出货单、收据、交易系统的支付记录等都是原始凭证;而账呢就是财务的账目,账务系统的账务记账,金蝶的科目余额等都是不同的账目;而一笔交易会记录在很多的环节,比如账务系统,金蝶等。
从广义的时间看核对一致性,核对的就是数据,其中包括商品数据、用户数据、卡券数据等。财务范畴的账证实需要核对,而非财务范畴数据也需要核对,比如今天应到10人实到8人,军训时的报数等其实也可以称为对账,我们暂且称为“广义的对账”。
对账的广义定义:为了确保同一个事务的数据描述在不同场所下的记录一致而进行的相互之间的一致性比对。
为什么要对账呢?首先在财务范畴,这是一个必要做的工作;其次,从业务视角看,如今的交易链条越来越长,数据在众多系统之间难免会出现丢失或者差错的情况,所以为了业务的正常运转并及时发现问题,需要确保系统间数据的一致性。最后,从公司的角度看,需要确保“不少收一分钱,不多付一分钱”,保证资金的安全,不然卖了多少货,收了多少钱相互之间无法自洽,最后全是糊涂账。
综上所述,对账是必不可少的;对于交易体量巨大的互联网公司更是必不可少,而且系统化也是必须的,单靠人工难以满足需要。
1.2.对账场景和模型
常见的对账场景包括三方支付公司内的对账、电商平台内部的对账、金融及清算机构等机构内部的核对等,其中:
三方支付公司的对账:主要是核对自家的交易记录和银行清算数据之间的一致性;银行清算数据(应收应付)和银行结算数据(实收实付)的一致性;同样也要核对与账务系统数据的一致性。
电商等服务平台的对账:主要是核对自家的交易数据和三方支付公司的清算数据的一致性;三方清算和结算的一致性;三方机构结算到企业对公户的资金的一致性。
(1)对账模型
对账模型根据核对的数据种类以及核对模式的不同可以分为交易对账、资金对账、余额调节对账、其他对账等
交易对账模型:交易数据之间通过唯一标识进行一对一、一对多、多对多核对业务;
资金对账模型:将交易数据按照款项类型进行汇总之后进行核对,比如收款,手续费;
余额调节核对:将系统记账余额和实际资金账户余额经过在途调整后进行一致性核对的业务。
(2)搭建对账系统
对账系统是通过系统解决方案,对需要核对的数据按照设定好的规则进行核对校验,产出核对结果,并对核对结果进行对应的差错处理的自动化信息系统。通俗来说就是将人工核对数据一致性的事情交给系统去做,只需要预先配置好各项规则即可。对账系统应具备以下基础能力:
可以便捷的获取需要核对的原始数据,如平台数据、渠道数据; 可以对文件数据进行解析或者二次加工; 可以灵活配置核对规则; 可以查看核对的结果; 可以对差异进行追踪管理和处理; 可以对外提供核对结果; 可以对外输出数据。
如果要实现一款对账系统,首先应该明确相关的业务模型,其次需要抽象出业务的核对模型,然后针对核对模型选择合适的核对方案,最后针对核对方案设计系统方案、研发、上线、投入使用。
本部分将提供一个通用的核对架构,可以满足大部分的核对诉求
整个架构图包括左中右三大部分,左部分位业务系统层,为平台的内部数据,例如订单数据、交易数据、卡券数据、支付数据等;右部分为外部渠道层,为外部支付数据,例如三方支付渠道的清算数据和结算数据;中间部分为对账系统层,核心职能就是完成左右两部分数据在何种模型下的核对业务,包括数据管理、数据解析、交易核对、资金核对、核对结果管理等一系列的能力,整个核对业务主流程如下:
按核对频率获取业务支付数据; T+1或其他频率获取三方清算文件和结算文件; 将清算和结算文件进行解析存储; 根据对账项目配置完成交易数据和清算的核对; 完成清算数据和结算数据的核对; 对交易的单边数据和资金核对差异进行管理和处理。
对账离不开原始数据的获取和管理,对账数据主要包括渠道的数据、平台的自有数据,当然也应该包括核对之后的结果数据。
如何获取个管理渠道数据,以及平台数据通过什么模式和规则获得,对账结果数据如何存储和查看,是本小节的重点。
支付交易的通道提供方,例如微信、支付宝、网联、银联等,都是按照约定频率和时间提供交易文件,一般是2份,清算文件和结算文件,其中清算文件记录支付明细,结算文件记录账户的实际资金变动明细。
一般可以通过通道方提供的专属接口下载对账文件,如果没有接入下载接口或者通道侧本身就不提供下载接口,可以暂时采用人工下载的方式获得文件,获得文件以后传到对账系统解析出对账数据并存储,以待核对。
主流文件类型以Excel和txt为主,其中Excel是常见的文件类型,这种类型的文件阅读性强,下图,为从支付宝后台下载的结算文件。
某些通会提供Txt格式的对账文件,这种类型的对账文件阅读性比较差,数据列的分割符种类也比较多,在文件解析时存在一定难度,如下图所示
还存在一些其他格式的文件,例如xml报文格式、csv格式、pdf格式等。无论什么格式的对账文件,核心用途都是为了获得交易数据进行核对。
常见的获取渠道对账文件的方式是通过接口,通过机构提供的文件查询和下载接口获取对账文件,如下图所示,是从支付宝开放平台截取的对账文件下载接口示例。
同样可以通过人工下载的方式获得对账文件,如果技术能力资源不足,或者暂时没有接入接口,可以采用人工下载的方式,然后将文件上传至对账中心,通过解析文件生成系统需要的数据。
从渠道获取到的文件一般存放在对账系统指定的ftp内,并对文件或者文件夹按照命名规范进行命名,通过文件路径查询和下载该文件
对账文件解析是指将文件里的数据进行处理,转换成数据库数据,以某种形式存储在数据库内,因为文件数据不能直接被系统读取,文件解析模式有原样解析和通用模板解析。
原样解析是不改变文件的数据列数和内容,在不减少文件数据列数的情况下原汁原味的把数据解析出来,可以根据需要增加列内容,比如账号、对账时间等。该种解析方法有以下的优缺点和适用性。
优点:不需要配置解析器,每一个文件研发好固定的解析器进行复用; 缺点:每个文件类型需要建一套数据表,维护成本高; 适用:通道少的平台,一般的商户都仅有微信、支付宝,可以采用原样解析。
数据解析到数据库里以后,为了便于排查问题直接查看数据或者其他用途,还需要提供查看数据的后台工具,分别按照数据类型展示相应的数据,例如平台的支付数据、微信的清算数据、微信的结算数据、支付宝的清算数据、支付宝的结算数据、易宝支付的付款数据等,如图所示是平台业务数据的后台页面。
获得渠道文件账单数据以后需要将其与平台自己的相关数据做核对,如平台的交易数据与清算数据做核对,平台账务数据与银行账单数据做核对。
平台自有数据的获取方式常采用如下形式:
文件获取:业务系统定期(如每日凌晨2:00)生成文件,按照约定规范进行命名,将文件推送至对账系统指定位置(ftp);这种方式需要各业务系统有一定开发量,业务调整时也需要调整文件的生成策略,维护成本略高。
接口接收:对账系统提供对账数据接收接口,类似账务记账接口,业务系统按照约定在相应业务节点发送业务数据到对账中心。
MQ:业务方按照要求在交易成功时发送约定格式的MQ消息,对账系统订阅该MQ,对MQ进行解析后获得业务数据。
SQL:通过SQL定期捞取业务数据,并将数据存储到对账系统数据库中;该方式调整灵活,可以选择在业务并发较小的凌晨进行。
人工上传:对于一些采购的外部应用,比如金蝶系统,数据无法通过以上方式获取的情况下,就需要对账人员定期下载应用内数据,然后上传到对账系统。
随着业务的发展,对账系统数据会越来越多,类型也越来越多,包括支付数据、卡券数据、订单数据、三方清算数据、三方结算数据等;每类数据的数据字段有各有不同,如何对众多类型的数据进行管理呢?可以对数据进行分类管理,每类数据单独设置表结构。
首先是设置数据的大类,或者说是一级分类;就像商品类目一样管理数据,如图所示。
然后设置数据子类,在数据分类下面设置数据的子类,并将数据子类关联到数据库表,便于存储数据,查询数据,对账取数,如图所示。
配置好了数据分类和类型并关联好了数据表之后,接下来就是配置获取数据的规则了,以通过文件或者SQL两种获取数据的形式为例,如图所示。
为每个数据分类配置取数方式,如果获取的是文件就配置文件路径,如果通过SQL获取就配置取数sql。对账系统会按照任务配置基于取数规则定期获取对账所需要的数据,并且插入到数据类型关联的数据表当中。
支付数据与三方清算的核对,或者其他数据的两两核对,会得到核对结果,且每一组核对都会有一个组别的名字,这一部分会在下一节详细介绍。
首先是交易对账的核对结果,主要是展示平台支付数据与渠道的清算数据之间的差异,或是可以理解为信息流的差异,针对不同支付类型的差异进行差错处理。
交易对账结果是源数据本身在某个对账项目里的核对结果;而资金对账结果是某资金账号某交易日的资金收付的一致性核对结果;比较平台的资金账收付结果与银行的收付结果是否一致,或者说是银行自己本身的清算与结算的款项否一致
如何存储核对结果呢?核对结果可以存储在源对账数据的表中,也可以单独存储。
存储在源对账表这种方式适合数据简单的对账体系,且同一份数据不会在多个对账项目中进行核对,比如支付数据只与清算核对,这时候数据的核对结果就是默认与另一方的核对情况。
存储在单独的对账表这种方式适合复杂的核对场景,同一份数据会在多个对账项目中与多组数据完成核对,产生多个对账结果,比如支付数据与上游的订单进行核对得出一个对账结果,支付数据又会与下游的清算数据核对得出另一个对账结果。此时支付数据的对账结果有2个,一个是与订单的核对的结果,另一个是与清算的核对的结果,这种情况,对账结果就需要单独存储“某数据在每一个对账项目组中的核对结果表”。
业务总是在不断变化,新的业务也在不断出现,对账数据也会因为业务的变化发生变化,当接入了新的支付渠道对账设置也需要新增,如果每次都通过研发实现,那么产研成本会很高,本部分将介绍如何实现交易对账及资金对账的对账项目的配置化设计,会极大提升对账项目的管理效率。
对账并不是简单的一方与另一方比对,实际情况是会基于业务情况进行很多组之间的核对,比如与微信的核对,与支付宝的核对等。每一组又可以分成更细的组,比如与微信核对,可以分成微信收款核对,微信退款核对,如果微信收款有很多账号,又可以按照微信账户进行分组进行核对,例如微信收款一共有两个微信账号:微信1,微信2,就可以设置4个对账的组
具体如何设置核对组,这个因公司而已,因喜好而已,核心目的只要能完成全量的核对即可,对账项目越少越容易管理,对账项目越多越清晰,各有利弊。
为了便于管理还需要为每个对账项目命个名字,如何起名也看自己喜好。比如,如果对账组的同学都是女生,都是吃货,因此所有对账项目的名称都可以跟吃相关,如工商9876-卤煮火烧,命名的一个关键原则是要能从名字中看出具体核对的是什么业务。基于这个原则为开头的几个项目起一个如下的名字:
对账项目1:会员购买微信支付-收款 对账项目2:会员购买微信支付-退款
通过对账项目的名称便可以清晰的知道对账项目1是会员购买的收款核对项目,对账项目2是会员购买退款的核对项目。
一个企业可能会存在很多个对账项目,有的甚至高达几百个核对项目。为了便于管理,就需要一个菜单专门管理对账项目,该页面可以查看所有的对账项目;点击设置可以进行该对账项目的配置;右上角的新增可以新增项目,如图所示。
在对账项目列表点击新增会有一个弹窗可以添加一个对账项目,需要先填写基本信息,比如对账项目的名称、对账启用时间、对账的频次、对账的类型等,如图所示。
设置对账项目主要设置对账项目的执行时间、核对双方的对应数据、核对的唯一标识等一些处理规则。如图所示是一个基础的设置页面,实际工作中需要基于业务场景以及数据特点,对设置器进行一些调整,但是在这个配置基础之上一般难度不大。
从页面可以看出来,该配置是设置卡系统的消耗数据与订单中的消耗记录进行核对,为数据两方配置了如下的数据选择条件:
A方数据为卡数据,数据筛选条件是”交易类型=消耗购买”; B方数据是订单数据,设置以订单号为唯一标识进行核对; 订单数据的金额如果存在多条则进行汇总; 对账差异的报警接受人,可以填邮件,办公账号等。
完成配置后,一个对账项目就配置完成了;对账系统会照着配置的任务时间每天完成订单数据和卡数据关于消耗明细的核对。
线上支付完成以后,虽然通道方已经返回支付成功,但是钱最终是不是能正确结算,还需要打一个问号,资金对账就是应收应付和实收实付之间的核对,其中应收应付就是交易记录所记录的成功交易,而实收实付就是收款账户实际的资金入账。
明白了对账项目的概念以后,接下来要介绍的资金对账项目就容易理解了:一个实体的银行或者收付款账户就是一个资金对账项目,所以说资金对账是按照收付款账户的维度进行核对的。
将一个资金账户设置为一个资金对账项目,比如平台有2个微信收款账户1和2,有两个支付宝收款账户3和4,一个招商对公户5,共5个资金账户,那么就可以设置5个资金对账项目,如下设置:
资金对账项目1:微信账户1; 资金对账项目2:微信账户2; 资金对账项目3:支付宝账户3; 资金对账项目4:支付宝账户4; 资金对账项目5:招商对公户5。
为了便于管理,还需要为每个对账项目进行命名,如何起名看业务需求或者个人喜好,同交易对账项目命名类似,命名的一个关键原则是要能从名字中看出具体核对的那个账户。基于这个原则为(1)中的几个项目按照“通道方+通道类型+账户号”的命名规则规则进行命名,具体命名如下:
资金对账项目1:微信-收款-账户1; 资金对账项目2:微信-收款-账户2; 资金对账项目3:支付宝-收款-账户3; 资金对账项目4:支付宝-收款-账户4; 资金对账项目5:招商对公-收款-公户5 。
对账文件管理在前文已经介绍过了,账户方一般会在次日提供相应的清算文件和结算文件,那么文件要跟资金对账项目对应上,通过对账文件命名可以知道对应的所属账户,比如制定这样命名规则:通道方+账号+文件类型+交易日期,按照该规则可以得到资金对账项目1的文件命名:wx-1-pay-20210204。
一个企业可能存在多个资金账户,为了便于管理,就需要一个菜单专门管理资金对账项目,该页面可以进行对账项目的新增、配置、修改等一系列的操作,如图所示。
点击右上角的新增可以新增资金对账项目,要填写的信息如下图所示,包括账户名称、关联的交易对账编号、对账起始时间、对账类型、对账频率等基本信息,配置好基本信息以后确定新增即可增加一个对账项目,然后通过设置进行资金对账项目规则的配置。
资金对账是核对应收应付和实收实付,实收实付就是银行实际资金的变动,使用银行结算账单即可,而应收应付的选择其实有2种方法,一个是使用通道的清算文件作为应收应付,另一个是使用平台的资金账务作为应收应付。
使用银行清算文件做为应收应付的数据源有个缺陷,就是平台的支付记录需要跟银行的清算文件进行核对确保没有差异,然后确保清算文件和结算文件之间的核对没有差异,核对模型的实现如图所示。
在新增对账项目时需要关联交易对账,目的就是看一下平台的支付记录和清算文件之间的核对有没有差异,如果没有且资金对账没差异,那么整个对账就没有问题了。
交易对账是按照交易明细进行逐笔核对的,而资金对账并不按照资金明细进行逐笔核对,因为存在轧差以及线下汇入等情况,资金对账需要按照费用维度进行核对,也就是将应收应付和实收实付数据解析成费用项的汇总,对相同款项进行核对,其中的费用项如收款、收款手续费、退款、退款手续费、打款等。
以核对清算数据和结算数据为例,资金对账项目设置就是设置如何将文件里的数据解析汇总到对应的款项上去的解析规则,将一个资金账户在某一个交易日的资金变动明细进行汇总,得到每一个款项的变动金额,该配置设置如图所示。
从页面可以看的出来,该配置中的每一个费用项的配置规则就是将文件里的数据先通过该费用项的“条件组”进行筛选获得属于该费用项的数据,然后取目标数据的金额,并且对金额进行运算汇总。比如例子中的第一条就是:取交易状态=success的数据,取订单金额作为结算金额,如下表所示为一部分案例数据。
通过原型中的配置条件组“交易状态=success”,金额配置“正直汇总 订单金额”,可以得到收款=100+90=190。
其他费用的配置逻辑类似,一定要枚举一个资金账户里的每一类费用,不能遗漏,不然会出现资金差异。如此全部配置完成以后,一个资金对账项目就配置完成了,对账系统会按照配置的时间进行账单的解析,得到资金对账所需要的核对源数据。
在执行对账前还有几个重要的问题没有解决,即对账的核心处理逻辑,例如对账的连续性控制、时间控制、状态控制、对账核心逻辑、对账结果查看等。
首先是对账的连续性控制,对账不能跨日,如2号对完才能对3号,如果今天是10号,2号还没对账,那么3至9号的账都不会核对,因为前一天的核对结果会循影响下一天的核对结果,这种控制如图所示。
其次是对账的时间控制,如图10-20所示,系统内需要维护对账的相关时间,主要是对账日期、对账启用日期、最后对账日期,他们的含义如下:
对账日期:交易成功时间或者资金变动日; 对账启用日期:对账项目设定的第一个对账日; 最后对账日期:对账项目的最后一次执行对账的日期。
然后是对账的状态控制,对账状态即每个对账项目在每一个日期是否执行了对账,已经完成对账的项目不需要重复执行对账,除非需要重对,如图所示是对账状态的管理页面。
最后是对账任务流的控制,控制对账项目的任务执行,并在流程中更新其他环节的相应参数。如果主流程的某一个处理关节失败了,那么应该进行任务报警,人工干预重启核对流程,控制流程如图所示。
对账最核心的流程就是对账执行流程,实现数据间的逐笔核对的过程,如下图所示。本逻辑流程主要包含三大核心逻辑:实现每一天都完成核对,实现每天的每一个对账项目都完成核对,实现每一个对账项目的每一条数据都进行了核对。并且产出每条数据的核对结果,是对平、单边、还是错账。
举个例子,经过上面的逻辑处理,对账项目1在x日的对账结果如下表所示,其中单号2是对平,单号1和4是单边,单号3是错账。
通过上面的对账执行,就得到了每一个对账项目的对账结果,包括每个对账项目的对账总笔数、总差异。对账结果包括交易对账结果和资金对账结果2类。
首先是交易对账的核对结果,主要是展示平台支付数据与渠道的清算数据之间的差异,或是可以理解为信息流的差异,针对不同支付类型的差异进行差错处理。
交易对账结果是交易对账项目执行对账之后得到的结果,每个对账项目按笔数核对。从页面中可以看到每个交易对账项目的核对日期、总笔数、单边数、错账数、待处理数等,并且可以查看该对账项目在该核对日期的平台明细数据和清算明细数据。
资金对账结果是某资金账号某交易日的资金收付的一致性核对结果;比较平台的资金账收付结果与银行的收付结果是否一致,或者说是银行自己本身的清算与结算的款项否一致
资金对账结果是资金对账项目执行对账之后得到的结果,每个对账项目按照费用项核对。从页面中可以看到每个核对账户在该核对日期的每一个款项是否存在差异,并且可以直接查看到该账户关联的交易对账是否存在差异。
对账有两个核心目的,一个是发现错误,另一个是改正错误,即对账差异的处理。对账结果如果有差异,就需要有排查差异的原因,差异原因千奇百怪,但存在必是有原因的,如果暂时查不到具体原因就先挂着,至少我们知道了有一个差异待处理。
差错处理就是消除差异的过程,主要包括发现差异、排查原因、处理方案制定、消除差异等环节:
发现差异:对账对出了差异; 排查原因:排查差异原因,是掉单了、bug、时间差还是其他原因; 处理方案:制定差异处理方案,如时间差造成的不用处理,等待第二天对平; 消除差异:这一步是在对账系统对差异进行标记处理,说明差异已经处理完成了。
交易对账是交易数据的逐笔核对,会出现对平、单边、错账等三类结果。对账的差异会单独出现在差异列表等待处理。
点击处理,在弹窗中选择处理类型,提交之后可以走一个设定好的流程,也可以直接处理完成。
其中差错处理类型就是我们要用什么样的方式消除了差异,比如如果是银行成功,我方掉单了,那么就进行补单,补完后就对平了,这样也是保证用户的权益。因为是我方掉单了,所以对账结果是银行单边;等我方补完单后,银行的这笔单边就处理成“平台补单”。系统可以预设一些差错处理类型,设定每个类型的处理流程,便于在处理的时候直接选择使用
有些差错处理可以实现自动化,让相关系统包装接口直接进行调用处理,比如平台补单可以让订单系统包装一个补单接口,对账系统直接调用进行补单。
资金对账的差异是费用的差异,即收款、退款、手续费等于平台记录的不一致。资金核对完成得出结果后,如果不是解析等技术层面的差异,可以对结果进行一个确认,确认之后差异会生成长短款数据,后面对长短款进行排查原因、进行核销。资金对账结果详情页面如图所示。
什么是长短款呢?比如微信的一个资金账户,资金同事直接在微信商户后台操作了一笔转账,或者用户直接用微信转账100元给了这个账户,这时候就会出现微信收款比平台记录收款多的情况,即微信账单的收款总额比平台的记账总额多100元,资金对账就会发现这100元的长款,就是渠道多收了。但经过排查是可以找到这个具体原因的,本质上是平台没有获得这笔转账数据,也就无法记录,通过排查可以操作核销差异。
确认结果以后,长短款模块就会生成一笔该账户的 100元长款记录;长款记录要有账户信息、对账日期信息、费用信息等,如图所示。
点击核销可以对该笔差异进行核销处理,在弹窗里选择相应的核销类型,本次要核销的金额,同时也可以选择与前期其他差异进行双边核销,如图所示。
长短款差异生成的同时也会生成对应的账务凭证,算是一个挂账凭证,为了让账务是平衡的,后续针对每笔资金差异进行排查核销,比如如果确认是人工微信做了转账,那么可以直接核销“资金人工转入确认”,直到长短款没有待核销为止,资金就是准确的了,每笔核销都需要生成核销记录,如图所示。