【项目】对外支付梳理

重新针对对外支付功能进行整体的梳理与优化。对外支付最初目的是针对用户在退款或者支付异常时可以使用非正常流程退款,但是目前对外支付已经承担了更多赔付方面的功能,所以要整体进行重新梳理优化,还要考虑相关的数据清洗分析。

一、对外支付功能现状

1.1 运营平台对外支付

1.2 贵就赔理赔系统

1.3 保险平台理赔

1.4 B端订单调用

1.5 营销平台(新客返现)

对外支付创建表单

表单字段 VueForm 备注
支付单类型 type 测试单报销需要上传凭证
订单号 orderSerialNo
支付方式 payMethod 支付宝/银行
支付回退类型 payBackType 目前仅有非原路
支付原因 reason
保险供应商 insuranceMerchant
收款单位 receiver
银行账号/支付宝账号(授权码) account
银行总行名称 mainBankId (支付方式-银行)
支行所在省 receivedBankProvinceId (支付方式-银行)
支行所在市 receivedBankCityId (支付方式-银行)
开户银行支行 bankId (支付方式-银行)
支付金额 amount
是否发送短信 sms

支付单类型(type)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
PayoutTypeEnum {
/** 退余款 */
E1(1, "退余款"),

/** 投诉赔款-同程承担 */
E2(2, "投诉赔款-同程承担"),

/** 投诉赔款-供应商承担 */
E3(3, "投诉赔款-供应商承担"),

/** 正常向供应商打款 */
E4(4, "正常向供应商打款"),

/** 改签向航空公司打款 */
E5(5, "改签向航空公司打款"),

/** 航延险垫付 */
E6(6, "航延险垫付"),

/** 点评奖金充值 */
E7(7, "点评奖金充值");
  }

支付方式(payMethod)

1
2
3
4
5
6
7
PayMethodEnum {
/** 支付宝 */
ALIPAY(1, "支付宝"),

/** 银行转账 */
BANK(2, "银行转账");
}

二、申请到支付系统(paycore)

2.1申请支付单

支付系统仅用于生成支付单,不考虑详细业务逻辑。
目前五个客户端请求支付系统的facad接口申请对外支付单。支付系统接口实现逻辑仅限于落单和接收财务清分回写结果并分发MQ消息,之后优化考虑全部砍掉,将所有逻辑收缩在财务清分。目前各平台请求申请接口会带入client_uid,之后可以直接沿用支付核心的配置,减少对接入方的影响。

2.2考虑砍掉paycore

paycore仅用于记录与结果分发,目前的逻辑与财务清分系统逻辑冗余,可以直接删掉paycore这部分逻辑直接财务清分进行结果分发。

2.3paycore申请接口

outwardpayservice/outwardpayhandle

OutwardPayRequest

1
2
3
4
5
6
7
8
/** 全链路上下文id */
private String traceId;

/** 项目认证标识 */
private String projectAuthId;

/** 对外支付数据集合 */
private List<OutwardPayDataDTO> outwardPayDatas;

OutwardPayDataDTO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/** 项目对外支付流水号 */
private String projectOutwardPaySerialNo;

/** 订单流水号 */
private String orderSerialNo;

/** 收款账号 */
private String account;

/** 交易金额 */
private String amount;

/** ExtData对象json序列化字符串 */
private String extData;

extData
ext拓展字段内容直接透传到财务情分,详情参考3.1财务清分MQ >> ExtDataInfo

三、支付系统同步财务清分

3.1财务清分MQ

MQPlayload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 /** 项目对外支付流水号 */
@JSONField(name = "ProjectOutwardSerialId")
private String projectOutwardPaySerialNo;

/** 订单流水号 */
@JSONField(name = "OrderSerialId")
private String orderSerialNo;

/** 收款账号 */
@JSONField(name = "Account")
private String account;

/** 交易金额 */
@JSONField(name = "Amount")
private BigDecimal amount;

/** ExtData对象json序列化字符串 */
@JSONField(name = "ExtData")
private String extData;

/** 对外支付单流水号 */
@JSONField(name = "OutwardSerialId")
private String outwardPaySerialNo;

ExtDataInfo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/** 业务审核人 */
private String creator;

/** 收款人姓名 */
private String receivedName;

/** 支付原因 */
private String paidRemark;

/** 支付退回类型(0-默认(供应商使用0) 1-原路 2-非原路) */
private Integer payBackType;

/** 支付方式(1-支付宝 2-银行转账 3-快钱信用卡) */
private Integer payMethod;

/** 对外支付类型
* 0-其他
* 1-退余款
* 2-投诉赔款—同程承担
* 3-投诉赔款—供应商承担
* 4-正常向供应商打款
* 5-改签向航空公司打垮
* 6-延误险垫付
* 7-点评奖金充值
*/
private Integer type;

/** 开户银行总行*/
private String receivedMainBank;

/** 开户银行 */
private String receivedBank;

/** 开户银行省 */
private String receivedBankProvince;

/** 开户银行市 */
private String receivedBankCity;

/** 支付方式(原路) */
private Integer payType;

/** 0、C端 1、B端 */
private Integer businessType;

/** 保险供应商 */
private String insuranceMerchant;

3.2字段细节

支付方式(payMethod)
目前只有 1-支付宝 2-银行转账

四、财务清分同步财务

4.1财务清分落单

目前财务清分落单仅为记录,主要记录公共财务的返回结果。仅存储必要的快照数据记录,之后将完整数据转换同步公共财务。

五、财务审核退款或驳回

5.1财务回写清分通知

目前的业务逻辑是,财务审核通过/不通过的时候,通过DSF接口通知财务清分结果。清分系统收到结果之后,先修改对应记录单状态后发出通知MQ。

PayOutExtendMessage

1
2
3
4
5
6
7
8
/** 支付单流水号 */
private String paySerialId;
/** 是否成功(true-成功 2-false) */
private boolean status;
/** 描述信息(驳回原因) */
private String message;
/** 驳回时间 */
private String rejectTime;

5.2通知逻辑分析

目前来说,财务清分收到具体结果之后,通过项目对外支付流水号(ProjectOutwardSerialId)对外发放对外支付结果,目前消费者应该是上述的三个平台,订阅所有的结果MQ,确认最终结果。

六、整体数据清理分析

6.1平台分析

三个平台通过支付系统申请对外支付后,进入清分系统已经无法区分出具体业务申请原因,所以对于赔付的数据梳理困难,目前的想法就是区分具体的申请平台,而且申请原因也需要进一步细分(可以考虑细分对外支付单类型)。

6.2功能分析

对外支付功能,最初的想法就仅仅是进行订单的退款使用,但是现在另外一大作用是进行赔付,虽然对外支付确实可以使用并且在一定范围内使用简单,但是总感觉一个退款功能为主的接口用作赔付总会有欠缺,更重要的就是很难对数据进行监控,赔付这种业务还是有搞头的。

0%