以在线教育公司为例,如何做一款财务对账产品?
财务同学每月月初都需要核对上个自然月微信、支付宝等金融收款账户的交易流水和公司业务系统交易订单的一致性,基于一致的前提下才能做账。随着业务的爆发性地增长,业务订单量太大,人工对账过于耗时和繁琐,就到了需要通过产品方案来解决,实现自动化对账。
适读对象
本文是四勾作为一名产品,通过产品方案来实现自动化对账的产品实践,比较适合对对账财务专业知识和对账工作流有一定认知,但就是不知道如何下手的产品经理。
如果你还不清楚为什么要对账,对账是什么和什么对等一些财务方面的专业知识的话,建议先阅读文章底部的「参考文章」恶补之后,再回来阅读正文。
一、背景介绍
为了便于理解和深入业务场景,四勾虚设一个场景,带着大家逐渐深入。
1. 虚拟场景
海豚教育是一家 K12 在线教育公司,主要服务的对象是小学和初中阶段的学生,有数学、英语、语文等学科,主要的业务交易包括 2 部分:
- 其一,购买课程的资金流入,分为体验课和正式课,体验课单价 30 – 50;正式课是一年的课程,课单价 6k – 8k;
- 其二,课程退费的资金流出。
资金的流入和流出都是通过微信或支付宝来进行交易,现在交易订单量巨大,需要通过产品来实现将微信和支付宝的每日交易数据和海豚自己的业务交易数据对账。
微信和支付宝我们都叫做金融账户。
2. 对账的价值
比较容易理解的是实际的收支和业务订单的收支一致,保证做账数据的正确性。其实有更深层次的价值,反向校验业务数据的准确性,发现业务数据的问题,及时修正;规避财务风险,进而更好的服务用户。
举个栗子,微信有一笔 50 元的退费记录,业务订单里没有,账无法对上。财务发现问题之后会联系孩子的班主任老师,在业务系统一查发现他的退费申请由于超时过期,退费申请自动关闭了。发现问题后需要采取措施,补退费记录,对账号做停课处理。
3. 设计思路
- 其一,每个金融账户分开独立对账,指微信和支付宝
- 其二,以金融账户数据为参照物,拿海豚业务订单数据往上对齐
- 其三,对账不区分学科,学科是对账完毕之后用来出财务饼状图的
二、对账工作流
自动对账是按照每日对账,当天拉取前一日的微信和支付宝对账单,和海豚的前一日的业务订单进行自动化匹配,然后做出正常或异常的标记。针对标记异常的,再人工跟进。
对账工作流分为 4 个步骤,每个步骤有具体的分工,全景图如下。
对账工作流全景图
1. 账单下载
账单下载更多的是技术层面的实现,这里不做展开,涉及到如下 2 个 API。
微信是当日上午 10 点出前一日的对账单,所以我们需要 10 点后拉取。
支付宝是当日上午 9 点出前一日的对账单,所以我们需要 9 点后拉取。
微信下载对账单 API: https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_6
支付宝下载对账单 API: https://docs.open.alipay.com/204/106262/
2. 数据准备
数据分为 3 个部分,每个金融账户各自需要 1 份数据,我们这里叫做「微信对账数据」和「支付宝对账数据」。另外,业务系统的订单数据,我们叫做「海豚对账数据」。
1)金融对账数据
微信和支付宝的逻辑一样,下面以微信为例:
整理后的微信对账数据
交易类型,照搬微信对账单上的,不做修改;
海豚订单,是微信里的「商户订单号」,便于理解,四勾有意改了个更直观的名字;
金融账户订单,是微信的微信订单号。
2)海豚对账数据
每天凌晨 2 点拉取前一日的海豚业务订单,包括购课付款成功和退费成功的交易订单,只拉取成功的订单,忽略支付中或退费中的交易未结束的部分。
同时,整理完的对账数据我们需要单独存储,出于 2 点考虑:
- 其一,业务订单的修改不会影响我们的对账数据;
- 其二,对账完毕后我们会基于对账数据计算各种各样的财务报表,要确保数据源的一致性。
如下图所示,保留 userId、课程名称和课程编号,便于以后按照课程栏目的财务统计。
整理后的海豚对账数据
3. 对账
1)单笔订单的对账状态
正常:系统自动对平的
异常未处理:系统未自动对平的会标记成异常未处理
异常已处理:人工处理掉异常,并且人工进行海豚对账数据和金融账户对账数据关联上
异常已挂起:
- 就是暂时忽略,以后再说
- 以后可以对已挂起的数据再次人工处理成异常已处理
单笔订单对账状态的流转
2)自动对账
微信自动对账完的数据状态
举个栗子:今天是 2019-12-26,我们对昨天 2019-12-25「微信」的对账数据。上午 10 点所有金融账户数据准备完毕后,立马执行自动对账。当然对完微信之后会再对「支付宝」。
Q1:左右两边的数据来源?
左边是海豚昨天的订单里面,收款和退款的金融账户是微信的;
右边的是微信昨天的全量交易对账数据。
Q2:如何自动对账?
第 1 步,右边的数据按照交易时间顺序排列,并展示出来(此时,左边全部为空);
第 2 步,针对右边每一条数据,拿「海豚订单」去海豚对账数据里面查询,同时满足下面条件就自动标记成「正常」;
- 其一,能查询到记录(只去海豚对账数据的 25 号数据里面查)
- 其二,金额一样
第 3 步,将第 2 步中查到的海豚对账数据展示在对应金融数据的左侧,并且将状态标记成「正常」
第 4 步,将金融对账数据没有标记成正常的其它所有的行,都标记成「异常未处理」(此时,这些数据的左侧都是空白)
第 5 步,将海豚对账数据没有被标记正常的其它所有数据,按照交易时间顺序插入,都标记成异常未处理(此时,这些海豚数据的右侧全部是空白)
自动对账包括上面的 5 步,自动对账结束会出现:
- 其一,状态只有 2 种,正常和异常未处理;
- 其二,异常未处理的,要么右边空白,要么左边空白
3)滚动对账
举个栗子:一笔支付,微信 23:59:59 收到钱,回调海豚服务器时已经跨天 00:00:02,这样在自动对账时会被标记成异常未处理。
出现上面的情况是由于遭遇日切,滚动对账就是专门来处理这种 case 的。
滚动对账前后的状态变化
上下文:
24 号所有对账结束后,海豚和微信各有 1 条异常未处理;
25 号自动对账结束后,海豚有 1 条异常未处理,微信有 2 条;
现在将要执行 25 号的滚动对账
Q:如何滚动对账?
第 1 步,拿 24 号微信异常的数据,去 25 号海豚的数据查,海豚订单号一致、金额一致,就意味匹配成功,将两者关联上,并同时标记为异常已处理;
第 2 步,反过来,拿 25 号微信异常去查 24 号海豚数据。
处理完上面 2 步之后,就如上图下半部分所示。
4. 差错处理
差错处理分为 2 种,一种是能人工匹配上,处理成异常已处理;另一种是怎么也匹配不上,处理成异常已挂起。
1)处理成异常已处理
通过线下人工查明原因,找到匹配的两边的订单号,然后上系统进行人工关联。
将异常处理成异常已处理
2)处理成异常已挂起
将异常处理成异常已挂起
处理异常之后,对账状态发生变化,就如下所示:
处理完部分异常后的对账状态
三、产品实现
1. 页面信息流
2. 对账明细-全部
举个栗子:要进行 2019-12-14 到 31 号对账,如何操作:
对账时间段:选择 2019-12-14 ~ 2019-12-31
对账周期,如果选择周,下面就按照自然周拆分,显示 4 行,如上图所示;如果按照日,下面显示 31 – 14 + 1 = 18 行。
3. 对账明细-微信
点击上图微信下面的最后一行,显示如下界面。点击下图「上一周期」,显示上一个自然周的对账。
Q:何为「未平账」,何为「已平账」?
- 对账状态中,只要有异常未处理,称为未平账;
- 没有异常未处理的,称为已平账,包括正常、异常已处理和异常已挂起。
参考文章
1. 详细解析「财务对账」的秘密https://zhuanlan.zhihu.com/p/42289649
2. 财务对账系统设计
https://juejin.im/post/5b1c76f4e51d450688135cfd
3. 聊聊对账系统的设计方案
https://juejin.im/post/5c485cd8f265da61327fa12f
4. 支付对账系统怎么设计?
https://mp.weixin.qq.com/s/SOpwMsVB5wNkwMZdKKMkwg
5. 从0开始学习搭建支付系统——核算对账核心
https://zhuanlan.zhihu.com/p/45492985
本文由 @四勾 4J 原创发布于人人都是产品经理。未经许可,禁止转载。
题图来自unsplash,基于CC0协议