Browse Source

fix : 头条投放虚拟游戏兼容H5和APP

bilingfeng 11 months ago
parent
commit
77fd3a6863

+ 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) {
     public static void main(String[] args) {
         SpringApplication.run(SDKApplication.class, args);
         SpringApplication.run(SDKApplication.class, args);
-        System.out.println("赞象SDK服务启动成功 <头条虚拟游戏链路兼容修改> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <头条投放虚拟游戏兼容H5和APP> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +
                 "\\ `--.| | | | |/ / \n" +

+ 6 - 4
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IAgentService.java

@@ -2,6 +2,7 @@ package com.zanxiang.game.module.sdk.service;
 
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zanxiang.game.module.mybatis.entity.Agent;
 import com.zanxiang.game.module.mybatis.entity.Agent;
+import com.zanxiang.game.module.mybatis.entity.Game;
 import com.zanxiang.game.module.mybatis.entity.User;
 import com.zanxiang.game.module.mybatis.entity.User;
 import com.zanxiang.game.module.sdk.pojo.param.UserData;
 import com.zanxiang.game.module.sdk.pojo.param.UserData;
 import reactor.util.function.Tuple3;
 import reactor.util.function.Tuple3;
@@ -16,18 +17,19 @@ public interface IAgentService extends IService<Agent> {
     /**
     /**
      * 用户渠道更新
      * 用户渠道更新
      *
      *
-     * @param user    用户
-     * @param channel 通道
+     * @param user     用户
+     * @param userData 用户数据
      */
      */
-    void userAgentUpdate(User user, String channel);
+    void userAgentUpdate(User user, UserData userData);
 
 
     /**
     /**
      * 根据前端参数获取渠道信息
      * 根据前端参数获取渠道信息
      *
      *
+     * @param game     游戏数据
      * @param userData 用户数据
      * @param userData 用户数据
      * @return {@link Tuple3}<{@link Long}, {@link Map}<{@link String}, {@link String}>, {@link String}>
      * @return {@link Tuple3}<{@link Long}, {@link Map}<{@link String}, {@link String}>, {@link String}>
      */
      */
-    Tuple3<Long, Map<String, String>, String> getUserAgentId(UserData userData);
+    Tuple3<Long, Map<String, String>, String> getUserAgentId(Game game, UserData userData);
 
 
     /**
     /**
      * channel解析
      * channel解析

+ 35 - 31
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/AgentServiceImpl.java

@@ -2,7 +2,6 @@ package com.zanxiang.game.module.sdk.service.impl;
 
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.game.module.base.pojo.enums.GameCategoryEnum;
 import com.zanxiang.game.module.base.pojo.enums.GameCategoryEnum;
@@ -58,9 +57,9 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
     private IUserAppletService userAppletService;
     private IUserAppletService userAppletService;
 
 
     @Override
     @Override
-    public void userAgentUpdate(User user, String channel) {
-        log.error("用户登录接收到的渠道参数 userId : {}, channel : {}", user.getId(), channel);
+    public void userAgentUpdate(User user, UserData userData) {
         try {
         try {
+            String channel = userData.getChannel();
             //渠道参数为空
             //渠道参数为空
             if (Strings.isBlank(channel)) {
             if (Strings.isBlank(channel)) {
                 return;
                 return;
@@ -80,49 +79,54 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
                 return;
                 return;
             }
             }
             //30天未登录, 更新渠道
             //30天未登录, 更新渠道
-            Map<String, String> urlParamMap = this.channelTransform(channel);
+            Game game = gameService.getById(user.getGameId());
+            //渠道id, 链接参数, 分享人id
+            Tuple3<Long, Map<String, String>, String> tuple3 = this.getUserAgentId(game, userData);
             //查询渠道
             //查询渠道
-            Agent agent = this.getAgentByKey(urlParamMap);
+            Agent agent = super.getById(tuple3.getT1());
             if (agent == null) {
             if (agent == null) {
                 return;
                 return;
             }
             }
-            LocalDateTime localDateTime = LocalDateTime.now();
             //更新用户信息
             //更新用户信息
-            userService.update(new LambdaUpdateWrapper<User>()
-                    .set(User::getAgentId, agent.getId())
-                    .set(User::getChannel, channel)
-                    .set(User::getUpdateTime, localDateTime)
-                    .eq(User::getId, user.getId()));
+            user.setAgentId(agent.getId());
+            user.setUpdateTime(LocalDateTime.now());
+            //App的渠道保存解析后的参数, 因为涉及到时间判断
+            if (Objects.equals(game.getCategory(), GameCategoryEnum.CATEGORY_APP.getId())) {
+                user.setChannel(JsonUtil.toString(tuple3.getT2()));
+            } else {
+                user.setChannel(channel);
+            }
+            userService.updateById(user);
             //添加渠道变更记录
             //添加渠道变更记录
             userAgentLogService.agentUpdateLog(user, agent.getId(), channel);
             userAgentLogService.agentUpdateLog(user, agent.getId(), channel);
             //回传用户信息
             //回传用户信息
-            user.setAgentId(agent.getId());
-            user.setChannel(channel);
-            user.setUpdateTime(localDateTime);
-            callBackService.userCallBack(user, urlParamMap);
+            callBackService.userCallBack(user, tuple3.getT2());
             //注册信息埋点数据发送到卡夫卡
             //注册信息埋点数据发送到卡夫卡
             kafkaService.eventTrack(KafkaEventTrackEnum.KAFKA_EVENT_TRACK_AGENT_UPDATE, JsonUtil.toString(user));
             kafkaService.eventTrack(KafkaEventTrackEnum.KAFKA_EVENT_TRACK_AGENT_UPDATE, JsonUtil.toString(user));
         } catch (Exception e) {
         } catch (Exception e) {
-            log.error("用户渠道更新异常, userId : {}, channel : {}, e : {}", user.getId(), channel, e.getMessage());
+            log.error("用户渠道更新异常, user : {}, userData : {}, e : {}", JsonUtil.toString(user),
+                    JsonUtil.toString(userData), e.getMessage(), e);
         }
         }
     }
     }
 
 
     @Override
     @Override
-    public Tuple3<Long, Map<String, String>, String> getUserAgentId(UserData userData) {
-        log.error("用户注册接收到的渠道参数 userData : {}", JsonUtil.toString(userData));
-        //获取游戏信息
-        Game game = gameService.getById(userData.getGameId());
-        //微信小游戏解析
-        if (Objects.equals(game.getCategory(), GameCategoryEnum.CATEGORY_WX_APPLET.getId())) {
-            return this.appletChannelTransform(userData.getChannel());
-        }
-        //APP解析
-        if (Objects.equals(game.getCategory(), GameCategoryEnum.CATEGORY_APP.getId())) {
-            return this.appChannelTransform(game, userData);
-        }
-        //H5解析
-        if (Objects.equals(game.getCategory(), GameCategoryEnum.CATEGORY_H5.getId())) {
-            return this.h5ChannelTransform(userData.getChannel());
+    public Tuple3<Long, Map<String, String>, String> getUserAgentId(Game game, UserData userData) {
+        try {
+            //微信小游戏解析
+            if (Objects.equals(game.getCategory(), GameCategoryEnum.CATEGORY_WX_APPLET.getId())) {
+                return this.appletChannelTransform(userData.getChannel());
+            }
+            //APP解析
+            if (Objects.equals(game.getCategory(), GameCategoryEnum.CATEGORY_APP.getId())) {
+                return this.appChannelTransform(game, userData);
+            }
+            //H5解析
+            if (Objects.equals(game.getCategory(), GameCategoryEnum.CATEGORY_H5.getId())) {
+                return this.h5ChannelTransform(userData.getChannel());
+            }
+        } catch (Exception e) {
+            log.error("用户渠道解析异常, game : {}, userData : {}, e : {}", JsonUtil.toString(game),
+                    JsonUtil.toString(userData), e.getMessage(), e);
         }
         }
         //默认返回自然量
         //默认返回自然量
         return Tuples.of(0L, Collections.emptyMap(), Strings.EMPTY);
         return Tuples.of(0L, Collections.emptyMap(), Strings.EMPTY);

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

@@ -267,6 +267,7 @@ public class CallBackServiceImpl implements ICallBackService {
                 .wechatOpenId(user.getOpenId())
                 .wechatOpenId(user.getOpenId())
                 .accountReport(ttAccountRpcDTO)
                 .accountReport(ttAccountRpcDTO)
                 .agentKey(agent.getAgentKey())
                 .agentKey(agent.getAgentKey())
+                .backPolicyId(agent.getBackPolicyId())
                 .activeTime(user.getCreateTime())
                 .activeTime(user.getCreateTime())
                 .clueToken(urlParamMap.get("clue_token"))
                 .clueToken(urlParamMap.get("clue_token"))
                 .projectId(Strings.isBlank(urlParamMap.get("project_id")) ? null : Long.valueOf(urlParamMap.get("project_id")))
                 .projectId(Strings.isBlank(urlParamMap.get("project_id")) ? null : Long.valueOf(urlParamMap.get("project_id")))

+ 17 - 9
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/LoginServiceImpl.java

@@ -3,11 +3,9 @@ package com.zanxiang.game.module.sdk.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.zanxiang.game.module.base.pojo.enums.BanStatusEnum;
 import com.zanxiang.game.module.base.pojo.enums.BanStatusEnum;
+import com.zanxiang.game.module.base.pojo.enums.GameCategoryEnum;
 import com.zanxiang.game.module.base.pojo.enums.HttpStatusEnum;
 import com.zanxiang.game.module.base.pojo.enums.HttpStatusEnum;
-import com.zanxiang.game.module.mybatis.entity.GameExt;
-import com.zanxiang.game.module.mybatis.entity.User;
-import com.zanxiang.game.module.mybatis.entity.UserCard;
-import com.zanxiang.game.module.mybatis.entity.UserShare;
+import com.zanxiang.game.module.mybatis.entity.*;
 import com.zanxiang.game.module.sdk.constant.RedisKeyConstant;
 import com.zanxiang.game.module.sdk.constant.RedisKeyConstant;
 import com.zanxiang.game.module.sdk.enums.KafkaEventTrackEnum;
 import com.zanxiang.game.module.sdk.enums.KafkaEventTrackEnum;
 import com.zanxiang.game.module.sdk.enums.LoginTypeEnum;
 import com.zanxiang.game.module.sdk.enums.LoginTypeEnum;
@@ -95,6 +93,9 @@ public class LoginServiceImpl implements IRegisterLoginService {
     @Autowired
     @Autowired
     private IKafkaService kafkaService;
     private IKafkaService kafkaService;
 
 
+    @Autowired
+    private IGameService gameService;
+
     @Autowired
     @Autowired
     private IGameAppletShellService gameAppletShellService;
     private IGameAppletShellService gameAppletShellService;
 
 
@@ -137,7 +138,7 @@ public class LoginServiceImpl implements IRegisterLoginService {
                         .set(User::getSessionKey, sessionKey).eq(User::getId, user.getId()));
                         .set(User::getSessionKey, sessionKey).eq(User::getId, user.getId()));
             }
             }
             //渠道更新和回传判断
             //渠道更新和回传判断
-            agentService.userAgentUpdate(user, userData.getChannel());
+            agentService.userAgentUpdate(user, userData);
             //返回登录信息
             //返回登录信息
             UserLoginVO userLoginVO = this.createUserLoginVO(user, userData);
             UserLoginVO userLoginVO = this.createUserLoginVO(user, userData);
             userLoginVO.setAppletShellSwitch(gameAppletShellService.getUserShellSwitch(user, Boolean.FALSE, request));
             userLoginVO.setAppletShellSwitch(gameAppletShellService.getUserShellSwitch(user, Boolean.FALSE, request));
@@ -191,7 +192,7 @@ public class LoginServiceImpl implements IRegisterLoginService {
                 return ResultVO.fail(HttpStatusEnum.USERNAME_OR_PASSWORD_ERR.getMsg());
                 return ResultVO.fail(HttpStatusEnum.USERNAME_OR_PASSWORD_ERR.getMsg());
             }
             }
             //渠道更新和回传判断
             //渠道更新和回传判断
-            agentService.userAgentUpdate(user, userData.getChannel());
+            agentService.userAgentUpdate(user, userData);
             //登录信息
             //登录信息
             UserLoginVO userLoginVO = this.createUserLoginVO(user, userData);
             UserLoginVO userLoginVO = this.createUserLoginVO(user, userData);
             Tuple2<Boolean, Long> tuple2 = this.userGuideCheck(user);
             Tuple2<Boolean, Long> tuple2 = this.userGuideCheck(user);
@@ -237,7 +238,7 @@ public class LoginServiceImpl implements IRegisterLoginService {
                 return ResultVO.fail(HttpStatusEnum.ACCOUNT_HALT.getMsg());
                 return ResultVO.fail(HttpStatusEnum.ACCOUNT_HALT.getMsg());
             }
             }
             //渠道更新和回传判断
             //渠道更新和回传判断
-            agentService.userAgentUpdate(user, userData.getChannel());
+            agentService.userAgentUpdate(user, userData);
             UserLoginVO userLoginVO = this.createUserLoginVO(user, userData);
             UserLoginVO userLoginVO = this.createUserLoginVO(user, userData);
             //判断是否导量用户
             //判断是否导量用户
             Tuple2<Boolean, Long> tuple2 = this.userGuideCheck(user);
             Tuple2<Boolean, Long> tuple2 = this.userGuideCheck(user);
@@ -282,8 +283,10 @@ public class LoginServiceImpl implements IRegisterLoginService {
         if (!distributedLockComponent.doLock(lockKey, 0L, 3L, TimeUnit.MINUTES)) {
         if (!distributedLockComponent.doLock(lockKey, 0L, 3L, TimeUnit.MINUTES)) {
             throw new BaseException("用户信息正在注册中, 请勿重复请求!");
             throw new BaseException("用户信息正在注册中, 请勿重复请求!");
         }
         }
+        //获取游戏信息
+        Game game = gameService.getById(userData.getGameId());
         //渠道id, 链接参数, 分享人id
         //渠道id, 链接参数, 分享人id
-        Tuple3<Long, Map<String, String>, String> tuple3 = agentService.getUserAgentId(userData);
+        Tuple3<Long, Map<String, String>, String> tuple3 = agentService.getUserAgentId(game, userData);
         //分享人id
         //分享人id
         Long shareUserId = Strings.isBlank(tuple3.getT3()) ? null : Long.valueOf(tuple3.getT3());
         Long shareUserId = Strings.isBlank(tuple3.getT3()) ? null : Long.valueOf(tuple3.getT3());
         //用户参数补充
         //用户参数补充
@@ -292,8 +295,13 @@ public class LoginServiceImpl implements IRegisterLoginService {
         user.setMobile(mobile);
         user.setMobile(mobile);
         user.setOpenId(Strings.isNotBlank(openId) ? openId : tuple3.getT2().get("openId"));
         user.setOpenId(Strings.isNotBlank(openId) ? openId : tuple3.getT2().get("openId"));
         user.setSessionKey(sessionKey);
         user.setSessionKey(sessionKey);
-        user.setChannel(userData.getChannel());
         user.setShareUserId(shareUserId);
         user.setShareUserId(shareUserId);
+        //App的渠道保存解析后的参数, 因为涉及到时间判断
+        if (Objects.equals(game.getCategory(), GameCategoryEnum.CATEGORY_APP.getId())) {
+            user.setChannel(JsonUtil.toString(tuple3.getT2()));
+        } else {
+            user.setChannel(userData.getChannel());
+        }
         userService.save(user);
         userService.save(user);
         gameUserService.createGameUser(user);
         gameUserService.createGameUser(user);
         userAgentLogService.regAgentLog(user);
         userAgentLogService.regAgentLog(user);