Bladeren bron

feat : APP直投兼容修改
1. 用户表新增OAID, IDFA, CAID字段
2. 游戏表新增adSdkConfig字段
3. 渠道识别新增直投App渠道识别

bilingfeng 11 maanden geleden
bovenliggende
commit
8b168abc8e
15 gewijzigde bestanden met toevoegingen van 216 en 2 verwijderingen
  1. 5 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/Game.java
  2. 15 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/User.java
  3. 1 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/SDKApplication.java
  4. 3 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/adapter/ArgumentAdapter.java
  5. 48 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/controller/CallBackController.java
  6. 44 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/enums/CallBackTypeEnum.java
  7. 26 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/pojo/param/CallBackControlParam.java
  8. 15 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/pojo/param/UserData.java
  9. 11 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/ICallBackService.java
  10. 9 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IGameService.java
  11. 5 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/AgentServiceImpl.java
  12. 16 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/CallBackServiceImpl.java
  13. 1 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/CpPushDataServiceImpl.java
  14. 14 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/GameServiceImpl.java
  15. 3 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/LoginServiceImpl.java

+ 5 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/Game.java

@@ -107,6 +107,11 @@ public class Game implements Serializable {
      */
     private String h5GameConfig;
 
+    /**
+     * 广告媒体sdk配置
+     */
+    private String adSdkConfig;
+
     /**
      * 超父游戏id
      */

+ 15 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/User.java

@@ -151,11 +151,26 @@ public class User implements Serializable {
      */
     private String imei;
 
+    /**
+     * 设备OAID
+     */
+    private String oaid;
+
     /**
      * 安卓id, (仅安卓设备才有值)
      */
     private String androidId;
 
+    /**
+     * IOS设备IDFA
+     */
+    private String idfa;
+
+    /**
+     * IOS设备CAID
+     */
+    private String caid;
+
     /**
      * 注册时间
      */

+ 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服务启动成功 <非嵌入式SDK接入, 接口提交02> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <APP直投兼容修改> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +

+ 3 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/adapter/ArgumentAdapter.java

@@ -72,7 +72,10 @@ public class ArgumentAdapter implements HandlerMethodArgumentResolver {
                 .deviceSystem(request.getHeader("os"))
                 .mac(request.getHeader("mac"))
                 .imei(request.getHeader("imei"))
+                .oaid(request.getHeader("oaid"))
                 .androidId(request.getHeader("androidId"))
+                .idfa(request.getHeader("idfa"))
+                .caid(request.getHeader("caid"))
                 .channel(request.getHeader("channel"))
                 .build();
         //不需要登录, token不存在

+ 48 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/controller/CallBackController.java

@@ -0,0 +1,48 @@
+package com.zanxiang.game.module.sdk.controller;
+
+import com.zanxiang.game.module.sdk.annotation.ValidLogin;
+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.ICallBackService;
+import com.zanxiang.game.module.sdk.service.IGameService;
+import com.zanxiang.module.util.pojo.ResultVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-06-26
+ * @description : 回传相关接口
+ */
+@Api(tags = "回传控制相关接口")
+@RestController
+@Slf4j
+@RequestMapping(value = "/api/ad/back")
+public class CallBackController {
+
+    @Autowired
+    private IGameService gameService;
+
+    @Autowired
+    private ICallBackService callBackService;
+
+    @ApiOperation(value = "获取游戏广告媒体回传sdk配置")
+    @GetMapping("/ad/sdk/config")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = String.class)})
+    public ResultVO<String> getAdSdkConfig(UserData userData) {
+        return ResultVO.ok(gameService.getAdSdkConfig(userData));
+    }
+
+    @ApiOperation(value = "判断事件是否回传")
+    @PostMapping("/call/judge")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Boolean.class)})
+    public ResultVO<Boolean> callBackJudge(@Validated @RequestBody CallBackControlParam param, @ValidLogin UserData userData) {
+        return ResultVO.ok(callBackService.callBackJudge(param, userData));
+    }
+}

+ 44 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/enums/CallBackTypeEnum.java

