Ver Fonte

fix :SDK线上问题修复, CP登录验证, 以及支付并发

bilingfeng há 1 ano atrás
pai
commit
d202d71f6b

+ 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服务启动成功 <解决线上BUg> ( ´・・)ノ(._.`) \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) {

+ 43 - 53
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;
@@ -66,47 +68,24 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken
             log.error("token验证失败 , 游戏拓展信息不存在, appId : {}, userId : {}", appId, userId);
             return ResultVO.fail(TokenCheckEnum.PARAM_LACK.getMsg());
         }
-        //用户信息
-        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);
         //判断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());
         }
         //构造返回
         return ResultVO.ok(CpTokenCheckVO.builder()
                 .userId(userId)
-                .appId(gameExtService.getByGameId(user.getGameId()).getAppId())
+                .appId(gameExt.getAppId())
                 .build());
     }
 
@@ -118,29 +97,28 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken
             log.error("token验证失败 , 游戏拓展信息不存在, appId : {}, userId : {}", appId, userId);
             return ResultVO.fail(TokenCheckEnum.PARAM_LACK.getMsg());
         }
-        //用户信息
-        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);
         //判断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 +128,26 @@ 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) {
+        //用户信息
+        User user = userService.getById(userId);
+        //查询token是否存在
+        UserToken userToken = super.getOne(new LambdaQueryWrapper<UserToken>()
+                .eq(UserToken::getToken, token)
+                .eq(user.getRelationUserId() == 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