Browse Source

修改订单支付状态查询时超时订单没有及时更新bug

codingliang 1 year ago
parent
commit
0b5b6778f9

+ 1 - 1
src/main/java/com/study/mall/entity/PayOrderEntity.java

@@ -58,7 +58,7 @@ public class PayOrderEntity extends BaseOperateEntity implements Serializable {
 	 */
 	private LocalDateTime payTime;
 	/**
-	 * 状态;1 待付款 2已付款
+	 * 状态;1 待付款 2已付款 0已关闭 3无效订单
 	 */
 	private String state;
 	/**

+ 1 - 1
src/main/java/com/study/mall/service/impl/OrderInfoServiceImpl.java

@@ -297,7 +297,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoDao, OrderInfoEnt
         Long result = redisTemplate.execute(new DefaultRedisScript<>(script, Long.class), Arrays.asList(key), submitToken);
         if (result == 0) {
             // 令牌验证失败
-            throw new RRException(BizCodeEnum.PARAMETER_ERROR, "无效的submitToken");
+            throw new RRException(BizCodeEnum.PARAMETER_ERROR, "请勿重复提交订单");
         }
     }
 

+ 8 - 2
src/main/java/com/study/mall/service/impl/PayOrderServiceImpl.java

@@ -126,11 +126,15 @@ public class PayOrderServiceImpl extends ServiceImpl<PayOrderDao, PayOrderEntity
                         payOrder.setState("2");
                         payOrder.setPayId(wechatPayQueryResultDTO.getTransactionId());
                         payOrder.setPayTime(wechatPayQueryResultDTO.getSuccessTime());
+                    } else if ("CLOSED".equals(wechatPayQueryResultDTO.getTradeState())) {
+                        payOrder.setState("0");
+                    } else if ("ORDER_NOT_EXIST".equals(wechatPayQueryResultDTO.getTradeState())) {
+                        payOrder.setState("3");
                     }
 
                     return payOrder;
                 })
-                .filter(payOrder -> "2".equals(payOrder.getState()))
+                .filter(payOrder -> !"1".equals(payOrder.getState()))
                 .collect(Collectors.toList());
 
         if (collect.size() > 0) {
@@ -138,7 +142,9 @@ public class PayOrderServiceImpl extends ServiceImpl<PayOrderDao, PayOrderEntity
 
             // 更新订单状态
             OrderInfoService orderInfoService = SpringUtil.getBean(OrderInfoService.class);
-            collect.forEach(e -> {
+            collect.stream()
+                    .filter(e -> "2".equals(e.getState()))
+                    .forEach(e -> {
                 orderInfoService.updateStateToSuccess(e.getOrderId());
             });
         }

+ 14 - 0
src/main/java/com/study/mall/third/pay/wechat/WechatPayHandler.java

@@ -198,6 +198,20 @@ public class WechatPayHandler {
             } catch (JsonProcessingException e) {
                 new RRException(BizCodeEnum.PAY_RESULT_QUERY_ERROR);
             }
+        } else {
+            try {
+                JsonNode jsonNode = objectMapper.readTree(response.getBody());
+                String code = jsonNode.get("code").asText();
+                if ("ORDER_NOT_EXIST".equals(code)) {
+                    return WechatPayQueryResultDTO.builder()
+                            .tradeState(code)
+                            .transactionId(null)
+                            .successTime(null)
+                            .build();
+                }
+            } catch (JsonProcessingException e) {
+                new RRException(BizCodeEnum.PAY_RESULT_QUERY_ERROR);
+            }
         }
 
         throw new RRException(BizCodeEnum.PAY_RESULT_QUERY_ERROR, response.getBody());