业务讲解-为什么说支付服务中的对账功能必不可少
在微服务的架构架构中,对于支付功能来说,一般都是将和支付宝、微信等多个支付渠道进行统一,然后抽取成一个服务中,当其他的服务需要进行支付时,就会和支付来交互,由支付服务统一处理
而这就需要支付服务考虑很多的业务细节问题,就比如最需要考虑的支付异常问题和支付对账问题,每年或者每个周期需要出财务对账的报表,就需要提供对账功能,而为了保障交易的顺利完成、维护财务的准确性以及提升用户体验至关重要
账单表在支付服务中起着核心的角色,它不仅记录了每一笔交易的详细信息,还为系统提供了一个可靠的数据来源以进行各种财务处理和对账操作。本文将深入探讨为什么支付服务需要使用账单表,以及账单表在对账过程中的好处
为什么支付服务需要使用账单表
1. 交易数据的完整记录
账单表为每一次支付交易提供了一个详细的记录,包括支付流水号、商户订单号、支付渠道、支付金额等关键信息。这种详尽的记录保证了交易数据的完整性,使得任何时候都可以查询到每笔交易的具体情况
2. 支持多支付渠
随着电子支付方式的多样化,消费者希望能通过不同的支付渠道(如支付宝、微信支付等)来完成交易。账单表通过记录每一笔交易所使用的支付渠道,使得支付服务能够支持并管理多种支付方式,进而提升用户体验
3. 对账和财务审计
账单表提供了一个关键的数据基础,用于对账和财务审计。通过与支付渠道方提供的交易数据进行比对,可以确保账目的准确无误,及时发现和纠正交易或财务上的差错,确保资金的安全
4. 法律和规范遵循
电子商务交易受到严格的法律和监管规定,支付服务需要保留交易记录以符合相关法规的要求。账单表使得支付服务能够有效地存储这些信息,以备不时之需,如法律诉讼或税务审查
账单表的好处
1. 精确的财务管理
账单表使得支付服务能够精确地跟踪每一笔交易的金额,支持高效的资金管理和优化财务流程。这对于维护企业的财务健康和支持业务决策具有重要意义
2. 支持数据分析
账单表中丰富的交易数据是进行市场分析和消费者行为研究的宝贵资源。通过分析这些数据,企业可以洞察市场趋势,优化产品和服务,进一步提升竞争力
下面就来分析大麦网中账单表的详细作用和流程
账单表
CREATE TABLE `d_pay_bill` (
`id` bigint(20) NOT NULL COMMENT '主键id',
`pay_number` varchar(64) DEFAULT NULL COMMENT '支付流水号',
`out_order_no` varchar(64) NOT NULL COMMENT '商户订单号',
`pay_channel` varchar(64) DEFAULT NULL COMMENT '支付渠道',
`pay_scene` varchar(64) DEFAULT NULL COMMENT '支付环境',
`subject` varchar(512) DEFAULT NULL COMMENT '订单标题',
`trade_number` varchar(256) DEFAULT NULL COMMENT '三方交易凭证号',
`pay_amount` decimal(10,0) NOT NULL COMMENT '支付金额',
`pay_bill_type` int(11) NOT NULL COMMENT '支付种类 详细见枚举PayBillType',
`pay_bill_status` int(11) NOT NULL DEFAULT '1' COMMENT '账单支付状态 详细见枚举PayBillStatus',
`pay_time` datetime DEFAULT NULL COMMENT '支付时间',
`create_time` datetime NOT NULL COMMENT '创建时间',
`edit_time` datetime NOT NULL COMMENT '修改时间',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态 1:未删除 0:删除',
PRIMARY KEY (`id`),
UNIQUE KEY `d_pay_bill_out_order_no_IDX` (`out_order_no`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付表';pay_bill_type是支付的种类,在枚举PayBillType中管理
public enum PayBillType {
/**
* 账单类型
* */
PROGRAM(1,"节目"),
;
private Integer code;
private String msg;
PayBillType(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
}目前支持节目类型的支付,后续会增加新的支付类型,如优惠券等
pay_bill_status是支付的不同状态,在枚举PayBillStatus中管理
public enum PayBillStatus {
/**
* 支付账单状态
* */
NO_PAY(1,"未支付"),
CANCEL(2,"已取消"),
PAY(3,"已支付"),
REFUND(4,"已退单"),
;
private Integer code;
private String msg;
PayBillStatus(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
}也就是说凡是和支付服务进行交互,支付、回调通知、退单等相关操作,都会和支付账单进行联系起来,如果以后支付时出现问题,都可以通过此账单进行找回
支付流程中账单记录变化流程图

以上是整个用户支付流程
- 用户购票步骤时,会创建订单,生成主订单表d_order和购票人订单表d_order_ticket_user记录,
order_status状态为1 未支付状态 - 订单支付步骤时,会创建账单,生成账单表d_pay_bill记录,
pay_bill_status状态为1 未支付状态 - 当使用支付宝/微信支付后,回调通知:
- 将账单表d_pay_bill的
pay_bill_status状态修改为3 已支付状态 - 将主订单表d_order和购票人订单表d_order_ticket_user的
order_status状态修改为3 已支付状态
- 将账单表d_pay_bill的
账单详情查看
可以根据订单编号来查询账单的详情
com.damai.controller.PayController#detail
@ApiOperation(value = "账单详情查询")
@PostMapping(value = "/detail")
public ApiResponse<PayBillVo> detail(@Valid @RequestBody PayBillDto payBillDto) {
return ApiResponse.ok(payService.detail(payBillDto));
}com.damai.service.PayService#detail
public PayBillVo detail(PayBillDto payBillDto) {
PayBillVo payBillVo = new PayBillVo();
LambdaQueryWrapper<PayBill> payBillLambdaQueryWrapper =
Wrappers.lambdaQuery(PayBill.class).eq(PayBill::getOutOrderNo, payBillDto.getOrderNumber());
PayBill payBill = payBillMapper.selectOne(payBillLambdaQueryWrapper);
if (Objects.nonNull(payBill)) {
BeanUtil.copyProperties(payBill,payBillVo);
}
return payBillVo;
}更新: 2025-10-13 11:23:16
原文: https://www.yuque.com/u22210564/ykdrdh/cq44hl04i4ekpy6b