Преглед на файлове

Merge remote-tracking branch 'origin/package' into package

shishaosong преди 1 година
родител
ревизия
28f61c0a79

+ 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 - 2
game-module/game-sdk/src/main/java/com/zanxiang/sdk/adapter/WebHandlerAdapter.java

@@ -4,7 +4,6 @@ import com.zanxiang.common.enums.DeviceTypeEnum;
 import com.zanxiang.common.enums.HttpStatusEnum;
 import com.zanxiang.common.exception.CustomException;
 import com.zanxiang.common.utils.StringUtils;
-import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.mybatis.entity.GameExt;
 import com.zanxiang.sdk.annotation.UnSignCheck;
 import com.zanxiang.sdk.service.IGameExtService;
@@ -65,7 +64,6 @@ public class WebHandlerAdapter implements HandlerInterceptor {
         }
         //签名验证
         GameExt gameExt = gameExtService.getByGameAppId(gameId);
-        log.error("gameId : {}, sign : {}, timestamp : {}, gameExt : {}", gameId, sign, timestamp, JsonUtil.toString(gameExt));
         if (gameExt == null || Strings.isBlank(gameExt.getAppKey())) {
             log.error("非法参数, 游戏id对应的前端密钥appKey不存在");
             throw new CustomException(HttpStatusEnum.INVALID_PARAMS);

+ 3 - 10
game-module/game-sdk/src/main/java/com/zanxiang/sdk/controller/PayController.java

@@ -62,19 +62,12 @@ public class PayController {
     }
 
     @UnSignCheck
-    @ApiOperation(value = "支付宝支付异步回调(二维码、H5、网站)")
+    @ApiOperation(value = "支付宝支付异步回调")
     @RequestMapping(value = "/notify", method = RequestMethod.POST)
     public String aliPayNotify(HttpServletRequest request, HttpServletResponse response) throws IOException {
         return orderPayService.notify(request, response, PayWayEnum.ALI_PAY.getPayWayId());
     }
 
-    @UnSignCheck
-    @ApiOperation(value = "支付宝支付同步回调(二维码、H5、网站)")
-    @RequestMapping(value = "/alipaySynNotify", method = RequestMethod.GET)
-    public ResultVO synNotify(HttpServletRequest request) {
-        return orderPayService.synNotify(request, PayWayEnum.ALI_PAY.getPayWayId());
-    }
-
     @UnSignCheck
     @ApiOperation(value = "微信支付异步回调")
     @RequestMapping(value = "/wxPayNotify", method = RequestMethod.POST)
@@ -82,10 +75,10 @@ public class PayController {
         return orderPayService.notify(request, response, PayWayEnum.WX_PAY.getPayWayId());
     }
 
-    @ApiOperation(value = "微信米大师支付同步回调")
+    @ApiOperation(value = "米大师支付异步回调")
     @RequestMapping(value = "/miPayNotify", method = RequestMethod.GET)
     public ResultVO<Map> miPayNotify(@RequestParam String orderId, @ValidLogin UserData userData) {
-        return ResultVO.ok(miPayService.paySynNotify(orderId));
+        return ResultVO.ok(miPayService.notify(orderId));
     }
 
     @ApiOperation(value = "获取订单支付结果")

+ 0 - 10
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/IOrderPayService.java

@@ -1,7 +1,6 @@
 package com.zanxiang.sdk.service;
 
 import com.zanxiang.common.domain.ResultMap;
-import com.zanxiang.module.util.pojo.ResultVO;
 import com.zanxiang.sdk.domain.params.ProductPayParam;
 import com.zanxiang.sdk.domain.params.UserData;
 import com.zanxiang.sdk.domain.vo.PayParamVO;
@@ -55,15 +54,6 @@ public interface IOrderPayService {
      */
     String notify(HttpServletRequest request, HttpServletResponse response, Integer payType) throws IOException;
 
-    /**
-     * 异步回调
-     *
-     * @param request : 请求参数
-     * @param payType : 支付类型
-     * @return {@link ResultMap}
-     */
-    ResultVO synNotify(HttpServletRequest request, Integer payType);
-
     /**
      * 订单支付结果查询
      *

+ 14 - 8
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/impl/OrderPayServiceImpl.java

@@ -7,7 +7,6 @@ import com.zanxiang.common.enums.PayDeviceEnum;
 import com.zanxiang.common.exception.BaseException;
 import com.zanxiang.common.utils.SpringUtils;
 import com.zanxiang.module.util.JsonUtil;
-import com.zanxiang.module.util.pojo.ResultVO;
 import com.zanxiang.module.web.util.IpUtil;
 import com.zanxiang.mybatis.entity.Order;
 import com.zanxiang.mybatis.entity.OrderPayParam;
@@ -105,10 +104,24 @@ public class OrderPayServiceImpl implements IOrderPayService {
 
     @Override
     public Long getAppletPayDevice(UserData userData) {
+
+        log.error("获取支付类型参数, 请求信息 userData : {}", JsonUtil.toString(userData));
+
+        //todo : 小游戏为了方便CP调试, 直接全部返回米大师支付
         //查询游戏配置的支付方式
         List<GamePayWayDTO> gamePayWayList = gamePayWayService.listOfGameId(userData.getGameId());
+
         //支付方式
         GamePayWayDTO gamePayWayDTO = null;
+
+        gamePayWayDTO = gamePayWayList.stream().filter(gamePayWay ->
+                Objects.equals(gamePayWay.getPayDeviceId(), PayDeviceEnum.MI_PAY.getPayDeviceId()))
+                .findFirst().orElse(null);
+        if (gamePayWayDTO != null) {
+            return gamePayWayDTO.getPayDeviceId();
+        }
+
+
         //android用户, 游戏适配米大师支付
         if (Objects.equals(userData.getDeviceSystem(), DeviceTypeEnum.DEVICE_TYPE_ANDROID.getDescribe())) {
             gamePayWayDTO = gamePayWayList.stream().filter(gamePayWay ->
@@ -180,13 +193,6 @@ public class OrderPayServiceImpl implements IOrderPayService {
         return service.notify(request, response);
     }
 
-    @Override
-    public ResultVO synNotify(HttpServletRequest request, Integer payType) {
-        PayTypeEnum payTypeEnum = PayTypeEnum.getByPayType(payType);
-        PayBaseService service = SpringUtils.getBean(payTypeEnum.getClazz());
-        return service.synNotify(request);
-    }
-
     @Override
     public Boolean payResult(String orderId) {
         Order order = orderService.getOne(new LambdaQueryWrapper<Order>()

+ 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");

+ 1 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/impl/UserTokenServiceImpl.java

@@ -84,6 +84,7 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken
             log.error("md5工具类加密异常, str : {}, e : {}", sb.toString(), e.getMessage());
             throw new BaseException("MD5加密异常");
         }
+        log.error("sb : {}, mySign : {}, sign : {}", sb.toString(), mySign, sign);
         //签名错误
         if (!Objects.equals(mySign, sign)) {
             return ResultVO.fail(TokenCheckEnum.CHECK_FAIL.getMsg());

+ 75 - 91
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/pay/AliPayService.java

@@ -4,7 +4,7 @@ import com.alipay.easysdk.factory.Factory;
 import com.alipay.easysdk.kernel.Config;
 import com.alipay.easysdk.kernel.util.ResponseChecker;
 import com.alipay.easysdk.payment.app.models.AlipayTradeAppPayResponse;
-import com.alipay.easysdk.payment.common.models.AlipayTradeCloseResponse;
+import com.alipay.easysdk.payment.common.models.AlipayTradeQueryResponse;
 import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse;
 import com.alipay.easysdk.payment.wap.models.AlipayTradeWapPayResponse;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -13,9 +13,9 @@ import com.zanxiang.common.enums.HttpStatusEnum;
 import com.zanxiang.common.enums.OrderStateEnum;
 import com.zanxiang.common.enums.OsEnum;
 import com.zanxiang.common.exception.BaseException;
+import com.zanxiang.module.util.DateUtil;
 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 +36,7 @@ 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.time.LocalDateTime;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -55,31 +55,30 @@ public class AliPayService extends PayBaseService {
     private Pattern param = Pattern.compile("value=\"(.*)\">", Pattern.CASE_INSENSITIVE);
 
     /**
-     * 异步回调地址配置
+     * 支付成功
      */
-    @Value("${payConfig.aliPay.returnUrl}")
-    private String returnUrlConfig;
+    private static final String TRADE_STATUS_SUCCESS = "TRADE_SUCCESS";
 
     /**
-     * 同步回调地址配置
+     * 订单关闭
      */
-    @Value("${payConfig.aliPay.notifyUrl}")
-    private String notifyUrlConfig;
+    private static final String TRADE_STATUS_CLOSED = "TRADE_CLOSED";
 
     /**
-     * 异步回调地址
+     * 订单超时自动关闭时间
      */
-    private String returnUrl;
+    private static final long TIME_EXPIRE = 2L;
 
     /**
-     * 同步回调地址
+     * 同步回调地址配置
      */
-    private String notifyUrl;
+    @Value("${payConfig.aliPay.notifyUrl}")
+    private String notifyUrlConfig;
 
     /**
-     * 支付配置
+     * 同步回调地址
      */
-    private Config config;
+    private String notifyUrl;
 
     /**
      * 商户信息
@@ -100,7 +99,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 +117,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;
@@ -131,72 +130,49 @@ public class AliPayService extends PayBaseService {
 
     @Override
     public String notify(HttpServletRequest request, HttpServletResponse response) {
-        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");
-            //回调地址拼接参数不参加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);
-        } catch (Exception e) {
-            e.printStackTrace();
+        log.error("支付宝异步回调 -------start----->");
+        //解密回调参数
+        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));
         }
-        return HttpStatusEnum.FAIL.getMsg();
-    }
-
-    @Override
-    public ResultVO synNotify(HttpServletRequest request) {
+        //订单号orderId
+        String orderNo = request.getParameter("out_trade_no");
+        //订单支付结果
+        String tradeStatus = params.get("trade_status");
+        //订单支付方式id, 因为回调地址拼接参数不参加sign验证, 所以这里使用移除
+        String gamePayWayId = params.remove("gamePayWayId");
+        log.error("支付宝异步回调获取到的参数, gamePayWayId : {},  params : {}", gamePayWayId, JsonUtil.toString(params));
+        //初始化配置
+        this.configInit(gamePayWayService.getById(Long.valueOf(gamePayWayId)));
+        //支付宝签名认证
+        Boolean verifyNotify;
         try {
-            //获取支付宝GET过来反馈信息
-            Map<String, String> params = new HashMap<>();
-            Map<String, String[]> requestParams = request.getParameterMap();
-            for (String name : requestParams.keySet()) {
-                String[] values = requestParams.get(name);
-                String valueStr = "";
-                for (int i = 0; i < values.length; i++) {
-                    valueStr = (i == values.length - 1) ? valueStr + values[i]
-                            : valueStr + values[i] + ",";
-                }
-                //乱码解决,这段代码在出现乱码时使用
-                valueStr = new String(valueStr.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
-                params.put(name, valueStr);
-            }
-            //商户订单号
-            String orderNo = new String(request.getParameter("out_trade_no").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
-            String gamePayWayId = params.get("gamePayWayId");
-            //回调地址拼接参数不参加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 ResultVO.ok();
-                }
-            }
-            log.error("支付宝同步回调验证签名结果失败, orderId : {}", orderNo);
-            return ResultVO.fail(HttpStatusEnum.FAIL.getMsg());
+            verifyNotify = Factory.Payment.Common().verifyNotify(params);
         } catch (Exception e) {
-            e.printStackTrace();
-            //处理异常信息
-            return ResultVO.fail(e.getMessage());
+            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();
+        }
+        //签名验证通过, 判断是否支付成功
+        if (Objects.equals(TRADE_STATUS_SUCCESS, tradeStatus)) {
+            this.paySuccess(orderNo, params.get("total_amount"), params.get("trade_no"));
         }
+        //订单自动关闭
+        if (Objects.equals(TRADE_STATUS_CLOSED, tradeStatus)) {
+            orderService.update(new LambdaUpdateWrapper<Order>()
+                    .set(Order::getStatus, OrderStateEnum.CANCEL_PAY.getCode())
+                    .set(Order::getUpdateTime, LocalDateTime.now())
+                    .eq(Order::getOrderId, orderNo));
+        }
+        //返回消息接收成功
+        log.error("支付宝异步回调 -------end----->");
+        return HttpStatusEnum.SUCCESS.getMsg();
     }
 
     @Override
@@ -206,16 +182,23 @@ public class AliPayService extends PayBaseService {
                 platformOrderDTO.getPayWayId(), platformOrderDTO.getPayDeviceId());
         //初始化配置
         this.configInit(gamePayWayDTO);
-        //取消订单
-        AlipayTradeCloseResponse response;
+        //订单id
+        String orderId = platformOrderDTO.getOrderId();
+        //查询订单
+        AlipayTradeQueryResponse queryResponse;
         try {
-            response = Factory.Payment.Common().close(platformOrderDTO.getOrderId());
-            if (ResponseChecker.success(response)) {
-                return;
-            }
-            log.error("支付宝取消订单失败, platformOrderDTO : {}, response : {}", JsonUtil.toString(platformOrderDTO), JsonUtil.toString(response));
+            queryResponse = Factory.Payment.Common().query(orderId);
         } catch (Exception e) {
-            log.error("支付宝取消订单异常, platformOrderDTO : {}, e:{}", JsonUtil.toString(platformOrderDTO), e.getMessage());
+            log.error("关闭订单查询订单信息异常, orderId : {}, e : {}", orderId, e.getMessage());
+            return;
+        }
+        //未下单的订单, 直接取消(后续如果用户成功支付, 也是可以收到支付成功的回调的)
+        if (!ResponseChecker.success(queryResponse)) {
+            log.error("关闭订单查询订单信息不存在, orderId : {}, queryResponse : {}", orderId, JsonUtil.toString(queryResponse));
+            orderService.update(new LambdaUpdateWrapper<Order>()
+                    .set(Order::getStatus, OrderStateEnum.CANCEL_PAY.getCode())
+                    .set(Order::getUpdateTime, LocalDateTime.now())
+                    .eq(Order::getOrderId, orderId));
         }
     }
 
@@ -223,7 +206,8 @@ public class AliPayService extends PayBaseService {
         AlipayTradeWapPayResponse response;
         try {
             response = Factory.Payment.Wap().asyncNotify(notifyUrl)
-                    .pay(product.getSubject(), product.getOutTradeNo(), product.getTotalFee(), "", this.returnUrl);
+                    .optional("time_expire", DateUtil.formatLocalDateTime(LocalDateTime.now().plusMinutes(TIME_EXPIRE)))
+                    .pay(product.getSubject(), product.getOutTradeNo(), product.getTotalFee(), "", "");
         } catch (Exception e) {
             log.error("支付宝H5支付异常, product : {}, e:{}", JsonUtil.toString(product), e.getMessage());
             throw new BaseException("支付宝H5支付异常");
@@ -325,7 +309,8 @@ public class AliPayService extends PayBaseService {
         AlipayTradePagePayResponse response;
         try {
             response = Factory.Payment.Page().asyncNotify(notifyUrl)
-                    .pay(product.getSubject(), product.getOutTradeNo(), product.getTotalFee(), this.returnUrl);
+                    .optional("time_expire", DateUtil.formatLocalDateTime(LocalDateTime.now().plusMinutes(TIME_EXPIRE)))
+                    .pay(product.getSubject(), product.getOutTradeNo(), product.getTotalFee(), "");
         } catch (Exception e) {
             log.error("支付宝pc端支付异常, product : {}, e:{}", JsonUtil.toString(product), e.getMessage());
             throw new BaseException("支付宝pc端支付异常");
@@ -345,6 +330,7 @@ public class AliPayService extends PayBaseService {
         AlipayTradeAppPayResponse response;
         try {
             response = Factory.Payment.App().asyncNotify(notifyUrl)
+                    .optional("time_expire", DateUtil.formatLocalDateTime(LocalDateTime.now().plusMinutes(TIME_EXPIRE)))
                     .pay(product.getSubject(), product.getOutTradeNo(), product.getTotalFee());
         } catch (Exception e) {
             log.error("支付宝app端支付异常, product : {}, e:{}", JsonUtil.toString(product), e.getMessage());
@@ -375,7 +361,5 @@ public class AliPayService extends PayBaseService {
         //赋值配置信息
         Config config = JsonUtil.toObj(JsonUtil.toString(payConfigMap), Config.class);
         Factory.setOptions(config);
-        this.config = JsonUtil.toObj(JsonUtil.toString(payConfigMap), Config.class);
-        log.error("初始化的支付配置信息, config : {}", JsonUtil.toString(this.config));
     }
 }

+ 38 - 40
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/pay/MiPayService.java

@@ -8,7 +8,6 @@ import com.zanxiang.common.exception.CustomException;
 import com.zanxiang.common.utils.StringUtils;
 import com.zanxiang.common.utils.URIUtil;
 import com.zanxiang.module.util.JsonUtil;
-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.*;
@@ -28,6 +27,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.nio.charset.StandardCharsets;
+import java.time.LocalDateTime;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
@@ -72,39 +72,6 @@ public class MiPayService extends PayBaseService {
      */
     private MiPayConfigDTO config;
 
-    public Map<String, Object> paySynNotify(String orderId) {
-
-        log.error("米大师支付回调 orderId : {}", orderId);
-
-        //查询订单
-        PlatformOrderDTO platformOrderDTO = orderService.getByOrderId(orderId);
-        if (platformOrderDTO == null) {
-            log.error("参数错误, 订单信息不存在! orderId : {}", orderId);
-            throw new BaseException("参数错误, 订单信息不存在");
-        }
-        this.configInit(platformOrderDTO.getGameId());
-        //获取用户openId
-        UserDTO userDTO = userService.getUserByUserId(platformOrderDTO.getUserId());
-        String openId = userDTO.getOpenId();
-        String sessionKey = userDTO.getSessionKey();
-        //获取米大师钱包余额
-        Long balance = this.midasGetBalance(openId, sessionKey);
-        //余额不足, 无法扣除
-        if (balance < platformOrderDTO.getAmount().longValue()) {
-            log.error("米大师游戏币不足, 无法扣除! balance : {}, orderId : {}", balance, orderId);
-            throw new BaseException("米大师游戏币不足, 无法扣除!");
-        }
-        //余额充足, 直接扣除
-        String billNo = this.midasPay(openId, sessionKey, platformOrderDTO.getAmount(), platformOrderDTO.getOrderId());
-        //支付成功
-        this.paySuccess(platformOrderDTO.getOrderId(), platformOrderDTO.getAmount().toString(), config.getAppId());
-        //返回参数
-        Map<String, Object> payParamMap = new HashMap<>(2);
-        payParamMap.put("status", "0");
-        payParamMap.put("billNo", billNo);
-        return payParamMap;
-    }
-
     @Override
     public Map<String, Object> create(ProductPayParamBO product, GamePayWayDTO gamePayWayDTO) {
         //查询订单
@@ -273,18 +240,49 @@ public class MiPayService extends PayBaseService {
         return hexString.toString();
     }
 
-    @Override
-    public String notify(HttpServletRequest request, HttpServletResponse response) {
-        throw new BaseException("米大师支付不存在异步回调");
+    public Map<String, Object> notify(String orderId) {
+        log.error("米大师支付回调 orderId : {}", orderId);
+        //查询订单
+        PlatformOrderDTO platformOrderDTO = orderService.getByOrderId(orderId);
+        if (platformOrderDTO == null) {
+            log.error("参数错误, 订单信息不存在! orderId : {}", orderId);
+            throw new BaseException("参数错误, 订单信息不存在");
+        }
+        this.configInit(platformOrderDTO.getGameId());
+        //获取用户openId
+        UserDTO userDTO = userService.getUserByUserId(platformOrderDTO.getUserId());
+        String openId = userDTO.getOpenId();
+        String sessionKey = userDTO.getSessionKey();
+        //获取米大师钱包余额
+        Long balance = this.midasGetBalance(openId, sessionKey);
+        //余额不足, 无法扣除
+        if (balance < platformOrderDTO.getAmount().longValue()) {
+            log.error("米大师游戏币不足, 无法扣除! balance : {}, orderId : {}", balance, orderId);
+            throw new BaseException("米大师游戏币不足, 无法扣除!");
+        }
+        //余额充足, 直接扣除
+        String billNo = this.midasPay(openId, sessionKey, platformOrderDTO.getAmount(), platformOrderDTO.getOrderId());
+        //支付成功
+        this.paySuccess(platformOrderDTO.getOrderId(), platformOrderDTO.getAmount().toString(), config.getAppId());
+        //返回参数
+        Map<String, Object> payParamMap = new HashMap<>(2);
+        payParamMap.put("status", "0");
+        payParamMap.put("billNo", billNo);
+        return payParamMap;
     }
 
     @Override
-    public ResultVO synNotify(HttpServletRequest request) {
-        throw new BaseException("米大师支付不存在同步回调");
+    public String notify(HttpServletRequest request, HttpServletResponse response) {
+        throw new BaseException("米大师支付不存在通用异步回调");
     }
 
     @Override
     public void closeOrder(PlatformOrderDTO platformOrderDTO) {
-        log.error("米大师支付不存在取消订单");
+        String orderId = platformOrderDTO.getOrderId();
+        log.error("米大师超时未支付, 订单取消, orderId : {}", orderId);
+        orderService.update(new LambdaUpdateWrapper<Order>()
+                .set(Order::getStatus, OrderStateEnum.CANCEL_PAY.getCode())
+                .set(Order::getUpdateTime, LocalDateTime.now())
+                .eq(Order::getOrderId, orderId));
     }
 }

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

@@ -4,9 +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.module.util.pojo.ResultVO;
 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;
@@ -14,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;
@@ -46,6 +48,10 @@ public abstract class PayBaseService {
     @Autowired
     private ApplicationContext applicationContext;
 
+    @Lazy
+    @Autowired
+    private RedisUtil<String> redisUtil;
+
     /**
      * 自定义参数
      */
@@ -116,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(5));
+        //设置缓存
+        redisUtil.addZSet(RedisKeyConstant.ORDER_EXPIRE, orderId, expire);
+        log.error("订单添加过期缓存, orderId : {}, expire : {}", orderId, expire);
+    }
+
     /**
      * 支付调起
      *
@@ -135,14 +154,6 @@ public abstract class PayBaseService {
      */
     public abstract String notify(HttpServletRequest request, HttpServletResponse response) throws IOException;
 
-    /**
-     * 支付同步回调
-     *
-     * @param request : 回调参数
-     * @return : 返回回调结果
-     */
-    public abstract ResultVO synNotify(HttpServletRequest request);
-
     /**
      * 关闭订单
      *

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

@@ -8,7 +8,6 @@ import com.zanxiang.common.enums.OrderStateEnum;
 import com.zanxiang.common.enums.PayDeviceEnum;
 import com.zanxiang.common.exception.BaseException;
 import com.zanxiang.module.util.JsonUtil;
-import com.zanxiang.module.util.pojo.ResultVO;
 import com.zanxiang.mybatis.entity.Order;
 import com.zanxiang.mybatis.entity.OrderPayParam;
 import com.zanxiang.sdk.constant.WxPayConstants;
@@ -127,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())
@@ -369,11 +370,5 @@ public class WxPayService extends PayBaseService {
         payConfigBO.setMachName(payMerchantDTO.getMerchantName());
         //赋值配置信息
         this.config = payConfigBO;
-        log.error("初始化的支付配置信息, config : {}", JsonUtil.toString(this.config));
-    }
-
-    @Override
-    public ResultVO synNotify(HttpServletRequest request) {
-        throw new BaseException("微信支付不存在同步回调!");
     }
 }