@@ -0,0 +1,44 @@
+package com.zanxiang.game.module.sdk.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-06-26
+ * @description : 回传类型枚举
+ */
+@Getter
+@AllArgsConstructor
+public enum CallBackTypeEnum {
+
+    /**
+     * 注册(新创建账号)
+     */
+    CALL_BACK_REGISTER("CALL_BACK_REGISTER"),
+
+    /**
+     * 激活(创建角色)
+     */
+    CALL_BACK_ACTIVATE("CALL_BACK_ACTIVATE"),
+
+    /**
+     * 登录(老账号登录)
+     */
+    CALL_BACK_LOGIN_IN("CALL_BACK_LOGIN_IN"),
+
+    /**
+     * 下单
+     */
+    CALL_BACK_CREATE_ORDER("CALL_BACK_CREATE_ORDER"),
+
+    /**
+     * 支付
+     */
+    CALL_BACK_PAY_ORDER("CALL_BACK_PAY_ORDER");
+
+    /**
+     * 枚举值
+     */
+    private String value;
+}

+ 26 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/pojo/param/CallBackControlParam.java

@@ -0,0 +1,26 @@
+package com.zanxiang.game.module.sdk.pojo.param;
+
+import com.zanxiang.game.module.sdk.enums.CallBackTypeEnum;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-06-26
+ * @description : 回传控制请求参数
+ */
+@Data
+public class CallBackControlParam {
+
+    /**
+     * 用户行为回传类型
+     */
+    @NotNull(message = "用户行为回传类型不可为空")
+    private CallBackTypeEnum callBackTypeEnum;
+
+    /**
+     * 订单id, 当行为类型为下单, 支付时, 则订单id必传
+     */
+    private String orderId;
+}

+ 15 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/pojo/param/UserData.java

