Prechádzať zdrojové kódy

fix : 腾讯广告投微信小游戏, 监测链接归因补偿策略优化

bilingfeng 1 týždeň pred
rodič
commit
d1210cff8a

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

@@ -25,7 +25,7 @@ public class SDKApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(SDKApplication.class, args);
-        System.out.println("赞象SDK服务启动成功 <玩家角色上报信息, 优化判断> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <腾讯广告投微信小游戏, 监测链接归因补偿策略优化> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +

+ 2 - 1
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IAgentService.java

@@ -27,9 +27,10 @@ public interface IAgentService extends IService<Agent> {
      *
      * @param game     游戏数据
      * @param userData 用户数据
+     * @param openId   用户openId
      * @return {@link Tuple3}<{@link Long}, {@link Map}<{@link String}, {@link String}>, {@link String}>
      */
-    Tuple3<Long, Map<String, String>, String> getUserAgentId(Game game, UserData userData);
+    Tuple3<Long, Map<String, String>, String> getUserAgentId(Game game, UserData userData, String openId);
 
     /**
      * 根据channel解析获取渠道信息

+ 39 - 3
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/AgentServiceImpl.java

@@ -8,6 +8,7 @@ import com.github.sd4324530.jtuple.Tuple2;
 import com.zanxiang.game.back.base.ServerInfo;
 import com.zanxiang.game.back.base.pojo.dto.TencentAppApiUserAgentQueryRpcDTO;
 import com.zanxiang.game.back.base.rpc.ITencentAppApiBackRpc;
+import com.zanxiang.game.back.base.rpc.ITencentMiniGameBackRpc;
 import com.zanxiang.game.module.base.pojo.enums.GameCategoryEnum;
 import com.zanxiang.game.module.mybatis.entity.*;
 import com.zanxiang.game.module.mybatis.mapper.AgentMapper;
@@ -37,6 +38,9 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
     @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
     private ITencentAppApiBackRpc tencentAppApiBackRpc;
 
+    @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
+    private ITencentMiniGameBackRpc tencentMiniGameBackRpc;
+
     @Autowired
     private IUserService userService;
 
@@ -89,7 +93,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
             //30天未登录, 更新渠道
             Game game = gameService.getById(user.getGameId());
             //渠道id, 链接参数, 分享人id
-            Tuple3<Long, Map<String, String>, String> tuple3 = this.getUserAgentId(game, userData);
+            Tuple3<Long, Map<String, String>, String> tuple3 = this.getUserAgentId(game, userData, user.getOpenId());
             //查询渠道
             Agent agent = super.getById(tuple3.getT1());
             if (agent == null) {
@@ -120,11 +124,22 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
     }
 
     @Override
-    public Tuple3<Long, Map<String, String>, String> getUserAgentId(Game game, UserData userData) {
+    public Tuple3<Long, Map<String, String>, String> getUserAgentId(Game game, UserData userData, String openId) {
         try {
             //微信小游戏解析
             if (Objects.equals(game.getCategory(), GameCategoryEnum.CATEGORY_WX_APPLET.getId())) {
-                return this.appletChannelTransform(userData.getChannel());
+                Tuple3<Long, Map<String, String>, String> tuple3 = this.appletChannelTransform(userData.getChannel());
+                //非自然量, 或者不存在openId, 直接返回结束
+                if (!Objects.equals(tuple3.getT1(), 0L) || Strings.isBlank(openId)) {
+                    return tuple3;
+                }
+                //自然量, 做监测链接匹配补偿归因
+                Tuple2<Long, Map<String, String>> tuple2 = this.getChannelByOpenId(game.getId(), openId);
+                if (tuple2 == null) {
+                    return tuple3;
+                }
+                userData.setChannel(JsonUtil.toString(tuple2.second));
+                return Tuples.of(tuple2.first, tuple2.second, tuple3.getT3());
             }
             //APP解析
             if (Objects.equals(game.getCategory(), GameCategoryEnum.CATEGORY_APP.getId())) {
@@ -142,6 +157,27 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
         return Tuples.of(0L, Collections.emptyMap(), Strings.EMPTY);
     }
 
+    private Tuple2<Long, Map<String, String>> getChannelByOpenId(Long gameId, String openId) {
+        try {
+            Map<String, Object> callBackMap = tencentMiniGameBackRpc.getCallBackByOpenId(gameId, openId).getData();
+            if (CollectionUtils.isEmpty(callBackMap) || !callBackMap.containsKey("agentKey")) {
+                return null;
+            }
+            Agent agent = super.getOne(new LambdaQueryWrapper<Agent>().eq(Agent::getAgentKey, callBackMap.get("agentKey")));
+            if (agent == null) {
+                return null;
+            }
+            Map<String, String> channelMap = new HashMap<>(3);
+            callBackMap.put("weixinadinfo", callBackMap.get("adgroupId") + "." + callBackMap.get("impressionId"));
+            callBackMap.put("gdt_vid", callBackMap.get("impressionId").toString());
+            callBackMap.put("callBack", JsonUtil.toString(callBackMap));
+            return Tuple2.with(agent.getId(), channelMap);
+        } catch (Exception e) {
+            log.error("微信小游戏补偿匹配监测链接异常, gameId : {}, openId : {}, e : {}", gameId, openId, e.getMessage(), e);
+        }
+        return null;
+    }
+
     private Tuple3<Long, Map<String, String>, String> appletChannelTransform(String channel) {
         //链接参数
         if (Strings.isBlank(channel)) {

+ 4 - 4
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/CpPushDataServiceImpl.java

@@ -508,7 +508,7 @@ public class CpPushDataServiceImpl implements ICpPushDataService {
                         .last("limit 1"));
                 user = this.transform(gameId, shareUser, param);
             } else {
-                Tuple3<Long, Map<String, String>, String> tuple3 = this.getUserAgentChannel(game, userData);
+                Tuple3<Long, Map<String, String>, String> tuple3 = this.getUserAgentChannel(game, userData, param.getOpenId());
                 user = this.transform(gameId, tuple3, param);
                 channelMap = tuple3.getT2();
             }
@@ -548,7 +548,7 @@ public class CpPushDataServiceImpl implements ICpPushDataService {
             return Collections.emptyMap();
         }
         //渠道id, 链接参数
-        Tuple3<Long, Map<String, String>, String> tuple3 = this.getUserAgentChannel(game, userData);
+        Tuple3<Long, Map<String, String>, String> tuple3 = this.getUserAgentChannel(game, userData, param.getOpenId());
         //查询渠道
         Agent agent = agentService.getById(tuple3.getT1());
         if (agent == null) {
@@ -571,7 +571,7 @@ public class CpPushDataServiceImpl implements ICpPushDataService {
         return tuple3.getT2();
     }
 
-    private Tuple3<Long, Map<String, String>, String> getUserAgentChannel(Game game, UserData userData) {
+    private Tuple3<Long, Map<String, String>, String> getUserAgentChannel(Game game, UserData userData, String openId) {
         //解析渠道信息
         String channel = new String(Base64.getDecoder().decode(userData.getChannel()));
         userData.setChannel(channel);
@@ -586,7 +586,7 @@ public class CpPushDataServiceImpl implements ICpPushDataService {
             return Tuples.of(0L, Collections.emptyMap(), channel);
         }
         //渠道id, 链接参数, 分享人id
-        Tuple3<Long, Map<String, String>, String> tuple3 = agentService.getUserAgentId(game, userData);
+        Tuple3<Long, Map<String, String>, String> tuple3 = agentService.getUserAgentId(game, userData, openId);
         //返回渠道id, 渠道参数
         return Tuples.of(tuple3.getT1(), tuple3.getT2(), channel);
     }

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

@@ -297,7 +297,7 @@ public class LoginServiceImpl implements IRegisterLoginService {
         //获取游戏信息
         Game game = gameService.getById(userData.getGameId());
         //渠道id, 链接参数, 分享人id
-        Tuple3<Long, Map<String, String>, String> tuple3 = agentService.getUserAgentId(game, userData);
+        Tuple3<Long, Map<String, String>, String> tuple3 = agentService.getUserAgentId(game, userData, openId);
         //分享人id
         Long shareUserId = Strings.isBlank(tuple3.getT3()) ? null : Long.valueOf(tuple3.getT3());
         //用户参数补充