一、支付成功后事件驱动
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 支付成功事件*/@EventListenerpublic 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 订单信息*/@Overridepublic void execute(ProductOrderDO productOrderDO) {System.out.println("【新购订单支付策略】:" + productOrderDO.getId());}/*** 获取该策略支持的订单类型** @return 订单类型*/@Overridepublic String getSupportedOrderType() {return OrderTypeEnum.PURCHASE.getCode();}
}
3、续费订单支付策略
/*** 续费订单支付策略** @author ronshi* @date 2025/5/12 15:53*/
@Component
public class RenewPaymentSuccessStrategy implements IPaymentSuccessStrategy {/*** 执行方法** @param productOrderDO 订单信息*/@Overridepublic void execute(ProductOrderDO productOrderDO) {System.out.println("【续费订单支付策略】:" + productOrderDO.getId());}/*** 获取该策略支持的订单类型** @return 订单类型*/@Overridepublic 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("没有对应的订单支付策略");}}