文章目录
- 前言
- 一、快捷支付
- 1. 执行流程
- 1.1 发送短信
- 1.1.1 发送短信(正常情况)
- 1.1.2 发送短信(异常情况)
- 1.2 短信确认
- 1.2.1 短信确认(正常情况)
- 1.2.2 短信确认(异常情况)
- 2. 短信确认流程分析
- 2.1 Service层执行
- 2.2 快捷支付确认
- 2.2.1 快捷支付确认命令链
- 2.2.2 流程分析
- 2.2.3 详解
- 2.3 代扣
- 2.3.1 代扣命令链
- 2.3.2 流程分析
- 2.3.3 详解
- 总结
前言
在上篇文章中《支付系统设计四:支付核心设计03-快捷发送短信(失败转代扣)》主要讲解了,在快捷支付发送验证码环节,如果发送验证码失败,或者没有业务线没有接入快捷通道,为了不中断支付,系统内部转化支付方式(快捷–>代扣),本来由支付渠道发送短信,转为短信中心发送验证短信,本篇将讲解验证短信环节。
一、快捷支付
1. 执行流程
1.1 发送短信
1.1.1 发送短信(正常情况)
1.1.2 发送短信(异常情况)
在请求支付路由系统获取可用的快捷支付渠道(从支付路由系统获取支持此笔快捷支付交易的支付渠道的交易类型配置相关信息)时,如果失败了,则指定短信发送渠道(短信中心),再次请求支付路由系统,获取到配置的短信中心发送短信交易类型的配置信息,然后请求支付路由系统,支付路由系统组装请求短信中心完成短信的发送。
1.2 短信确认
1.2.1 短信确认(正常情况)
1.2.2 短信确认(异常情况)
支付核心系统首先请求支付网关系统完成短信验证码的核验,通过后请求支付路由系统获取代扣渠道,获取成功则请求支付网关系统发起代扣请求,支付网关组装请求支付渠道的报文,请求支付渠道,完成代扣。
2. 短信确认流程分析
2.1 Service层执行
@Override
public PayCoreResult confirmPay(final QuickPayConfirmRequest request) {
return serviceTemplate.execute(new ServiceCallback<AggregateBase, PayCoreResult>() {
@Override
public AbstractActivePayDomain beforeProcess() throws PayCoreException {
request.check();
QuickPayDomain confirmDomain = quickPayDomainRepository.findByActivePayOrderNo(request.getOrgPayOrderNo(), GwTransEnum.QUICK_PAY_SEND_MSG.getCode());
AssertUtils.isTrue(confirmDomain.getActivePayOrder().getBizStatus().equals(BizStatus.DOING.code()), SystemErrorCode.BIZ_CHECK_ERROR, "支付订单已完成");
AssertUtils.isNotNull(confirmDomain.getCardPayDetail(), SystemErrorCode.DATA_NOT_EXIST, "快捷支付详单不存在");
AssertUtils.isTrue(StringUtils.equals(confirmDomain.getCardPayDetail().getProcessStatus(), ProcessStatus.GW_SUCCESS.code()), SystemErrorCode.BIZ_CHECK_ERROR, "未成功发送短信");
return new QuickPayConfirmDomain(confirmDomain, request.getSmsVerifyCode());
}
@Override
public void execute(AggregateBase domain) throws PayCoreException {
QuickPayConfirmDomain confirmDomain = (QuickPayConfirmDomain) domain;
//CardPayOrder判断银行卡订单类型选择执行:快捷支付确认命令链/银行卡代扣命令链
CardPayOrder cardPayOrder = confirmDomain.getCardPayOrder();
if (QuickPayTypeEnum.QUICK_PAY.getCode().equals(cardPayOrder.getPayType())) {
//快捷确认支付命令链
cardQuickPayConfirmCommandChain.execute(confirmDomain);
} else {
//转系统验证短信,执行代扣命令链
cardDeductReceiptCommandChain.execute(confirmDomain);
}
}
@Override
public PayCoreResult resultProcess(AggregateBase domain) {
QuickPayConfirmDomain confirmDomain = (QuickPayConfirmDomain) domain;
ActivePayOrder activePayOrder = confirmDomain.getActivePayOrder();
//返回结果处理
String bizOrderNo = StringUtils.isNotBlank(activePayOrder.getBizOrderNo()) ? activePayOrder.getBizOrderNo() : activePayOrder.getOutBizNo();
return new PayCoreResult(new QuickConfrimResultVo(
bizOrderNo,
activePayOrder.getPayOrderNo(),
activePayOrder.getOutBizNo(),
activePayOrder.getBizStatus(),
confirmDomain.getVerifyStatus(),
activePayOrder.getRespCode(),
activePayOrder.getRespMsg()));
}
});
}
2.2 快捷支付确认
2.2.1 快捷支付确认命令链
/**
* @author kkk
* @description 快捷支付确认命令链
*/
@Component
public class CardQuickPayConfirmCommandChain extends CommandChain {
@Autowired
public CardQuickPayConfirmCommandChain(UniqueCheckCommand uniqueCheckCommand,
CouponLockCommand couponLockCommand,
CardQuickPayConfirmCommand cardQuickPayConfirmCommand,
CouponModifyCommand couponModifyCommand,
PayResultNotifyBizCommand notifyBizCommand) {
// 1.添加幂等性验证指令
addCommand(uniqueCheckCommand);
// 2.锁定优惠券
addCommand(couponLockCommand);
// 3.发起快捷支付确认:同步返回结果
addCommand(cardQuickPayConfirmCommand);
// 4.解锁优惠券
addCommand(couponModifyCommand);
// 5.通知账务
addCommand(notifyBizCommand);
}
}
2.2.2 流程分析
2.2.3 详解
待补充…
2.3 代扣
2.3.1 代扣命令链
/**
* @author kkk
* @description 银行卡快捷转代扣命令链
*/
@Component
public class CardDeductReceiptCommandChain extends CommandChain {
/**
* 构造函数将具体命令加入命令顺序列表
*/
@Autowired
public CardDeductReceiptCommandChain(UniqueCheckCommand uniqueCheckCommand,
QuickPaySmsVerifyCommand quickPaySmsVerifyCommand,
CouponLockCommand couponLockCommand,
CardDeductReceiptCommand cardDeductReceiptCommand,
CouponModifyCommand couponModifyCommand,
PayResultNotifyBizCommand notifyBizCommand){
// 1.添加幂等性验证指令
addCommand(uniqueCheckCommand);
//2.验证码校验
addCommand(quickPaySmsVerifyCommand);
//3.锁定优惠券
addCommand(couponLockCommand);
//4.发起代扣:同步返回结果
addCommand(cardDeductReceiptCommand);
//5.解锁优惠券
addCommand(couponModifyCommand);
//6.通知账务入账
addCommand(notifyBizCommand);
}
}
2.3.2 流程分析
2.3.3 详解
待补充…
总结
整体脉络还是比较简单的,处理一些细节上还是有很多地方需要注意的。