一、支付成功后事件驱动
1、支付成功事件
复制代码
/**
* 支付成功事件
*
* @author ronshi
* @date 2025/5/12 14:40
*/
@Getter
@Setter
public class PaymentSuccessEvent extends ApplicationEvent {
private static final long serialVersionUID = 1L;
private ProductOrderDO productOrderDO;
public PaymentSuccessEvent(Object source, ProductOrderDO productOrderDO) {
super(source);
this.productOrderDO = productOrderDO;
}
}
2、事件触发入口
复制代码
@Autowired
private ApplicationEventPublisher eventPublisher;
public Boolean handlePaymentResult(HandlePaymentResultCmd cmd) {
//其他业务逻辑处理
//发布领域事件(解耦后续处理)
eventPublisher.publishEvent(new PaymentSuccessEvent(this, productOrderDO));
return true;
}
3、事件监听器
复制代码
/**
* 支付成功事件监听器
*
* @author ronshi
* @date 2025/5/12 15:20
*/
@RequiredArgsConstructor
@Component
public class PaymentSuccessEventHandler {
private final PaymentSuccessStrategyFactory orderPaymentStrategyFactory;
/**
* 处理支付成功事件
*
* @param event 支付成功事件
*/
@EventListener
public void handleEvent(PaymentSuccessEvent event) {
System.out.println("【处理支付成功事件】:" + event.getProductOrderDO().getId());
IPaymentSuccessStrategy strategy = orderPaymentStrategyFactory.getStrategy(event.getProductOrderDO().getOrderType());
strategy.execute(event.getProductOrderDO());
}
}
二、不同订单类型的策略模式处理
1、订单支付策略
复制代码
/**
* 订单支付策略
*
* @author ronshi
* @date 2025/5/12 14:58
*/
public interface IPaymentSuccessStrategy {
/**
* 执行方法
*
* @param productOrderDO 订单信息
*/
void execute(ProductOrderDO productOrderDO);
/**
* 获取该策略支持的订单类型
*
* @return 订单类型
*/
String getSupportedOrderType();
}
2、新购订单支付策略
复制代码
/**
* 新购订单支付策略
*
* @author ronshi
* @date 2025/5/12 15:51
*/
@Component
public class PurchasePaymentSuccessStrategy implements IPaymentSuccessStrategy {
/**
* 执行方法
*
* @param productOrderDO 订单信息
*/
@Override
public void execute(ProductOrderDO productOrderDO) {
System.out.println("【新购订单支付策略】:" + productOrderDO.getId());
}
/**
* 获取该策略支持的订单类型
*
* @return 订单类型
*/
@Override
public String getSupportedOrderType() {
return OrderTypeEnum.PURCHASE.getCode();
}
}
3、续费订单支付策略
复制代码
/**
* 续费订单支付策略
*
* @author ronshi
* @date 2025/5/12 15:53
*/
@Component
public class RenewPaymentSuccessStrategy implements IPaymentSuccessStrategy {
/**
* 执行方法
*
* @param productOrderDO 订单信息
*/
@Override
public void execute(ProductOrderDO productOrderDO) {
System.out.println("【续费订单支付策略】:" + productOrderDO.getId());
}
/**
* 获取该策略支持的订单类型
*
* @return 订单类型
*/
@Override
public String getSupportedOrderType() {
return OrderTypeEnum.RENEW.getCode();
}
}
4、订单支付策略工厂
复制代码
/**
* 订单支付策略工厂
*
* @author ronshi
* @date 2025/5/12 15:56
*/
@RequiredArgsConstructor
@Component
public class PaymentSuccessStrategyFactory {
private final Map<String, IPaymentSuccessStrategy> strategyMap;
/**
* 获取订单支付策略
*
* @param orderType 订单类型
* @return 订单支付策略
*/
public IPaymentSuccessStrategy getStrategy(String orderType) {
for (IPaymentSuccessStrategy strategy : strategyMap.values()) {
if (strategy.getSupportedOrderType().equals(orderType)) {
return strategy;
}
}
throw new BusinessServiceException("没有对应的订单支付策略");
}
}