Bläddra i källkod

fix : 星广联投回传逻辑对接

bilingfeng 1 vecka sedan
förälder
incheckning
34f0b00867
14 ändrade filer med 485 tillägg och 70 borttagningar
  1. 1 1
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/GameBackApplication.java
  2. 31 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/config/AsyncConfig.java
  3. 2 2
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/controller/api/OceanengineCallbackApi.java
  4. 11 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/dao/mapper/GameOceanengineAppBackLogXgltMapper.java
  5. 79 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineAppBackLogXglt.java
  6. 8 3
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineAppUserLog.java
  7. 26 14
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TtAppBackRpcImpl.java
  8. 0 26
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/GameOceanengineAppCallbackXgltService.java
  9. 7 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameOceanengineAppBackLogXgltService.java
  10. 50 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameOceanengineAppCallbackXgltService.java
  11. 19 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppBackLogXgltServiceImpl.java
  12. 216 14
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppCallbackXgltServiceImpl.java
  13. 17 3
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppRoleRegisterLogServiceImpl.java
  14. 18 7
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppUserLogServiceImpl.java

+ 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("腾讯广告新增监测链接注册回传(星广联投监测链接-补上接口) (´・・)ノ(._.`)  \n" +
+        System.out.println("星广联投回传逻辑对接 (´・・)ノ(._.`)  \n" +
                 " ______  __     __     \n" +
                 "/_____/\\/__/\\ /__/\\    \n" +
                 "\\:::__\\/\\ \\::\\\\:.\\ \\   \n" +

+ 31 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/config/AsyncConfig.java

@@ -0,0 +1,31 @@
+package com.zanxiang.game.back.serve.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-05-27
+ * @description : 异步配置
+ */
+@Configuration
+@EnableAsync
+public class AsyncConfig implements AsyncConfigurer {
+
+    @Override
+    public Executor getAsyncExecutor() {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        //设置核心线程数
+        executor.setCorePoolSize(15);
+        //设置最大线程数
+        executor.setMaxPoolSize(30);
+        //设置队列容量
+        executor.setQueueCapacity(20);
+        executor.initialize();
+        return executor;
+    }
+}

+ 2 - 2
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/controller/api/OceanengineCallbackApi.java

@@ -2,7 +2,7 @@ package com.zanxiang.game.back.serve.controller.api;
 
 import com.zanxiang.game.back.serve.pojo.dto.GameOceanengineAppCallbackDTO;
 import com.zanxiang.game.back.serve.pojo.dto.GameOceanengineCallbackDTO;
-import com.zanxiang.game.back.serve.service.GameOceanengineAppCallbackXgltService;
+import com.zanxiang.game.back.serve.service.IGameOceanengineAppCallbackXgltService;
 import com.zanxiang.game.back.serve.service.IGameOceanengineAppCallbackService;
 import com.zanxiang.game.back.serve.service.IGameOceanengineCallbackService;
 import com.zanxiang.module.util.pojo.ResultVO;
@@ -30,7 +30,7 @@ public class OceanengineCallbackApi {
     private IGameOceanengineAppCallbackService gameOceanengineAppCallbackService;
 
     @Autowired
-    private GameOceanengineAppCallbackXgltService gameOceanengineAppCallbackXgltService;
+    private IGameOceanengineAppCallbackXgltService gameOceanengineAppCallbackXgltService;
 
     // https://api.zanxiangwl.com/gameBack/api/oceanengineCallback/app/xglt/callBack?ts=__TS__&os=__OS__&ua=__UA__
     // &demandId=__DEMAND_ID__&ip=__IP__&ipv6=__IPV6__&model=__MODEL__&itemId=__ITEM_ID__&mid3=__MID3__

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

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

+ 79 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineAppBackLogXglt.java

@@ -0,0 +1,79 @@
+package com.zanxiang.game.back.serve.pojo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 星广联投回传日志
+ * @TableName t_game_oceanengine_app_back_log_xglt
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@TableName("t_game_oceanengine_app_back_log_xglt")
+public class GameOceanengineAppBackLogXglt implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 星广联投任务id
+     */
+    private Long demandId;
+
+    /**
+     * 游戏id
+     */
+    private Long gameId;
+
+    /**
+     * 玩家id
+     */
+    private String userId;
+
+    /**
+     * 角色id
+     */
+    private String roleId;
+
+    /**
+     * 订单id
+     */
+    private String orderId;
+
+    /**
+     * 事件类型
+     */
+    private String eventType;
+
+    /**
+     * 回调请求
+     */
+    private String callBackUri;
+
+    /**
+     * 回传结果
+     */
+    private String callBackResult;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+}

+ 8 - 3
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineAppUserLog.java

@@ -3,16 +3,17 @@ 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 java.io.Serializable;
-import java.time.LocalDateTime;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
 /**
  * <p>
- * 
+ *
  * </p>
  *
  * @author wcc
@@ -88,5 +89,9 @@ public class GameOceanengineAppUserLog implements Serializable {
 
     private String ip;
 
+    /**
+     * 星广联投回传参数
+     */
+    private String xgltCallback;
 
 }

+ 26 - 14
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TtAppBackRpcImpl.java

@@ -9,15 +9,11 @@ import com.zanxiang.game.back.base.rpc.ITtAppBackRpc;
 import com.zanxiang.game.back.serve.pojo.entity.*;
 import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
 import com.zanxiang.game.back.serve.service.*;
-import com.zanxiang.game.module.base.ServerInfo;
-import com.zanxiang.game.module.base.rpc.IAgentRpc;
-import com.zanxiang.module.redis.service.IDistributedLockComponent;
 import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.module.util.pojo.ResultVO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -33,25 +29,27 @@ import java.util.stream.Collectors;
 @DubboService
 public class TtAppBackRpcImpl implements ITtAppBackRpc {
 
-    @Autowired
-    private IGameBackPolicyService gameBackPolicyService;
-    @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
-    private IAgentRpc agentRpc;
     @Autowired
     private IGameOceanengineAppUserLogService gameOceanengineAppUserLogService;
+
     @Autowired
     private IGameOceanengineAppRoleRegisterLogService gameOceanengineAppRoleRegisterLogService;
+
     @Autowired
     private IGameOceanengineAppOrderLogService gameOceanengineAppOrderLogService;
+
     @Autowired
     private IGameOceanengineAppOrderSplitLogService gameOceanengineAppOrderSplitLogService;
-    @Autowired
-    private IDistributedLockComponent distributedLockComponent;
+
     @Autowired
     private RedisTemplate<String, Object> redisTemplate;
+
     @Autowired
     private IGameOceanengineAppCallbackService gameOceanengineAppCallbackService;
 
+    @Autowired
+    private IGameOceanengineAppCallbackXgltService gameOceanengineAppCallbackXgltService;
+
     @Override
     public ResultVO<Boolean> userActiveReport(TtUserActiveAppRpcDTO dto) {
         log.error("头条 APP用户回传收到:{}", JsonUtil.toString(dto));
@@ -97,6 +95,13 @@ public class TtAppBackRpcImpl implements ITtAppBackRpc {
                 .backStatus(BackStatusEnum.NO.getBackStatus())
                 .createTime(LocalDateTime.now())
                 .build();
+
+        //设置星广联投回传参数
+        String xgltCallback = gameOceanengineAppCallbackXgltService.getCallBackParamByUser(userLog);
+        if (StringUtils.isNotBlank(xgltCallback)) {
+            userLog.setXgltCallback(xgltCallback);
+        }
+
         gameOceanengineAppUserLogService.save(userLog);
         return ResultVO.ok(gameOceanengineAppUserLogService.callback(userLog, Boolean.FALSE));
     }
@@ -137,7 +142,6 @@ public class TtAppBackRpcImpl implements ITtAppBackRpc {
         // 此处加锁防止 cp 方调用过快,导致查询回传结果时判断逻辑没走完
         String lockKey = com.zanxiang.game.back.base.ServerInfo.SERVER_NAME + ":TtAppOrderBack:" + dto.getGameId() + ":" + dto.getOrderId();
         redisTemplate.opsForValue().set(lockKey, dto.getOrderId(), 2L, TimeUnit.MINUTES);
-        // distributedLockComponent.doLock(lockKey, 0L, 60L, TimeUnit.SECONDS);
         try {
             GameOceanengineAppOrderLog orderLog = GameOceanengineAppOrderLog.builder()
                     .userId(dto.getUserId())
@@ -173,7 +177,6 @@ public class TtAppBackRpcImpl implements ITtAppBackRpc {
             return ResultVO.ok(gameOceanengineAppOrderLogService.callback(orderLog));
         } finally {
             redisTemplate.delete(lockKey);
-            // distributedLockComponent.unlock(lockKey);
         }
     }
 
@@ -279,11 +282,20 @@ public class TtAppBackRpcImpl implements ITtAppBackRpc {
                 .eq(GameOceanengineAppOrderSplitLog::getOrderNo, orderLog.getOrderNo())
                 .orderByAsc(GameOceanengineAppOrderSplitLog::getBackIndex)
         ).stream().map(GameOceanengineAppOrderSplitLog::getSplitMoney).collect(Collectors.toList());
-        return ResultVO.ok(OrderBackQueryRpcVO.builder()
+
+        OrderBackQueryRpcVO orderBackQueryRpcVO = OrderBackQueryRpcVO.builder()
                 .doBack(BackStatusEnum.getByValue(orderLog.getBackStatus()) == BackStatusEnum.SUCCESS)
                 .backMoney(CollectionUtils.isEmpty(splitMoney) ? Collections.singletonList(orderLog.getBackMoney()) : splitMoney)
                 .backMsg(orderLog.getBackMsg())
-                .build());
+                .build();
+
+        //星广联投回传 -> 付费
+        try {
+            gameOceanengineAppCallbackXgltService.orderPayBack(orderLog, orderBackQueryRpcVO);
+        } catch (Exception ignored) {
+        }
+
+        return ResultVO.ok(orderBackQueryRpcVO);
     }
 
     @Override

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

@@ -1,26 +0,0 @@
-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);
-}

+ 7 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameOceanengineAppBackLogXgltService.java

@@ -0,0 +1,7 @@
+package com.zanxiang.game.back.serve.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppBackLogXglt;
+
+public interface IGameOceanengineAppBackLogXgltService extends IService<GameOceanengineAppBackLogXglt> {
+}

+ 50 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameOceanengineAppCallbackXgltService.java

@@ -0,0 +1,50 @@
+package com.zanxiang.game.back.serve.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.back.base.pojo.vo.OrderBackQueryRpcVO;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppCallbackXglt;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppOrderLog;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppRoleRegisterLog;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppUserLog;
+
+import java.util.Map;
+
+public interface IGameOceanengineAppCallbackXgltService extends IService<GameOceanengineAppCallbackXglt> {
+
+    /**
+     * 回调处理
+     *
+     * @param paramMap : 回调参数
+     * @return : 返回结果
+     */
+    boolean callback(Map<String, Object> paramMap);
+
+    /**
+     * 获取回调参数
+     *
+     * @param userLog : 用户日志
+     * @return : 返回结果
+     */
+    String getCallBackParamByUser(GameOceanengineAppUserLog userLog);
+
+    /**
+     * 注册 -> 回传激活事件
+     *
+     * @param userLog : 注册日志
+     */
+    void regBack(GameOceanengineAppUserLog userLog);
+
+    /**
+     * 创角 -> 回传注册事件
+     *
+     * @param roleLog : 创角日志
+     */
+    void createRoleBack(GameOceanengineAppRoleRegisterLog roleLog);
+
+    /**
+     * 订单支付 -> 回传付费事件
+     *
+     * @param orderLog : 订单日志
+     */
+    void orderPayBack(GameOceanengineAppOrderLog orderLog, OrderBackQueryRpcVO orderBackQueryRpcVO);
+}

+ 19 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppBackLogXgltServiceImpl.java

@@ -0,0 +1,19 @@
+package com.zanxiang.game.back.serve.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppBackLogXglt;
+import com.zanxiang.game.back.serve.service.IGameOceanengineAppBackLogXgltService;
+import com.zanxiang.game.back.serve.dao.mapper.GameOceanengineAppBackLogXgltMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+public class GameOceanengineAppBackLogXgltServiceImpl extends ServiceImpl<GameOceanengineAppBackLogXgltMapper, GameOceanengineAppBackLogXglt>
+    implements IGameOceanengineAppBackLogXgltService {
+
+}
+
+
+
+

+ 216 - 14
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppCallbackXgltServiceImpl.java

@@ -2,34 +2,41 @@ package com.zanxiang.game.back.serve.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.sd4324530.jtuple.Tuple2;
+import com.zanxiang.game.back.base.pojo.vo.OrderBackQueryRpcVO;
 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.back.serve.pojo.entity.*;
+import com.zanxiang.game.back.serve.service.IGameOceanengineAppBackLogXgltService;
+import com.zanxiang.game.back.serve.service.IGameOceanengineAppCallbackXgltService;
+import com.zanxiang.game.back.serve.service.IGameOceanengineAppUserLogService;
 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.bean.BeanUtil;
 import com.zanxiang.module.util.encryption.Md5Util;
 import com.zanxiang.module.util.pojo.ResultVO;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
 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.data.redis.core.RedisTemplate;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.web.client.RestTemplate;
 
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 @Slf4j
 @Service
 public class GameOceanengineAppCallbackXgltServiceImpl extends ServiceImpl<GameOceanengineAppCallbackXgltMapper, GameOceanengineAppCallbackXglt>
-        implements GameOceanengineAppCallbackXgltService {
+        implements IGameOceanengineAppCallbackXgltService {
 
     @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
     private IAgentRpc agentRpc;
@@ -37,6 +44,15 @@ public class GameOceanengineAppCallbackXgltServiceImpl extends ServiceImpl<GameO
     @Autowired
     private RestTemplate restTemplate;
 
+    @Autowired
+    private RedisTemplate<String, String> redisTemplate;
+
+    @Autowired
+    private IGameOceanengineAppUserLogService gameOceanengineAppUserLogService;
+
+    @Autowired
+    private IGameOceanengineAppBackLogXgltService gameOceanengineAppBackLogXgltService;
+
     @Override
     public boolean callback(Map<String, Object> paramMap) {
         try {
@@ -52,11 +68,11 @@ public class GameOceanengineAppCallbackXgltServiceImpl extends ServiceImpl<GameO
 
     @Override
     public String getCallBackParamByUser(GameOceanengineAppUserLog userLog) {
-        //没有渠道标识, 无法匹配
-        if (StringUtils.isBlank(userLog.getAgentKey())) {
-            return null;
-        }
         try {
+            //没有渠道标识, 无法匹配
+            if (StringUtils.isBlank(userLog.getAgentKey())) {
+                return null;
+            }
             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))
@@ -66,7 +82,13 @@ public class GameOceanengineAppCallbackXgltServiceImpl extends ServiceImpl<GameO
             }
             GameOceanengineAppCallbackXglt callBack = this.getCallBack(demandId, userLog.getAndroidId(), userLog.getOaid(),
                     userLog.getImei(), userLog.getActiveTime());
-            return callBack == null ? null : callBack.getCallbackParam();
+            if (callBack == null || StringUtils.isBlank(callBack.getCallbackParam())) {
+                return null;
+            }
+            Map<String, String> map = new HashMap<>(2);
+            map.put("demandId", demandId.toString());
+            map.put("callBack", callBack.getCallbackParam());
+            return JsonUtil.toString(map);
         } catch (Exception e) {
             log.error("头条APP玩家匹配星广联投监测链接数据异常, userLogId : {}, e : {}", JsonUtil.toString(userLog), e.getMessage(), e);
         }
@@ -110,16 +132,196 @@ public class GameOceanengineAppCallbackXgltServiceImpl extends ServiceImpl<GameO
         return super.getOne(queryWrapper);
     }
 
-    private String doCallBack(String callback, String eventType, Long amount) {
+    @Async
+    @Override
+    public void regBack(GameOceanengineAppUserLog userLog) {
+        //注册只回传一次
+        if (gameOceanengineAppBackLogXgltService.count(new LambdaQueryWrapper<GameOceanengineAppBackLogXglt>()
+                .eq(GameOceanengineAppBackLogXglt::getGameId, userLog.getGameId())
+                .eq(GameOceanengineAppBackLogXglt::getUserId, userLog.getUserId())
+                .eq(GameOceanengineAppBackLogXglt::getEventType, EventType.Event_ACTIVE.getEventType())
+        ) > 0) {
+            return;
+        }
+        //判断是否关联星广联投, 未关联, 跳过
+        Tuple2<Long, String> tuple2 = this.getCallBackParam(userLog);
+        if (tuple2 == null) {
+            return;
+        }
+        //线程锁, 避免并发或者多次请求
+        String lockKey = "game-back:TtAppXgltBack:" + userLog.getGameId() + ":" + userLog.getUserId() + ":"
+                + EventType.Event_ACTIVE.getEventType();
+        if (Boolean.FALSE.equals(redisTemplate.opsForValue().setIfAbsent(lockKey, "lock", 30, TimeUnit.SECONDS))) {
+            return;
+        }
+        //执行回传
+        Tuple2<String, String> resultTuple2 = this.doCallBack(tuple2.second, EventType.Event_ACTIVE, null);
+        //回传记录
+        GameOceanengineAppBackLogXglt gameOceanengineAppBackLogXglt = GameOceanengineAppBackLogXglt.builder()
+                .demandId(tuple2.first)
+                .gameId(userLog.getGameId())
+                .userId(userLog.getUserId())
+                .eventType(EventType.Event_ACTIVE.getEventType())
+                .callBackUri(resultTuple2.first)
+                .callBackResult(resultTuple2.second)
+                .createTime(LocalDateTime.now())
+                .build();
+        //保存记录
+        gameOceanengineAppBackLogXgltService.save(gameOceanengineAppBackLogXglt);
+    }
+
+    @Async
+    @Override
+    public void createRoleBack(GameOceanengineAppRoleRegisterLog roleLog) {
+        //判断创角只回传一次
+        if (gameOceanengineAppBackLogXgltService.count(new LambdaQueryWrapper<GameOceanengineAppBackLogXglt>()
+                .eq(GameOceanengineAppBackLogXglt::getGameId, roleLog.getGameId())
+                .eq(GameOceanengineAppBackLogXglt::getUserId, roleLog.getUserId())
+                .eq(GameOceanengineAppBackLogXglt::getRoleId, roleLog.getRoleId())
+                .eq(GameOceanengineAppBackLogXglt::getEventType, EventType.Event_REGISTER.getEventType())
+        ) > 0) {
+            return;
+        }
+        //判断是否关联星广联投, 未关联, 跳过
+        Tuple2<Long, String> tuple2 = this.getCallBackParam(roleLog.getGameId(), roleLog.getUserId(), roleLog.getAccountId());
+        if (tuple2 == null) {
+            return;
+        }
+        //线程锁, 避免并发或者多次请求
+        String lockKey = "game-back:TtAppXgltBack:" + roleLog.getGameId() + ":" + roleLog.getUserId() + ":"
+                + roleLog.getRoleId() + ":" + EventType.Event_REGISTER.getEventType();
+        if (Boolean.FALSE.equals(redisTemplate.opsForValue().setIfAbsent(lockKey, "lock", 30, TimeUnit.SECONDS))) {
+            return;
+        }
+        //执行回传
+        Tuple2<String, String> resultTuple2 = this.doCallBack(tuple2.second, EventType.Event_REGISTER, null);
+        //回传记录
+        GameOceanengineAppBackLogXglt gameOceanengineAppBackLogXglt = GameOceanengineAppBackLogXglt.builder()
+                .demandId(tuple2.first)
+                .gameId(roleLog.getGameId())
+                .userId(roleLog.getUserId())
+                .roleId(roleLog.getRoleId())
+                .eventType(EventType.Event_REGISTER.getEventType())
+                .callBackUri(resultTuple2.first)
+                .callBackResult(resultTuple2.second)
+                .createTime(LocalDateTime.now())
+                .build();
+        //保存记录
+        gameOceanengineAppBackLogXgltService.save(gameOceanengineAppBackLogXglt);
+    }
+
+    @Async
+    @Override
+    public void orderPayBack(GameOceanengineAppOrderLog orderLog, OrderBackQueryRpcVO orderBackQueryRpcVO) {
+        //订单不回传, 跳过
+        if (!Objects.equals(orderBackQueryRpcVO.getDoBack(), Boolean.TRUE)) {
+            return;
+        }
+        //判断是否关联星广联投, 未关联, 跳过
+        Tuple2<Long, String> tuple2 = this.getCallBackParam(orderLog.getGameId(), orderLog.getUserId(), orderLog.getAccountId());
+        if (tuple2 == null) {
+            return;
+        }
+        //单个订单只回传一次
+        if (gameOceanengineAppBackLogXgltService.count(new LambdaQueryWrapper<GameOceanengineAppBackLogXglt>()
+                .eq(GameOceanengineAppBackLogXglt::getGameId, orderLog.getGameId())
+                .eq(GameOceanengineAppBackLogXglt::getUserId, orderLog.getUserId())
+                .eq(GameOceanengineAppBackLogXglt::getOrderId, orderLog.getOrderNo())
+                .eq(GameOceanengineAppBackLogXglt::getEventType, EventType.Event_PAY.getEventType())
+        ) > 0) {
+            return;
+        }
+        //线程锁, 避免并发或者多次请求
+        String lockKey = "game-back:TtAppXgltBack:" + orderLog.getGameId() + ":" + orderLog.getUserId() + ":"
+                + orderLog.getRoleId() + ":" + orderLog.getOrderNo() + ":" + EventType.Event_PAY.getEventType();
+        if (Boolean.FALSE.equals(redisTemplate.opsForValue().setIfAbsent(lockKey, "lock", 30, TimeUnit.SECONDS))) {
+            return;
+        }
+        //回传的金额列表
+        List<Long> backMoneyList = orderBackQueryRpcVO.getBackMoney();
+        //循环执行回传
+        backMoneyList.forEach(amount -> {
+            //执行回传
+            Tuple2<String, String> resultTuple2 = this.doCallBack(tuple2.second, EventType.Event_PAY, amount);
+            //回传记录
+            GameOceanengineAppBackLogXglt gameOceanengineAppBackLogXglt = GameOceanengineAppBackLogXglt.builder()
+                    .demandId(tuple2.first)
+                    .gameId(orderLog.getGameId())
+                    .userId(orderLog.getUserId())
+                    .roleId(orderLog.getRoleId())
+                    .orderId(orderLog.getOrderNo())
+                    .eventType(EventType.Event_PAY.getEventType())
+                    .callBackUri(resultTuple2.first)
+                    .callBackResult(resultTuple2.second)
+                    .createTime(LocalDateTime.now())
+                    .build();
+            //保存记录
+            gameOceanengineAppBackLogXgltService.save(gameOceanengineAppBackLogXglt);
+        });
+    }
+
+    private Tuple2<Long, String> getCallBackParam(Long gameId, String userId, Long accountId) {
+        GameOceanengineAppUserLog userLog = gameOceanengineAppUserLogService.getOne(new LambdaQueryWrapper<GameOceanengineAppUserLog>()
+                .eq(GameOceanengineAppUserLog::getGameId, gameId)
+                .eq(GameOceanengineAppUserLog::getUserId, userId)
+                .eq(GameOceanengineAppUserLog::getAccountId, accountId)
+                .orderByDesc(GameOceanengineAppUserLog::getCreateTime)
+                .last("limit 1"));
+        //参数解析返回
+        return this.getCallBackParam(userLog);
+    }
+
+    private Tuple2<Long, String> getCallBackParam(GameOceanengineAppUserLog userLog) {
+        //参数判断
+        if (userLog == null || StringUtils.isBlank(userLog.getXgltCallback())) {
+            return null;
+        }
+        //解析
+        Map<String, String> map = JsonUtil.toMap(userLog.getXgltCallback(), Map.class, String.class);
+        //返回参数
+        return Tuple2.with(Long.valueOf(map.get("demandId")), map.get("callBack"));
+    }
+
+    private Tuple2<String, String> doCallBack(String callback, EventType eventType, Long amount) {
         Map<String, String> paramMap = new HashMap<>(3);
         paramMap.put("callback", callback);
-        paramMap.put("event_type", eventType);
+        paramMap.put("event_type", eventType.getEventType());
         //付费回传
-        if (Objects.equals(eventType, "2") && amount != null) {
+        if (Objects.equals(eventType, EventType.Event_PAY) && 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);
+        String result;
+        try {
+            result = restTemplate.getForObject(uri, String.class);
+        } catch (Exception e) {
+            log.error("头条星广联投回调异常, uri : {}, errorMsg : {}", uri, e.getMessage(), e);
+            result = "头条星广联投回传接口调用异常";
+        }
+        return Tuple2.with(uri, result);
+    }
+
+    @Getter
+    @AllArgsConstructor
+    public enum EventType {
+
+        /**
+         * 激活
+         */
+        Event_ACTIVE("0"),
+
+        /**
+         * 注册
+         */
+        Event_REGISTER("1"),
+
+        /**
+         * 付费
+         * props:{"pay_amount":"xxx"}, xxx单位为分
+         */
+        Event_PAY("2");
+
+        private final String eventType;
     }
 }

+ 17 - 3
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppRoleRegisterLogServiceImpl.java

@@ -3,10 +3,12 @@ package com.zanxiang.game.back.serve.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.github.sd4324530.jtuple.Tuple2;
 import com.zanxiang.game.back.serve.dao.mapper.GameOceanengineAppRoleRegisterLogMapper;
 import com.zanxiang.game.back.serve.oceanengine.MiniGameCallback;
-import com.zanxiang.game.back.serve.pojo.entity.*;
+import com.zanxiang.game.back.serve.pojo.entity.GameBackPolicy;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppBackLog;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppRoleRegisterLog;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppUserLog;
 import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
 import com.zanxiang.game.back.serve.service.*;
 import com.zanxiang.game.module.base.ServerInfo;
@@ -18,11 +20,12 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
+import java.util.Objects;
 
 @Slf4j
 @Service
 public class GameOceanengineAppRoleRegisterLogServiceImpl extends ServiceImpl<GameOceanengineAppRoleRegisterLogMapper, GameOceanengineAppRoleRegisterLog>
-implements IGameOceanengineAppRoleRegisterLogService {
+        implements IGameOceanengineAppRoleRegisterLogService {
     @Autowired
     private IGameOceanengineAppUserLogService gameOceanengineAppUserLogService;
     @Autowired
@@ -31,11 +34,22 @@ implements IGameOceanengineAppRoleRegisterLogService {
     private IAgentRpc agentRpc;
     @Autowired
     private IGameBackPolicyService gameBackPolicyService;
+    @Autowired
+    private IGameOceanengineAppCallbackXgltService gameOceanengineAppCallbackXgltService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean callback(GameOceanengineAppRoleRegisterLog roleRegisterLog) {
         BackStatusEnum backStatus = doCallback(roleRegisterLog);
+
+        ///星广联投回传 -> 注册
+        if (Objects.equals(backStatus, BackStatusEnum.SUCCESS)) {
+            try {
+                gameOceanengineAppCallbackXgltService.createRoleBack(roleRegisterLog);
+            } catch (Exception ignored) {
+            }
+        }
+
         return update(new LambdaUpdateWrapper<GameOceanengineAppRoleRegisterLog>()
                 .set(GameOceanengineAppRoleRegisterLog::getBackStatus, backStatus.getBackStatus())
                 .eq(GameOceanengineAppRoleRegisterLog::getId, roleRegisterLog.getId())

+ 18 - 7
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppUserLogServiceImpl.java

@@ -8,14 +8,12 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.game.back.serve.dao.mapper.GameOceanengineAppUserLogMapper;
 import com.zanxiang.game.back.serve.oceanengine.MiniGameCallback;
 import com.zanxiang.game.back.serve.pojo.dto.GameOceanengineAppUserLogDTO;
-import com.zanxiang.game.back.serve.pojo.entity.*;
-import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppUserLog;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppBackLog;
 import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppUserLog;
 import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
 import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineAppUserLogVO;
-import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineAppUserLogVO;
-import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineAppUserLogVO;
 import com.zanxiang.game.back.serve.service.IGameOceanengineAppBackLogService;
+import com.zanxiang.game.back.serve.service.IGameOceanengineAppCallbackXgltService;
 import com.zanxiang.game.back.serve.service.IGameOceanengineAppUserLogService;
 import com.zanxiang.game.module.base.ServerInfo;
 import com.zanxiang.game.module.base.pojo.vo.AgentRpcVO;
@@ -38,17 +36,30 @@ import java.util.stream.Collectors;
 @Slf4j
 @Service
 public class GameOceanengineAppUserLogServiceImpl extends ServiceImpl<GameOceanengineAppUserLogMapper, GameOceanengineAppUserLog>
-implements IGameOceanengineAppUserLogService {
+        implements IGameOceanengineAppUserLogService {
 
-    @Autowired
-    private IGameOceanengineAppBackLogService gameOceanengineAppBackLogService;
     @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
     private IAgentRpc agentRpc;
 
+    @Autowired
+    private IGameOceanengineAppBackLogService gameOceanengineAppBackLogService;
+
+    @Autowired
+    private IGameOceanengineAppCallbackXgltService gameOceanengineAppCallbackXgltService;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean callback(GameOceanengineAppUserLog userLog, boolean mustBack) {
         BackStatusEnum backStatus = doCallback(userLog, mustBack);
+
+        //星广联投回传 -> 激活
+        if (Objects.equals(backStatus, BackStatusEnum.SUCCESS)) {
+            try {
+                gameOceanengineAppCallbackXgltService.regBack(userLog);
+            } catch (Exception ignored) {
+            }
+        }
+
         return update(new LambdaUpdateWrapper<GameOceanengineAppUserLog>()
                 .set(GameOceanengineAppUserLog::getBackStatus, backStatus.getBackStatus())
                 .eq(GameOceanengineAppUserLog::getId, userLog.getId())