ソースを参照

feat : 支付宝回调方法调试修改

bilingfeng 1 年間 前
コミット
615fc0183a

+ 1 - 1
game-module/game-common/src/main/java/com/zanxiang/common/enums/OrderStateEnum.java

@@ -28,7 +28,7 @@ public enum OrderStateEnum {
     SUCCESS_PAY(2, "支付成功"),
 
     /**
-     * 取消
+     * 订单关闭
      */
     CANCEL_PAY(-1, "订单关闭");
 

+ 0 - 16
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/impl/OrderServiceImpl.java

@@ -6,16 +6,13 @@ import com.zanxiang.common.enums.CallBackEnum;
 import com.zanxiang.common.enums.OrderStateEnum;
 import com.zanxiang.common.exception.BaseException;
 import com.zanxiang.common.utils.bean.BeanUtils;
-import com.zanxiang.module.util.DateUtil;
 import com.zanxiang.mybatis.entity.*;
 import com.zanxiang.mybatis.mapper.OrderMapper;
-import com.zanxiang.sdk.constant.RedisKeyConstant;
 import com.zanxiang.sdk.domain.dto.GamePayWayDTO;
 import com.zanxiang.sdk.domain.dto.PlatformOrderDTO;
 import com.zanxiang.sdk.domain.params.ProductPayParam;
 import com.zanxiang.sdk.domain.params.UserData;
 import com.zanxiang.sdk.service.*;
-import com.zanxiang.sdk.util.RedisUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -53,9 +50,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     @Autowired
     private IGamePayWayService gamePayWayService;
 
-    @Autowired
-    private RedisUtil<String> redisUtil;
-
     @Override
     @Transactional(rollbackFor = {Exception.class, RuntimeException.class})
     public Boolean createOrder(ProductPayParam payParam, UserData userData) {
@@ -124,20 +118,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                 .build());
         //设置订单号
         payParam.setOrderId(orderNum);
-        //设置订单过期
-        this.orderExpire(orderNum);
         //返回
         return Boolean.TRUE;
     }
 
