转自 https://coffee.pmcaff.com/article/1650943162549376/pmcaff?utm_source=forum&tdsourcetag=s_pctim_aiomsg
对账设计
接下来讲讲对账咋做的。因为对账里有个财会知识,叫单边账,双边账。根据自家系统的需求,我采用了双边账这一类型。
对账主流程有四步:
(一)下载账单:
1.定时触发下载任务
时间建议设置为:支付宝3:30,微信10:30
支付渠道 | 对账周期 | 账单提供方式 | 账单文件格式 |
支付宝 | 3:30 | https | xml |
支付宝退款 | 3:30 | https | xml |
微信 | 10:30 | https | Gzip(txt) |
微信退款 | 10:30 | https | Gzip(txt) |
2.查询/连接下载地址:
支付通道 | 查询接口/地址 | 传参 | 出参 |
支付宝 | alipay.data.dataservice.bill.downloadurl.query | ||
微信 | https://api.mch.weixin.qq.com/pay/downloadbill |
3.重试机制:
若下载失败,5分钟重试一次,尝试10次。
4.下载文件:
通过https访问下载地址,将文件下载到本地。
(二)创建批次
记录对账批次,对账结束时将对账的结果信息存储到批次中。
(三)解析文件
1.判断文件来源通道
微信,支付宝
2.判断文件类型
xml,txt,csv?
微信是Gzip压缩包,支付宝是XML。
3.解析文件
由开发编写脚本程序,解析文件内容的范式。
4.转换入库
文件转换为CSV格式,存储入库。
5.账单明细
后台管理系统展示账单的明细内容。供财务查错账使用。
(四)账单文件存储
文件命名:业务类型_资金渠道_清算日期_序列号.文件格式
I_WEIXIN_20190101_01.csv
1.业务类型:入款I、出款O、退款R(撤销、退货)。
2.资金渠道:WEIXIN/ALIPAY
3.清算日期:YYYY-MM-DD
4.序列号:同一业务类型、同一资金渠道存在,多份对账单的情况。
5.文件格式:CSV格式。
(五)对账处理
获取、解析完支付通道的账单数据后,进行对账时,需要将对账单中订单、金额、服务费与我方平台系统订单、金额、服务费进行比对。
1.找出订单
根据渠道、日期、交易状态(交易成功)获取我方系统订单;
2.系统订单与支付通道对账单勾对
A.按照系统订单中顺序一条条与对账单记录进行勾对;
B.勾对时先按照订单号进行勾对,再进行金额勾对;
C.系统订单勾对完成后,检查对账单是否存在剩余记录。
3.对账处理
对于订单号、金额一致的,记为已平账;
对于订单号勾对一致,但金额不一致的,记为金额不一致,放入差错池;
对于订单号匹配不到的,记为短账。(我方有,对方没有)
对于对账单中存在剩余记录,全部记为多账。(我方没有,对方有)
4.结果输出:
对账无差异的,显示对账成功,可进行汇总确认。
对账存在差异的进行展示,并在差错池处理。
3次对账都没对平的放入差错池。
对账结束时候,将对账的结果信息存储在批次中。
5.对账逻辑:
查出我方交易状态成功的订单,遍历支付通道订单的所有数据,找出订单号一致的订单,勾对金额、服务费是否一致。
// 缓存池3天依旧对不平的交易,放入差错池 //
遍历缓存池
if 今日-缓存池中订单号交易时间>2
该订单放入差错池
// 勾对清我方有,对方也有的账单 //
if 我方单在对方单中能找到
if 金额一致,跳过
else 该笔置入差错池
else 我方单在对方单找不到
if 遍历缓存池找到
if 金额一致,跳过
else 置入差错池
else 遍历缓存池找不到
记为短款,存入缓存池
// 找出我方没有,对方有的长款 //
if 对账单中还有订单,
记为长款,存入缓存池
else
跳过
(六)对账接口
支付宝_app支付接口2.0:https://docs.open.alipay.com/api_1/alipay.trade.app.pay
微信_app支付:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_6&index=8
五.后台_对账表单设计
(一)交易订单列表:
序号 | 内支付账号 | 用户ID | 用户名称 | 商户订单号 | 业务类型 | 订单金额 | 状态 | 下单时间 | 支付通道 | 支付类型 |
1 | 张大胆 | 消费 | 10 | 支付成功 | 支付宝 | 即时转账 | ||||
2 | XXX | 王小明 | 提现 | 100 | 交易超时 | 微信 | 即时转账 | |||
3 | 李老汉 | 消费 | 50 | 余额 |
交易订单的展示:跟交易笔数对应。查看订单提交信息,作用--用户行为漏斗模型分析,辅助项目排序。(下单了但不支付,这类项目的排序权重上升)
字段说明:
1.序号:0,1,2...99...
2.内支付账号:我方生成,系统内部支付账户编号。
3.用户ID:系统内用户编号。
4.用户名称:系统内用户的名称。
5.商户订单号:我方生成传给支付通道。支付宝和微信变量都定义为“out_trade_no”。
6.业务类型:消费,退款,提现,充值。
6.订单金额:total_fee。
7.状态:等待支付,支付成功,交易超时(15分钟未支付,认定超时且关闭交易)。
7.下单时间:YYYY-MM-DD hh-mm-ss
8.支付通道:微信,支付宝,余额。(不可混合)
9.支付类型:默认即时转账。
(二)支付记录列表:(双边账)
交易订单的展示:跟账户明细对应。双边记账,记录每笔支付的业务流、资金流明细。
字段说明:
1.序号:0,1,2...99...
2.商户订单号:out_trade_no。
3.用户ID:系统内用户编号。
4.用户名称:系统内用户的名称。
5.交易主体
(1)内账户:
借记金额--收入
贷记金额--支出
(2)外账户
借记金额--收入
贷记金额--支出
6.交易对手
(1)内账户:
借记金额--收入
贷记金额--支出
(2)外账户
借记金额--收入
贷记金额--支出
7.创建时间:交易生成时间。
8.业务类型:消费,退款,提现,充值。
9.支付通道:微信,支付宝,余额。(不可混合)
10.支付类型:默认即时转账。(预留预授权等支付类型位置)
11.支付流水号:trade_no。
12.订单金额:total_fee。
13.支付通道手续费:由签约的支付通道规定的标准定。
14.平台服务费:消费类收取5%服务费,提现、充值、充退类不收服务费;
15.状态:等待支付,支付成功,交易超时(15分钟未支付,认定超时且关闭交易)。