支付取消bug:
当用户支付后,订单处于等待回调状态,且在程序里此时没有任何方法可以判断订单此时的状态,如果此时定时取消任务启动,会认为订单还处于待支付中,就会将订单取消。
订单支付后,显示订单未支付bug:
用户第一次支付,订单此时关联的是第一次生成的外部订单,当用户完成支付后,订单处于等待回调状态,如果此时再次调用支付,订单就会关联第二次支付的外部订单,而用户实际支付的是第一次的外部订单。
以上解决办法就是加一个状态,考虑到多实例部署时的状态共享问题,可以使用redis实现:
多商户代码:
文件 :src/main/java/com/zbkj/service/service/impl/PayServiceImpl.java
@Resource//引入redis操作工具
private RedisUtil redisUtil;
@Override
public OrderPayResultResponse payment(OrderPayRequest orderPayRequest) {
//。。。
//源代码中的校验。。。
//改动==================
String KEY = "ORDER:PAID:" + order.getOrderNo();
Boolean setIfAbsent = redisUtil.getRedisTemplate().opsForValue().setIfAbsent(KEY, 1, Duration.ofMinutes(3));
//如果设置成功说明第一次支付,失败则是重复支付
if (!Boolean.TRUE.equals(setIfAbsent)) {
throw new CrmebException(OrderResultCode.ORDER_PAID);
}
try {
//支付处理。。。
return response;
} catch (Exception e) {
//失败删除
redisUtil.getRedisTemplate().delete(KEY);
throw new RuntimeException(e);
}
//改动==================
}
修改订单取消逻辑
文件:src/main/java/com/zbkj/service/service/impl/OrderTaskServiceImpl.java
/**
* 支付订单自动取消
*
* @param orderNo 订单编号
*/
private Boolean orderAutoCancel(String orderNo