Browse Source

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

bilingfeng 11 tháng trước cách đây
mục cha
commit
8b168abc8e
15 tập tin đã thay đổi với 216 bổ sung2 xóa
  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();
     }