-    private void orderExpire(String orderId) {
-        //过期时间
-        double expire = (double) DateUtil.localDateTimeToMilli(LocalDateTime.now().plusMinutes(15));
-        //设置缓存
-        redisUtil.addZSet(RedisKeyConstant.ORDER_EXPIRE, orderId, expire);
-        log.error("订单添加过期缓存, orderId : {}, expire : {}", orderId, expire);
-    }
-
     private String getOrderNum(Long userId) {
         //时间(精确到毫秒)
         DateTimeFormatter ofPattern = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");

+ 45 - 40
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/pay/AliPayService.java

@@ -15,7 +15,6 @@ import com.zanxiang.common.enums.OsEnum;
 import com.zanxiang.common.exception.BaseException;
 import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.module.util.URIUtil;
-import com.zanxiang.module.util.pojo.ResultVO;
 import com.zanxiang.mybatis.entity.Order;
 import com.zanxiang.sdk.domain.bo.ProductPayParamBO;
 import com.zanxiang.sdk.domain.dto.*;
@@ -36,7 +35,6 @@ import org.springframework.web.client.RestTemplate;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.net.URL;
-import java.nio.charset.StandardCharsets;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -54,23 +52,12 @@ public class AliPayService extends PayBaseService {
 
     private Pattern param = Pattern.compile("value=\"(.*)\">", Pattern.CASE_INSENSITIVE);
 
-    /**
-     * 异步回调地址配置
-     */
-    @Value("${payConfig.aliPay.returnUrl}")
-    private String returnUrlConfig;
-
     /**
      * 同步回调地址配置
      */
     @Value("${payConfig.aliPay.notifyUrl}")
     private String notifyUrlConfig;
 
-    /**
-     * 异步回调地址
-     */
-    private String returnUrl;
-
     /**
      * 同步回调地址
      */
@@ -100,7 +87,6 @@ public class AliPayService extends PayBaseService {
         //初始化支付配置
         this.configInit(gamePayWayDTO);
         //回调地址中拼接游戏具体支付方式
-        this.returnUrl = this.returnUrlConfig + "?" + "gamePayWayId=" + this.attach.getGamePayWayId();
         this.notifyUrl = this.notifyUrlConfig + "?" + "gamePayWayId=" + this.attach.getGamePayWayId();
         //支付方式
         int payDevice = product.getPayDevice().intValue();
@@ -119,11 +105,12 @@ public class AliPayService extends PayBaseService {
             default:
                 throw new RuntimeException("未知支付方式");
         }
+        //订单支付添加过期缓存
+        this.orderExpire(product.getOutTradeNo());
         //更新订单商户信息
         orderService.update(new LambdaUpdateWrapper<Order>()
                 .set(Order::getMerchantNo, payMerchant.getMerchantNo())
                 .set(Order::getMerchantName, payMerchant.getMerchantName())
-                .set(Order::getStatus, OrderStateEnum.WAIT_PAY.getCode())
                 .eq(Order::getOrderId, product.getOutTradeNo()));
         //返回结果
         return resultMap;
@@ -134,39 +121,57 @@ public class AliPayService extends PayBaseService {
 
         log.error("支付宝异步回调 ------------>");
 
+        //解密回调参数
+        Map<String, String> params = new HashMap<>(26);
+        Enumeration<String> parameterNames = request.getParameterNames();
+        while (parameterNames.hasMoreElements()) {
+            String parameterName = parameterNames.nextElement();
+            params.put(parameterName, request.getParameter(parameterName));
+        }
+        //订单号orderId
+        String orderNo = request.getParameter("out_trade_no");
+        //订单支付方式id
+        String gamePayWayId = params.get("gamePayWayId");
+        //订单支付结果
+        String tradeStatus = params.get("trade_status");
 
-        try {
-            Map<String, String> params = new HashMap<>();
-            Enumeration<String> parameterNames = request.getParameterNames();
-            while (parameterNames.hasMoreElements()) {
-                String parameterName = parameterNames.nextElement();
-                params.put(parameterName, request.getParameter(parameterName));
-            }
-            String orderNo = request.getParameter("out_trade_no");
-            String gamePayWayId = params.get("gamePayWayId");
-
-            log.error("支付宝异步回调获取到的参数, params : {}", JsonUtil.toString(params));
+        log.error("支付宝异步回调获取到的参数, params : {}", JsonUtil.toString(params));
 
-            //回调地址拼接参数不参加sign验证
-            params.remove("gamePayWayId");
-            //初始化配置
-            configInit(gamePayWayService.getById(Long.valueOf(gamePayWayId)));
-            Boolean flag = Factory.Payment.Common().verifyNotify(params);
-            if (flag) {
-                if (paySuccess(orderNo, params.get("total_amount"), params.get("trade_no"))) {
-                    log.info("支付宝异步回调成功, orderId : {}", orderNo);
-                    return HttpStatusEnum.SUCCESS.getMsg();
-                }
-            }
-            log.error("支付宝异步回调-验证签名失败 request:{}", request);
+        //回调地址拼接参数不参加sign验证
+        params.remove("gamePayWayId");
+        //初始化配置
+        this.configInit(gamePayWayService.getById(Long.valueOf(gamePayWayId)));
+        //支付宝签名认证
+        Boolean verifyNotify;
+        try {
+            verifyNotify = Factory.Payment.Common().verifyNotify(params);
         } catch (Exception e) {
-            e.printStackTrace();
+            log.error("支付宝异步回调-验证签名异常 params : {}, e : {}", JsonUtil.toString(params), e.getMessage());
+            return HttpStatusEnum.FAIL.getMsg();
+        }
+        if (!verifyNotify) {
+            log.error("支付宝异步回调-验证签名失败, params : {}", JsonUtil.toString(params));
+            return HttpStatusEnum.FAIL.getMsg();
         }
-        return HttpStatusEnum.FAIL.getMsg();
+        //签名验证通过, 判断是否支付成功
+        if (Objects.equals("TRADE_SUCCESS", tradeStatus)) {
+            this.paySuccess(orderNo, params.get("total_amount"), params.get("trade_no"));
+        } else {
+            //未支付成功, 订单状态变更为待支付
+            orderService.update(new LambdaUpdateWrapper<Order>()
+                    .set(Order::getStatus, OrderStateEnum.WAIT_PAY.getCode())
+                    .eq(Order::getOrderId, orderNo));
+        }
+        return HttpStatusEnum.SUCCESS.getMsg();
     }
 
     @Override
     public void closeOrder(PlatformOrderDTO platformOrderDTO) {
+        //支付宝预下单的订单不需要关闭
+        if (Objects.equals(platformOrderDTO.getStatus(), OrderStateEnum.READY_PAY.getCode())) {
+            log.error("支付宝预下单订单, 不需要关闭");
+            return;
+        }
         //支付配置
         GamePayWayDTO gamePayWayDTO = gamePayWayService.getGamePayWay(platformOrderDTO.getGameId(),
                 platformOrderDTO.getPayWayId(), platformOrderDTO.getPayDeviceId());

+ 20 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/pay/PayBaseService.java

@@ -4,8 +4,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.zanxiang.common.enums.OrderStateEnum;
 import com.zanxiang.common.exception.BaseException;
+import com.zanxiang.module.util.DateUtil;
 import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.mybatis.entity.Order;
+import com.zanxiang.sdk.constant.RedisKeyConstant;
 import com.zanxiang.sdk.domain.bo.ProductPayAttachParamBO;
 import com.zanxiang.sdk.domain.bo.ProductPayParamBO;
 import com.zanxiang.sdk.domain.dto.GamePayWayDTO;
@@ -13,6 +15,7 @@ import com.zanxiang.sdk.domain.dto.PlatformOrderDTO;
 import com.zanxiang.sdk.listener.OrderPaySuccessEvent;
 import com.zanxiang.sdk.service.IGamePayWayService;
 import com.zanxiang.sdk.service.IOrderService;
+import com.zanxiang.sdk.util.RedisUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationContext;
@@ -45,6 +48,10 @@ public abstract class PayBaseService {
     @Autowired
     private ApplicationContext applicationContext;
 
+    @Lazy
+    @Autowired
+    private RedisUtil<String> redisUtil;
+
     /**
      * 自定义参数
      */
@@ -115,6 +122,19 @@ public abstract class PayBaseService {
         return Boolean.FALSE;
     }
 
+    /**
+     * 订单添加过期时间
+     *
+     * @param orderId : 订单id
+     */
+    public void orderExpire(String orderId) {
+        //过期时间
+        double expire = (double) DateUtil.localDateTimeToMilli(LocalDateTime.now().plusMinutes(3));
+        //设置缓存
+        redisUtil.addZSet(RedisKeyConstant.ORDER_EXPIRE, orderId, expire);
+        log.error("订单添加过期缓存, orderId : {}, expire : {}", orderId, expire);
+    }
+
     /**
      * 支付调起
      *

+ 2 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/pay/WxPayService.java

@@ -126,6 +126,8 @@ public class WxPayService extends PayBaseService {
             default:
                 throw new RuntimeException("未知支付方式");
         }
+        //订单支付添加过期缓存
+        this.orderExpire(product.getOutTradeNo());
         //更新订单商户信息
         orderService.update(new LambdaUpdateWrapper<Order>()
                 .set(Order::getMerchantNo, config.getMchId())