@@ -70,11 +70,26 @@ public class UserData implements Serializable {
      */
     private String imei;
 
+    /**
+     * 设备OAID
+     */
+    private String oaid;
+
     /**
      * 安卓id, (仅安卓设备才有值)
      */
     private String androidId;
 
+    /**
+     * IOS设备IDFA
+     */
+    private String idfa;
+
+    /**
+     * IOS设备CAID
+     */
+    private String caid;
+
     /**
      * 用户渠道唯一标识
      */

+ 11 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/ICallBackService.java

@@ -3,6 +3,8 @@ package com.zanxiang.game.module.sdk.service;
 import com.zanxiang.game.module.mybatis.entity.GameUserRole;
 import com.zanxiang.game.module.mybatis.entity.User;
 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 java.util.Map;
 
@@ -13,6 +15,15 @@ import java.util.Map;
  */
 public interface ICallBackService {
 
+    /**
+     * 回传判断
+     *
+     * @param param    : 参数
+     * @param userData : 玩家信息
+     * @return : 返回是否回传
+     */
+    boolean callBackJudge(CallBackControlParam param, UserData userData);
+
     /**
      * 用户回传
      *

+ 9 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IGameService.java

@@ -2,6 +2,7 @@ package com.zanxiang.game.module.sdk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zanxiang.game.module.mybatis.entity.Game;
+import com.zanxiang.game.module.sdk.pojo.param.UserData;
 
 /**
  * @author : xufeng
@@ -9,4 +10,12 @@ import com.zanxiang.game.module.mybatis.entity.Game;
  * @description : 游戏管理
  */
 public interface IGameService extends IService<Game> {
+
+    /**
+     * 获取游戏广告媒体sdk配置
+     *
+     * @param userData : 玩家信息
+     * @return : 返回配置
+     */
+    String getAdSdkConfig(UserData userData);
 }

+ 5 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/AgentServiceImpl.java

@@ -164,6 +164,11 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
     private Tuple3<Long, Map<String, String>, String> appChannelTransform(Game game, UserData userData) {
         //游戏拓展信息
         GameExt gameExt = gameExtService.getByGameId(userData.getGameId());
+        //直投的APP, 必定兼容了媒体的回传sdk
+        if (Strings.isNotBlank(game.getAdSdkConfig())) {
+            Agent agent = super.getOne(new LambdaQueryWrapper<Agent>().eq(Agent::getAgentKey, userData.getChannel()));
+            return Tuples.of(agent == null ? 0 : agent.getId(), Collections.singletonMap("agentKey", userData.getChannel()), Strings.EMPTY);
+        }
         //不投放, 不回传, 只归因渠道, -- 不投放, 且回传只存在于导量情况, 导量无注册行为
         if (Objects.equals(game.getIsPut(), Boolean.FALSE) && Objects.equals(gameExt.getAdCallBackSwitch(), Boolean.FALSE)) {
             //查询访问记录

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

@@ -10,10 +10,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.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.util.JsonUtil;
+import com.zanxiang.module.util.exception.BaseException;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.logging.log4j.util.Strings;
@@ -60,6 +63,19 @@ public class CallBackServiceImpl implements ICallBackService {
     @Autowired
     private IGameBackLogService gameBackLogService;
 
+    @Override
+    public boolean callBackJudge(CallBackControlParam param, UserData userData) {
+        CallBackTypeEnum callBackTypeEnum = param.getCallBackTypeEnum();
+        if (Objects.equals(callBackTypeEnum, CallBackTypeEnum.CALL_BACK_CREATE_ORDER)
+                || Objects.equals(callBackTypeEnum, CallBackTypeEnum.CALL_BACK_PAY_ORDER)) {
+            if (Strings.isBlank(param.getOrderId())) {
+                throw new BaseException("参数错误, 下单或者支付行为缺少订单id");
+            }
+        }
+        //todo : 接入策略判断方法
+        return userData.getUserId() % 2 == 0;
+    }
+
     @Override
     public void userCallBack(User user, Map<String, String> urlParamMap) {
         //判断游戏是否开启广告回传, 未开启, 不回传

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

@@ -381,7 +381,7 @@ public class CpPushDataServiceImpl implements ICpPushDataService {
         //查询游戏
         Game game = this.getGameByGameAppId(gameAppId);
         //中间数据
-        UserData userData = UserData.builder().channel(param.getChannel()).ip(param.getIp()).ua(param.getUa()).build();
+        UserData userData = UserData.builder().gameId(game.getId()).channel(param.getChannel()).ip(param.getIp()).ua(param.getUa()).build();
         //根据openId查询用户
         User user = userService.getOne(new LambdaQueryWrapper<User>()
                 .eq(User::getGameId, game.getId())

+ 14 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/GameServiceImpl.java

@@ -3,10 +3,15 @@ package com.zanxiang.game.module.sdk.service.impl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.game.module.mybatis.entity.Game;
 import com.zanxiang.game.module.mybatis.mapper.GameMapper;
+import com.zanxiang.game.module.sdk.pojo.param.UserData;
 import com.zanxiang.game.module.sdk.service.IGameService;
+import com.zanxiang.module.util.JsonUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.logging.log4j.util.Strings;
 import org.springframework.stereotype.Service;
 
+import java.util.Collections;
+
 /**
  * @author : lingfeng
  * @time : 2022-07-13
@@ -15,4 +20,13 @@ import org.springframework.stereotype.Service;
 @Slf4j
 @Service
 public class GameServiceImpl extends ServiceImpl<GameMapper, Game> implements IGameService {
+
+    @Override
+    public String getAdSdkConfig(UserData userData) {
+        Game game = super.getById(userData.getGameId());
+        if (Strings.isBlank(game.getAdSdkConfig())) {
+            return JsonUtil.toString(Collections.singletonMap("adSdk", 0));
+        }
+        return game.getAdSdkConfig();
+    }
 }

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

@@ -336,7 +336,10 @@ public class LoginServiceImpl implements IRegisterLoginService {
                 .deviceSystem(userData.getDeviceSystem())
                 .mac(userData.getMac())
                 .imei(userData.getImei())
+                .oaid(userData.getOaid())
                 .androidId(userData.getAndroidId())
+                .idfa(userData.getIdfa())
+                .caid(userData.getCaid())
                 .ip(userData.getIp())
                 .build();
     }