Jelajahi Sumber

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

zhangxianyu 1 tahun lalu
induk
melakukan
9b8e8a1a81

+ 1 - 1
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java

@@ -23,7 +23,7 @@ public class ManageApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(ManageApplication.class, args);
-        System.out.println("赞象Manage服务启动成功 <Websocket客服系统优化处理06> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象Manage服务启动成功 <Websocket客服支付订单只发送一次> ( ´・・)ノ(._.`) \n" +
                 "___  ___  ___   _   _   ___  _____  _____ \n" +
                 "|  \\/  | / _ \\ | \\ | | / _ \\|  __ \\|  ___|\n" +
                 "| .  . |/ /_\\ \\|  \\| |/ /_\\ \\ |  \\/| |__  \n" +

+ 25 - 15
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/KfAppletMsgServiceImpl.java

@@ -119,21 +119,9 @@ public class KfAppletMsgServiceImpl implements IKfAppletMsgService {
         KfRoomMsg kfRoomMsg = this.transform(kfAppletMsgDTO, gameApplet, kfRoom, postData, msgContent);
         //判断是否请求支付链接
         String orderId = redisUtil.getCache(RedisKeyConstant.GAME_CUSTOM_PAY_SIGN + kfAppletMsgDTO.getFromUserName());
-        //存在客服支付订单
-        if (Strings.isNotBlank(orderId)) {
-            //收到的是充值消息或者小程序消息, 回复充值链接
-            if (KfAppletMsgDTO.MSG_CONTENT_PAY.contains(kfAppletMsgDTO.getContent())
-                    || Objects.equals(kfAppletMsgDTO.getMsgType(), KfRoomMsgTypeEnum.KF_MSG_TYPE_MINI_APP.getValue())) {
-                Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderId, orderId));
-                //存在待支付的客服支付订单, 判断订单状态
-                if (Objects.equals(order.getStatus(), OrderStatusEnum.READY_PAY.getValue())
-                        || Objects.equals(order.getStatus(), OrderStatusEnum.WAIT_PAY.getValue())) {
-                    this.sendCustomPayMessage(gameApplet.getGameId(), kfAppletMsgDTO.getFromUserName(), kfRoom, order);
-                    kfRoomMsg.setReadStatus(Boolean.TRUE);
-                    kfRoomMsgService.save(kfRoomMsg);
-                    return;
-                }
-            }
+        //客服订单处理
+        if (Strings.isNotBlank(orderId) && this.orderHandle(orderId, gameApplet.getGameId(), kfAppletMsgDTO, kfRoom, kfRoomMsg)) {
+            return;
         }
         //保存房间消息
         kfRoomMsgService.save(kfRoomMsg);
@@ -149,6 +137,26 @@ public class KfAppletMsgServiceImpl implements IKfAppletMsgService {
         this.pushMessage(this.transform(kfRoom, gameApplet.getGameId(), kfRoomMsg, msgContent));
     }
 
+    private boolean orderHandle(String orderId, Long gameId, KfAppletMsgDTO kfAppletMsgDTO, KfRoom kfRoom, KfRoomMsg kfRoomMsg) {
+        //判断收到的消息是否为充值消息或者小程序消息
+        if (!KfAppletMsgDTO.MSG_CONTENT_PAY.contains(kfAppletMsgDTO.getContent())
+                && !Objects.equals(kfAppletMsgDTO.getMsgType(), KfRoomMsgTypeEnum.KF_MSG_TYPE_MINI_APP.getValue())) {
+            return Boolean.FALSE;
+        }
+        //查询订单
+        Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderId, orderId));
+        //判断订单是否为预下单和待支付状态
+        if (!Objects.equals(order.getStatus(), OrderStatusEnum.READY_PAY.getValue())
+                && !Objects.equals(order.getStatus(), OrderStatusEnum.WAIT_PAY.getValue())) {
+            return Boolean.FALSE;
+        }
+        //发送客服支付消息
+        this.sendCustomPayMessage(gameId, kfAppletMsgDTO.getFromUserName(), kfRoom, order);
+        kfRoomMsg.setReadStatus(Boolean.TRUE);
+        kfRoomMsgService.save(kfRoomMsg);
+        return Boolean.TRUE;
+    }
+
     private void eventMsgHandle(GameApplet gameApplet, KfAppletMsgDTO kfAppletMsgDTO) {
         //事件类型
         String event = kfAppletMsgDTO.getEvent();
@@ -341,6 +349,8 @@ public class KfAppletMsgServiceImpl implements IKfAppletMsgService {
         //返回发送的消息内容
         log.error("客服支付, 发送支付信息 : {}", JsonUtil.toString(msgParamMap));
         kfRoomMsgService.save(this.transform(openId, gameId, kfRoom, JsonUtil.toString(msgParamMap)));
+        //删除待支付订单标记
+        redisUtil.deleteCache(RedisKeyConstant.GAME_CUSTOM_PAY_SIGN + openId);
     }
 
     private KfRoomMsg transform(String openId, Long gameId, KfRoom kfRoom, String msgContent) {

+ 1 - 1
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/SDKApplication.java

@@ -23,7 +23,7 @@ public class SDKApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(SDKApplication.class, args);
-        System.out.println("赞象SDK服务启动成功 <新增客服气泡接口> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <解决线上BUg01> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +

+ 1 - 3
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/OrderPayServiceImpl.java

@@ -102,7 +102,7 @@ public class OrderPayServiceImpl implements IOrderPayService {
 
     private void payParamCreate(String code, String openId, Order order, HttpServletRequest request) {
         //上锁
-        if (!distributedLockComponent.doLock(RedisKeyConstant.GET_PAY_PARAM_LOCK + order.getOrderId(), 0L, 1L, TimeUnit.MINUTES)) {
+        if (!distributedLockComponent.doLock(RedisKeyConstant.GET_PAY_PARAM_LOCK + order.getOrderId(), 0L, 3L, TimeUnit.MINUTES)) {
             return;
         }
         //创建支付参数
@@ -111,8 +111,6 @@ public class OrderPayServiceImpl implements IOrderPayService {
         PayTypeEnum payTypeEnum = PayTypeEnum.getByPayType(productPayParamDTO.getPayWay().intValue());
         PayBaseService service = SpringUtils.getBean(payTypeEnum.getClazz());
         service.payCreate(productPayParamDTO);
-        //释放锁
-        distributedLockComponent.unlock(RedisKeyConstant.GET_PAY_PARAM_LOCK + order.getOrderId());
     }
 
     private ProductPayParamDTO transform(Order order, String code, String openId, String ip) {

+ 40 - 48
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/UserTokenServiceImpl.java

@@ -29,6 +29,8 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import reactor.util.function.Tuple2;
+import reactor.util.function.Tuples;
 
 import java.time.LocalDateTime;
 import java.util.Objects;
@@ -68,39 +70,18 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken
         }
         //用户信息
         User user = userService.getById(userId);
-        //查询token是否存在
-        UserToken userToken = super.getOne(new LambdaQueryWrapper<UserToken>()
-                .eq(UserToken::getToken, token)
-                .eq(UserToken::getUserId, userId));
-        //导量用户携带的是 relationUserId 匹配的token
-        if (userToken == null && user.getRelationUserId() != null) {
-            userToken = super.getOne(new LambdaQueryWrapper<UserToken>()
-                    .eq(UserToken::getToken, token)
-                    .eq(UserToken::getUserId, user.getRelationUserId()));
-        }
+        //获取检测token
+        UserToken userToken = this.getCheckUserToken(userId, token, user.getRelationUserId());
         //判断token是否存在, 并且没有过期
         if (userToken == null || userToken.getExpireTime() < DateUtils.localDateTimeToSecond(LocalDateTime.now())) {
             log.error("token验证失败 , token不存在或者已经失效, appId : {}, userId : {}, token : {}", appId, userId, token);
             return ResultVO.fail(TokenCheckEnum.SIGN_ERROR.getMsg());
         }
-        //登录密钥
-        String loginKey = gameExt.getLoginKey();
-        //计算用户签名
-        StringBuilder sb = new StringBuilder();
-        sb.append("loginKey=").append(loginKey);
-        sb.append("&appId=").append(appId);
-        sb.append("&userId=").append(userId);
-        sb.append("&token=").append(token);
-        String mySign;
-        try {
-            mySign = SignUtil.MD5(sb.toString());
-        } catch (Exception e) {
-            log.error("md5工具类加密异常, str : {}, e : {}", sb.toString(), e.getMessage());
-            throw new BaseException("MD5加密异常");
-        }
+        //获取计算签名
+        Tuple2<String, String> tuple2 = this.getMySign(gameExt, userId, token);
         //签名错误
-        if (!Objects.equals(mySign, sign)) {
-            log.error("token验证失败 , str : {}, mySign : {}, sign : {}", sb.toString(), mySign, sign);
+        if (!Objects.equals(tuple2.getT2(), sign)) {
+            log.error("token验证失败 , str : {}, mySign : {}, sign : {}", tuple2.getT1(), tuple2.getT2(), sign);
             return ResultVO.fail(TokenCheckEnum.CHECK_FAIL.getMsg());
         }
         //构造返回
@@ -120,27 +101,28 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken
         }
         //用户信息
         User user = userService.getById(userId);
-        //查询token是否存在
-        UserToken userToken = super.getOne(new LambdaQueryWrapper<UserToken>()
-                .eq(UserToken::getToken, token)
-                .eq(UserToken::getUserId, userId));
-        //导量用户携带的是 relationUserId 匹配的token
-        if (userToken == null && user.getRelationUserId() != null) {
-            userToken = super.getOne(new LambdaQueryWrapper<UserToken>()
-                    .eq(UserToken::getToken, token)
-                    .eq(UserToken::getUserId, user.getRelationUserId()));
-        }
+        //获取检测token
+        UserToken userToken = this.getCheckUserToken(userId, token, user.getRelationUserId());
         //判断token是否存在, 并且没有过期
         if (userToken == null || userToken.getExpireTime() < DateUtils.localDateTimeToSecond(LocalDateTime.now())) {
             log.error("token验证失败 , token不存在或者已经失效, appId : {}, userId : {}, token : {}", appId, userId, token);
             return ResultVO.fail(TokenCheckEnum.SIGN_ERROR.getMsg());
         }
-        //登录密钥
-        String loginKey = gameExt.getLoginKey();
+        //获取计算签名
+        Tuple2<String, String> tuple2 = this.getMySign(gameExt, userId, token);
+        //签名错误
+        if (!Objects.equals(tuple2.getT2(), sign)) {
+            log.error("token验证失败 , str : {}, mySign : {}, sign : {}", tuple2.getT1(), tuple2.getT2(), sign);
+            return ResultVO.fail(TokenCheckEnum.CHECK_FAIL.getMsg());
+        }
+        return ResultVO.ok(userId);
+    }
+
+    private Tuple2<String, String> getMySign(GameExt gameExt, Long userId, String token) {
         //计算用户签名
         StringBuilder sb = new StringBuilder();
-        sb.append("loginKey=").append(loginKey);
-        sb.append("&appId=").append(appId);
+        sb.append("loginKey=").append(gameExt.getLoginKey());
+        sb.append("&appId=").append(gameExt.getAppId());
         sb.append("&userId=").append(userId);
         sb.append("&token=").append(token);
         String mySign;
@@ -150,14 +132,24 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken
             log.error("md5工具类加密异常, str : {}, e : {}", sb.toString(), e.getMessage());
             throw new BaseException("MD5加密异常");
         }
-        //签名错误
-        if (!Objects.equals(mySign, sign)) {
-            log.error("token验证失败 , str : {}, mySign : {}, sign : {}", sb.toString(), mySign, sign);
-            return ResultVO.fail(TokenCheckEnum.CHECK_FAIL.getMsg());
+        return Tuples.of(sb.toString(), mySign);
+    }
+
+    private UserToken getCheckUserToken(Long userId, String token, Long relationUserId) {
+        //查询token是否存在
+        UserToken userToken = super.getOne(new LambdaQueryWrapper<UserToken>()
+                .eq(UserToken::getToken, token)
+                .eq(relationUserId == null, UserToken::getUserId, userId));
+        //非导量玩家
+        if (Objects.equals(userToken.getUserId(), userId)) {
+            return userToken;
+        }
+        //导量玩家
+        User relationUser = userService.getById(userToken.getUserId());
+        if (Objects.equals(relationUser.getRelationUserId(), userId)) {
+            return userToken;
         }
-        ResultVO<Long> re = ResultVO.ok(userId);
-        log.error("token验证成功, str : {}, mySign : {}, sign : {}, re : {}", sb.toString(), mySign, sign, JsonUtil.toString(re));
-        return re;
+        return null;
     }
 
     @Override