瀏覽代碼

feat : 充值回调过滤重复请求

bilingfeng 9 月之前
父節點
當前提交
84555890b9

+ 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服务启动成功 <APP充值回调兼容> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <APP充值回调过滤重复请求> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +

+ 4 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/constant/RedisKeyConstant.java

@@ -77,4 +77,8 @@ public class RedisKeyConstant {
      */
     public static final String ORDER_CREATE_LOCK = RedisKeyConstant.REDIS_PREFIX + "order_create_lock_";
 
+    /**
+     * 回调判断锁
+     */
+    public static final String CALL_BACK_JUDGE_LOCK = RedisKeyConstant.REDIS_PREFIX + "call_back_judge_lock_";
 }

+ 25 - 6
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/CallBackServiceImpl.java

@@ -11,11 +11,13 @@ import com.zanxiang.game.back.base.rpc.ITtMiniGameBackRpc;
 import com.zanxiang.game.module.base.pojo.enums.AccountTypeEnum;
 import com.zanxiang.game.module.base.pojo.enums.GameCategoryEnum;
 import com.zanxiang.game.module.mybatis.entity.*;
+import com.zanxiang.game.module.sdk.constant.RedisKeyConstant;
 import com.zanxiang.game.module.sdk.enums.CallBackTypeEnum;
 import com.zanxiang.game.module.sdk.pojo.dto.PlatformOrderDTO;
 import com.zanxiang.game.module.sdk.pojo.param.CallBackControlParam;
 import com.zanxiang.game.module.sdk.pojo.param.UserData;
 import com.zanxiang.game.module.sdk.service.*;
+import com.zanxiang.module.redis.service.IDistributedLockComponent;
 import com.zanxiang.module.util.JsonUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
@@ -26,6 +28,7 @@ import org.springframework.stereotype.Service;
 import java.time.LocalDateTime;
 import java.util.Map;
 import java.util.Objects;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @author : lingfeng
@@ -66,17 +69,38 @@ public class CallBackServiceImpl implements ICallBackService {
     @Autowired
     private IGameBackLogService gameBackLogService;
 
+    @Autowired
+    private IDistributedLockComponent distributedLockComponent;
+
     @Override
     public boolean callBackJudge(CallBackControlParam param, UserData userData) {
         log.error("事件回传判断, param : {},  userData : {}", JsonUtil.toString(param), JsonUtil.toString(userData));
         //事件类型枚举
         CallBackTypeEnum callBackTypeEnum = param.getCallBackTypeEnum();
+        //登录(老账号登录)
+        if (Objects.equals(callBackTypeEnum, CallBackTypeEnum.CALL_BACK_LOGIN_IN)) {
+            log.error("事件回传判断, 账号登录不回传, param : {},  userData : {}", JsonUtil.toString(param), JsonUtil.toString(userData));
+            return Boolean.FALSE;
+        }
+        //线程锁
+        String lockKey = RedisKeyConstant.CALL_BACK_JUDGE_LOCK + callBackTypeEnum.getValue() + "_" + userData.getUserId();
+        if (Objects.equals(callBackTypeEnum, CallBackTypeEnum.CALL_BACK_ACTIVATE)) {
+            lockKey = lockKey + "_" + param.getRoleId();
+        }
+        if (Objects.equals(callBackTypeEnum, CallBackTypeEnum.CALL_BACK_PAY_ORDER)) {
+            lockKey = lockKey + "_" + param.getOrderId();
+        }
+        //上锁
+        if (!distributedLockComponent.doLock(lockKey, 0L, 1L, TimeUnit.MINUTES)) {
+            log.error("重复请求触发线程锁, 直接返回false, lockKey : {}", lockKey);
+            return Boolean.FALSE;
+        }
         //查询玩家
         User user = userService.getById(userData.getUserId());
         //不存在渠道
         Agent agent = agentService.getById(user.getAgentId());
         if (agent == null) {
-            log.error("事件回传判断, 渠道信息不存在, param : {},  userData : {}", JsonUtil.toString(param), JsonUtil.toString(userData));
+            log.error("事件回传判断, 渠道信息不存在, 直接返回false, param : {},  userData : {}", JsonUtil.toString(param), JsonUtil.toString(userData));
             return Boolean.FALSE;
         }
         try {
@@ -94,11 +118,6 @@ public class CallBackServiceImpl implements ICallBackService {
                 TtAppRoleRegisterBackQueryRpcDTO transform = this.transform(user.getId(), agent, param.getRoleId());
                 return ttAppBackRpc.roleRegisterBackQuery(transform).getData();
             }
-            //登录(老账号登录)
-            if (Objects.equals(callBackTypeEnum, CallBackTypeEnum.CALL_BACK_LOGIN_IN)) {
-                log.error("事件回传判断, 账号登录不回传, param : {},  userData : {}", JsonUtil.toString(param), JsonUtil.toString(userData));
-                return Boolean.FALSE;
-            }
             //支付
             if (Objects.equals(callBackTypeEnum, CallBackTypeEnum.CALL_BACK_PAY_ORDER)) {
                 if (Strings.isBlank(param.getRoleId())) {