Pārlūkot izejas kodu

fix : 头条APP星广联投监测链接

bilingfeng 2 nedēļas atpakaļ
vecāks
revīzija
5af3fc81f2

+ 1 - 1
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/GameBackApplication.java

@@ -18,7 +18,7 @@ public class GameBackApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(GameBackApplication.class, args);
-        System.out.println("腾讯广告新增监测链接注册回传(监测链接callBackUrl匹配优化) (´・・)ノ(._.`)  \n" +
+        System.out.println("腾讯广告新增监测链接注册回传(星广联投监测链接) (´・・)ノ(._.`)  \n" +
                 " ______  __     __     \n" +
                 "/_____/\\/__/\\ /__/\\    \n" +
                 "\\:::__\\/\\ \\::\\\\:.\\ \\   \n" +

+ 11 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/dao/mapper/GameOceanengineAppCallbackXgltMapper.java

@@ -0,0 +1,11 @@
+package com.zanxiang.game.back.serve.dao.mapper;
+
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppCallbackXglt;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface GameOceanengineAppCallbackXgltMapper extends BaseMapper<GameOceanengineAppCallbackXglt> {
+}
+
+
+
+

+ 119 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineAppCallbackXglt.java

@@ -0,0 +1,119 @@
+package com.zanxiang.game.back.serve.pojo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * 头条游戏 APP 星广联投AD版监测链接回传数据(文档:<a href="https://bytedance.larkoffice.com/docx/OUQ6d50Rpoga7YxrqUrchWp0ncg">...</a>
+ *
+ * @TableName t_game_oceanengine_app_callback_xglt
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName(GameOceanengineAppCallbackXglt.TABLE_NAME)
+public class GameOceanengineAppCallbackXglt implements Serializable {
+    private static final long serialVersionUID = 1L;
+    public static final String TABLE_NAME = "t_game_oceanengine_app_callback_xglt";
+
+    /**
+     * 主键id
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 时间发生日期
+     */
+    private LocalDate day;
+
+    /**
+     * 13位豪秒时间戳
+     */
+    private Long ts;
+
+    /**
+     * 客户端操作系统的类型, 0–Android,1–iOS,2–WP,3-Others
+     */
+    private Integer os;
+
+    /**
+     * User_Agent
+     */
+    private String ua;
+
+    /**
+     * 星广联投AD版的任务id
+     */
+    private Long demandId;
+
+    /**
+     * 用户终端的公共 IP
+     */
+    private String ip;
+
+    /**
+     * 第6版网际协议
+     */
+    private String ipv6;
+
+    /**
+     * 手机型号代码
+     */
+    private String model;
+
+    /**
+     * 视频ID,发布视频后产生的视频唯一ID
+     */
+    private Long itemId;
+
+    /**
+     * 素材ID,广告平台上披露的视频素材ID
+     */
+    private Long mid3;
+
+    /**
+     * 回调参数
+     */
+    private String callbackParam;
+
+    /**
+     * 安卓的设备 IMEI 的 MD5
+     */
+    private String imeiMd5;
+
+    /**
+     * iOS设备IDFA的 MD5
+     */
+    private String idfaMd5;
+
+    /**
+     * Android Q及更高版本的设备号的MD5
+     */
+    private String oaidMd5;
+
+    /**
+     * Android 8及更高版本的设备标识符的MD5
+     */
+    private String androidIdMd5;
+
+    /**
+     * 中国广告协会互联网广告标识,json格式
+     */
+    private String caidMd5;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+}

+ 26 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/GameOceanengineAppCallbackXgltService.java

@@ -0,0 +1,26 @@
+package com.zanxiang.game.back.serve.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppCallbackXglt;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppUserLog;
+
+import java.util.Map;
+
+public interface GameOceanengineAppCallbackXgltService extends IService<GameOceanengineAppCallbackXglt> {
+
+    /**
+     * 回调处理
+     *
+     * @param paramMap : 回调参数
+     * @return : 返回结果
+     */
+    boolean callback(Map<String, Object> paramMap);
+
+    /**
+     * 获取回调参数
+     *
+     * @param userLog : 用户日志
+     * @return : 返回结果
+     */
+    String getCallBackParamByUser(GameOceanengineAppUserLog userLog);
+}

+ 125 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppCallbackXgltServiceImpl.java

@@ -0,0 +1,125 @@
+package com.zanxiang.game.back.serve.service.impl;
+
+import com.alibaba.nacos.common.utils.CollectionUtils;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.game.back.serve.dao.mapper.GameOceanengineAppCallbackXgltMapper;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppCallbackXglt;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppUserLog;
+import com.zanxiang.game.back.serve.service.GameOceanengineAppCallbackXgltService;
+import com.zanxiang.game.module.base.ServerInfo;
+import com.zanxiang.game.module.base.pojo.vo.AgentRpcVO;
+import com.zanxiang.game.module.base.rpc.IAgentRpc;
+import com.zanxiang.module.util.DateUtil;
+import com.zanxiang.module.util.JsonUtil;
+import com.zanxiang.module.util.URIUtil;
+import com.zanxiang.module.util.encryption.Md5Util;
+import com.zanxiang.module.util.pojo.ResultVO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.*;
+
+@Slf4j
+@Service
+public class GameOceanengineAppCallbackXgltServiceImpl extends ServiceImpl<GameOceanengineAppCallbackXgltMapper, GameOceanengineAppCallbackXglt>
+        implements GameOceanengineAppCallbackXgltService {
+
+    @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
+    private IAgentRpc agentRpc;
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @Override
+    public boolean callback(Map<String, Object> paramMap) {
+        try {
+            GameOceanengineAppCallbackXglt callback = JsonUtil.toObj(JsonUtil.toString(paramMap), GameOceanengineAppCallbackXglt.class);
+            callback.setDay(callback.getTs() == null || callback.getTs() < 1000 ? LocalDate.now() : DateUtil.milliToLocalDate(callback.getTs()));
+            callback.setCreateTime(LocalDateTime.now());
+            save(callback);
+        } catch (Exception e) {
+            log.error("接收到头条星广联投测链接数据保存异常, paramMap : {}, errorMsg : {}", JsonUtil.toString(paramMap), e.getMessage(), e);
+        }
+        return true;
+    }
+
+    @Override
+    public String getCallBackParamByUser(GameOceanengineAppUserLog userLog) {
+        //没有渠道标识, 无法匹配
+        if (StringUtils.isBlank(userLog.getAgentKey())) {
+            return null;
+        }
+        try {
+            ResultVO<List<AgentRpcVO>> resultVO = agentRpc.getByAgentKeys(Collections.singletonList(userLog.getAgentKey()));
+            Long demandId = Optional.ofNullable(resultVO).map(ResultVO::getData)
+                    .filter(list -> !list.isEmpty()).map(list -> list.get(0))
+                    .map(AgentRpcVO::getXgltDemandId).orElse(null);
+            if (demandId == null) {
+                return null;
+            }
+            GameOceanengineAppCallbackXglt callBack = this.getCallBack(demandId, userLog.getAndroidId(), userLog.getOaid(),
+                    userLog.getImei(), userLog.getActiveTime());
+            return callBack == null ? null : callBack.getCallbackParam();
+        } catch (Exception e) {
+            log.error("头条APP玩家匹配星广联投监测链接数据异常, userLogId : {}, e : {}", JsonUtil.toString(userLog), e.getMessage(), e);
+        }
+        return null;
+    }
+
+    private GameOceanengineAppCallbackXglt getCallBack(Long demandId, String androidId, String oaid, String imei, LocalDateTime regTime) {
+        //星广联投任务id不存在, 不可匹配
+        if (demandId == null) {
+            return null;
+        }
+        LambdaQueryWrapper<GameOceanengineAppCallbackXglt> queryWrapper = new LambdaQueryWrapper<GameOceanengineAppCallbackXglt>()
+                .lt(GameOceanengineAppCallbackXglt::getTs, DateUtil.localDateTimeToMilli(regTime))
+                .eq(GameOceanengineAppCallbackXglt::getDemandId, demandId)
+                .orderByDesc(GameOceanengineAppCallbackXglt::getTs)
+                .last("limit 1");
+        //条件匹配
+        queryWrapper.and(qw -> {
+            boolean hasCondition = false;
+            //安卓id匹配
+            if (StringUtils.isNoneBlank(androidId)) {
+                qw.or().eq(GameOceanengineAppCallbackXglt::getAndroidIdMd5, Md5Util.encrypt32(androidId));
+                hasCondition = true;
+            }
+            //oaid匹配
+            if (StringUtils.isNoneBlank(oaid)) {
+                qw.or().eq(GameOceanengineAppCallbackXglt::getOaidMd5, Md5Util.encrypt32(oaid));
+                hasCondition = true;
+            }
+            //imei匹配
+            if (StringUtils.isNoneBlank(imei)) {
+                qw.or().eq(GameOceanengineAppCallbackXglt::getImeiMd5, Md5Util.encrypt32(imei));
+                hasCondition = true;
+            }
+            // 避免无条件的OR查询
+            if (!hasCondition) {
+                qw.or().apply("1=0");
+            }
+        });
+        //返回星广联投监测链接数据
+        return super.getOne(queryWrapper);
+    }
+
+    private String doCallBack(String callback, String eventType, Long amount) {
+        Map<String, String> paramMap = new HashMap<>(3);
+        paramMap.put("callback", callback);
+        paramMap.put("event_type", eventType);
+        //付费回传
+        if (Objects.equals(eventType, "2") && amount != null) {
+            Map<String, String> payAmount = Collections.singletonMap("pay_amount", amount.toString());
+            paramMap.put("props", URIUtil.encodeURIComponent(JsonUtil.toString(payAmount)));
+        }
+        String uri = URIUtil.fillUrlParams("https://ad.oceanengine.com/track/activate/", paramMap, false);
+        return restTemplate.getForObject(uri, String.class);
+    }
+}

+ 5 - 0
game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/pojo/vo/AgentRpcVO.java

@@ -55,6 +55,11 @@ public class AgentRpcVO implements Serializable {
      */
     private String reportUrl;
 
+    /**
+     * 头条星广联投任务 id
+     */
+    private Long xgltDemandId;
+
     /**
      * 投放状态
      */

+ 1 - 1
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java

@@ -23,7 +23,7 @@ public class ManageApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(ManageApplication.class, args);
-        System.out.println("赞象Manage服务启动成功 < (头条渠道兼容星广联投任务id ・・)ノ(._.`) \n" +
+        System.out.println("赞象Manage服务启动成功 < (头条渠道兼容星广联投任务id-01 ・・)ノ(._.`) \n" +
                 "___  ___  ___   _   _   ___  _____  _____ \n" +
                 "|  \\/  | / _ \\ | \\ | | / _ \\|  __ \\|  ___|\n" +
                 "| .  . |/ /_\\ \\|  \\| |/ /_\\ \\ |  \\/| |__  \n" +