Pārlūkot izejas kodu

Merge remote-tracking branch 'refs/remotes/origin/package-sdk-fix' into package

bilingfeng 5 mēneši atpakaļ
vecāks
revīzija
540a91b99c
13 mainītis faili ar 500 papildinājumiem un 23 dzēšanām
  1. 5 0
      game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/pojo/enums/HttpStatusEnum.java
  2. 66 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameBackLogMediaSdk.java
  3. 16 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/GameBackLogMediaSdkMapper.java
  4. 1 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/SDKApplication.java
  5. 23 7
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/controller/CallBackController.java
  6. 59 8
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/enums/CallBackTypeEnum.java
  7. 38 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/pojo/param/BackLogMediaSdkParam.java
  8. 6 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/pojo/vo/UserLoginVO.java
  9. 35 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IGameBackLogMediaSdkService.java
  10. 243 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/GameBackLogMediaSdkServiceImpl.java
  11. 1 7
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/GameServiceImpl.java
  12. 3 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/LoginServiceImpl.java
  13. 4 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/UserCardServiceImpl.java

+ 5 - 0
game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/pojo/enums/HttpStatusEnum.java

@@ -277,6 +277,11 @@ public enum HttpStatusEnum {
      */
     AUTHENTICATION_FAIL(41515, "实名认证失败"),
 
+    /**
+     * 实名认证失败, 未成年禁止认证
+     */
+    AUTHENTICATION_FAIL_UNDERAGE(41516, "实名认证失败, 未成年禁止认证"),
+
     /**
      * 参数为空
      */

+ 66 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameBackLogMediaSdk.java

@@ -0,0 +1,66 @@
+package com.zanxiang.game.module.mybatis.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-06-06
+ * @description : 媒体sdk回传日志
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString
+@Builder
+@TableName("t_game_back_log_media_sdk")
+public class GameBackLogMediaSdk implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 游戏id
+     */
+    private Long gameId;
+
+    /**
+     * 用户id
+     */
+    private Long userId;
+
+    /**
+     * 回传类型
+     */
+    private String callBackTypeEnum;
+
+    /**
+     * 服务端回传判断
+     */
+    private String callBackJudgeResult;
+
+    /**
+     * 媒体sdk回传参数
+     */
+    private String callBackParam;
+
+    /**
+     * 媒体sdk错误消息
+     */
+    private String errorMsg;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+}

+ 16 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/GameBackLogMediaSdkMapper.java

@@ -0,0 +1,16 @@
+package com.zanxiang.game.module.mybatis.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zanxiang.game.module.mybatis.entity.GameBackLogMediaSdk;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-06-06
+ * @description : ${description}
+ */
+public interface GameBackLogMediaSdkMapper extends BaseMapper<GameBackLogMediaSdk> {
+}
+
+
+
+

+ 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服务启动成功 <数据库慢sql优化, 代码修改> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <sdk改版, 兼容小程媒体sdk回传> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +

+ 23 - 7
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/controller/CallBackController.java

@@ -1,9 +1,10 @@
 package com.zanxiang.game.module.sdk.controller;
 
 import com.zanxiang.game.module.sdk.annotation.ValidLogin;
+import com.zanxiang.game.module.sdk.pojo.param.BackLogMediaSdkParam;
 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.IGameBackLogMediaSdkService;
 import com.zanxiang.game.module.sdk.service.IGameService;
 import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.module.util.pojo.ResultVO;
@@ -33,21 +34,36 @@ public class CallBackController {
     private IGameService gameService;
 
     @Autowired
-    private ICallBackService callBackService;
+    private IGameBackLogMediaSdkService backLogMediaSdkService;
 
     @ApiOperation(value = "获取游戏广告媒体回传sdk配置")
     @GetMapping("/ad/sdk/config")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Map.class)})
     public ResultVO<Map<String, Object>> getAdSdkConfig(UserData userData) {
-        return ResultVO.ok(gameService.getAdSdkConfig(userData));
+        log.error("媒体初始化配置请求 userData : {}", JsonUtil.toString(userData));
+        Map<String, Object> adSdkConfigMap = gameService.getAdSdkConfig(userData);
+        log.error("媒体初始化配置返回, map : {}", JsonUtil.toString(adSdkConfigMap));
+        return ResultVO.ok(adSdkConfigMap);
     }
 
     @ApiOperation(value = "判断事件是否回传")
     @PostMapping("/call/judge")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Map.class)})
+    public ResultVO<Map<String, Object>> callBackJudge(@Validated @RequestBody CallBackControlParam param,
+                                                       @ValidLogin UserData userData) {
+        log.error("事件回传判断请求, param : {},  userData : {}", JsonUtil.toString(param), JsonUtil.toString(userData));
+        Map<String, Object> resultMap = backLogMediaSdkService.callBackJudge(param, userData);
+        log.error("事件回传判断结果, param : {},  userData : {}, resultMap : {}", JsonUtil.toString(param),
+                JsonUtil.toString(userData), JsonUtil.toString(resultMap));
+        return ResultVO.ok(resultMap);
+    }
+
+    @ApiOperation(value = "提交媒体sdk执行回传日志")
+    @PostMapping("/add/log")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Boolean.class)})
-    public ResultVO<Map<String, Object>> callBackJudge(@Validated @RequestBody CallBackControlParam param, @ValidLogin UserData userData) {
-        ResultVO<Map<String, Object>> ok = ResultVO.ok(callBackService.callBackJudge(param, userData));
-        log.error("事件回传判断结果, param : {}, 返回结果 ok : {}", JsonUtil.toString(param), JsonUtil.toString(ok));
-        return ok;
+    public ResultVO<Boolean> addMediaSdkBackLog(@Validated @RequestBody BackLogMediaSdkParam param,
+                                                @ValidLogin UserData userData) {
+        log.error("媒体sdk执行回传日志提交, param : {},  userData : {}", JsonUtil.toString(param), JsonUtil.toString(userData));
+        return ResultVO.ok(backLogMediaSdkService.addMediaSdkBackLog(param, userData));
     }
 }

+ 59 - 8
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/enums/CallBackTypeEnum.java

@@ -12,28 +12,79 @@ import lombok.Getter;
 @AllArgsConstructor
 public enum CallBackTypeEnum {
 
+    //--------------- 公共回传事件 ---------------
+
     /**
-     * 注册(新创建账号)
+     * 注册
      */
     CALL_BACK_REGISTER("CALL_BACK_REGISTER"),
 
     /**
-     * 激活(创建角色)
+     * 付费
      */
-    CALL_BACK_ACTIVATE("CALL_BACK_ACTIVATE"),
+    CALL_BACK_PAY_ORDER("CALL_BACK_PAY_ORDER"),
+
+    //--------------- 腾讯小游戏回传事件 ---------------
+
+    /**
+     * 沉默唤起
+     */
+    CALL_BACK_RE_ACTIVE("CALL_BACK_RE_ACTIVE"),
+
+    /**
+     * 创角
+     */
+    CALL_BACK_CREATE_ROLE("CALL_BACK_CREATE_ROLE"),
+
+    /**
+     * 完成新手引导
+     */
+    CALL_BACK_TUTORIAL_FINISH("CALL_BACK_TUTORIAL_FINISH"),
+
+    /**
+     * 游戏等级提升
+     */
+    CALL_BACK_UPDATE_LEVEL("CALL_BACK_UPDATE_LEVEL"),
+
+    /**
+     * 收藏小游戏
+     */
+    CALL_BACK_ADD_TO_WISHLIST("CALL_BACK_ADD_TO_WISHLIST"),
+
+    /**
+     * 分享-转发给朋友
+     */
+    CALL_BACK_ON_SHARE_APP_MESSAGE("CALL_BACK_ON_SHARE_APP_MESSAGE"),
+
+    /**
+     * 分享-朋友圈
+     */
+    CALL_BACK_ON_SHARE_TIME_LINE("CALL_BACK_ON_SHARE_TIME_LINE"),
 
     /**
-     * 登录(老账号登录)
+     * 浏览商城页面
      */
-    CALL_BACK_LOGIN_IN("CALL_BACK_LOGIN_IN"),
+    CALL_BACK_VIEW_CONTENT_MALL("CALL_BACK_VIEW_CONTENT_MALL"),
+
+    /**
+     * 浏览游戏活动
+     */
+    CALL_BACK_VIEW_CONTENT_ACTIVITY("CALL_BACK_VIEW_CONTENT_ACTIVITY"),
+
+    //--------------- 头条APP回传事件 ---------------
+
+    /**
+     * 激活(巨量平台代表创角)
+     */
+    CALL_BACK_ACTIVATE("CALL_BACK_ACTIVATE"),
 
     /**
-     * 支付
+     * 登录
      */
-    CALL_BACK_PAY_ORDER("CALL_BACK_PAY_ORDER");
+    CALL_BACK_LOGIN_IN("CALL_BACK_LOGIN_IN");
 
     /**
      * 枚举值
      */
-    private String value;
+    private final String value;
 }

+ 38 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/pojo/param/BackLogMediaSdkParam.java

@@ -0,0 +1,38 @@
+package com.zanxiang.game.module.sdk.pojo.param;
+
+import com.zanxiang.game.module.sdk.enums.CallBackTypeEnum;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.Map;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-11-21
+ * @description : 媒体sdk回传日志参数
+ */
+@Data
+public class BackLogMediaSdkParam {
+
+    /**
+     * 用户行为回传类型, 必传
+     */
+    @NotNull(message = "用户行为回传类型不可为空")
+    private CallBackTypeEnum callBackTypeEnum;
+
+    /**
+     * 服务端回传判断结果, 必传
+     */
+    private Map<String, Object> callBackJudgeResult;
+
+    /**
+     * 调用媒体sdk回传时给的参数
+     */
+    private Map<String, Object> callBackParam;
+
+    /**
+     * 媒体sdk调用出现异常的错误消息
+     */
+    private String errorMsg;
+
+}

+ 6 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/pojo/vo/UserLoginVO.java

@@ -23,6 +23,12 @@ public class UserLoginVO {
     @ApiModelProperty(notes = "用户id, 唯一标识")
     private Long userId;
 
+    /**
+     * 小程序用户唯一标识
+     */
+    @ApiModelProperty(notes = "小程序用户唯一标识")
+    private String openId;
+
     /**
      * 用户名
      */

+ 35 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IGameBackLogMediaSdkService.java

@@ -0,0 +1,35 @@
+package com.zanxiang.game.module.sdk.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.module.mybatis.entity.GameBackLogMediaSdk;
+import com.zanxiang.game.module.sdk.pojo.param.BackLogMediaSdkParam;
+import com.zanxiang.game.module.sdk.pojo.param.CallBackControlParam;
+import com.zanxiang.game.module.sdk.pojo.param.UserData;
+
+import java.util.Map;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-11-10
+ * @description : 媒体sdk回传日志
+ */
+public interface IGameBackLogMediaSdkService extends IService<GameBackLogMediaSdk> {
+
+    /**
+     * 媒体sdk事件回传判断
+     *
+     * @param param    : 参数
+     * @param userData : 用户信息
+     * @return : 返回结果
+     */
+    Map<String, Object> callBackJudge(CallBackControlParam param, UserData userData);
+
+    /**
+     * 添加媒体sdk回传日志
+     *
+     * @param param    : 参数
+     * @param userData : 用户信息
+     * @return : 返回添加结果
+     */
+    boolean addMediaSdkBackLog(BackLogMediaSdkParam param, UserData userData);
+}

+ 243 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/GameBackLogMediaSdkServiceImpl.java

@@ -0,0 +1,243 @@
+package com.zanxiang.game.module.sdk.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.sd4324530.jtuple.Tuple2;
+import com.zanxiang.game.back.base.ServerInfo;
+import com.zanxiang.game.back.base.pojo.dto.TtAppOrderBackQueryRpcDTO;
+import com.zanxiang.game.back.base.pojo.vo.OrderBackQueryRpcVO;
+import com.zanxiang.game.back.base.rpc.ITtAppBackRpc;
+import com.zanxiang.game.module.mybatis.entity.Agent;
+import com.zanxiang.game.module.mybatis.entity.GameBackLogMediaSdk;
+import com.zanxiang.game.module.mybatis.entity.User;
+import com.zanxiang.game.module.mybatis.entity.UserEvent;
+import com.zanxiang.game.module.mybatis.mapper.GameBackLogMediaSdkMapper;
+import com.zanxiang.game.module.sdk.constant.RedisKeyConstant;
+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.BackLogMediaSdkParam;
+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.redis.service.IDistributedLockComponent;
+import com.zanxiang.module.util.JsonUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.apache.logging.log4j.util.Strings;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-11-10
+ * @description : 媒体sdk回传日志
+ */
+@Slf4j
+@Service
+public class GameBackLogMediaSdkServiceImpl extends ServiceImpl<GameBackLogMediaSdkMapper, GameBackLogMediaSdk> implements IGameBackLogMediaSdkService {
+
+    @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
+    private ITtAppBackRpc ttAppBackRpc;
+
+    @Autowired
+    private IAgentService agentService;
+
+    @Autowired
+    private IUserService userService;
+
+    @Autowired
+    private IOrderService orderService;
+
+    @Autowired
+    private IDistributedLockComponent distributedLockComponent;
+
+    @Autowired
+    private IUserEventService userEventService;
+
+    @Override
+    public Map<String, Object> callBackJudge(CallBackControlParam param, UserData userData) {
+        Map<String, Object> resultMap = new HashMap<>(7);
+        resultMap.put("callBackTypeEnum", param.getCallBackTypeEnum().getValue());
+        resultMap.put("userId", userData.getUserId());
+        resultMap.put("gameId", userData.getGameId());
+        resultMap.put("callBack", Boolean.FALSE);
+        //参数判断是否齐全
+        Tuple2<Boolean, String> backParamCheck = this.callBackParamCheck(param, resultMap);
+        if (!backParamCheck.first) {
+            resultMap.put("backMsg", backParamCheck.second);
+            return resultMap;
+        }
+        //判断是否过事件行为, 全量回传
+        Tuple2<Boolean, List<Integer>> userEventTuple = this.userEventTest(userData, param.getOrderId());
+        if (userEventTuple.first) {
+            resultMap.put("callBack", Boolean.TRUE);
+            if (CollectionUtils.isNotEmpty(userEventTuple.second)) {
+                resultMap.put("amount", userEventTuple.second);
+            }
+            return resultMap;
+        }
+        //查询玩家, 判断玩家是否存在渠道, 不存在渠道则不回传
+        User user = userService.getById(userData.getUserId());
+        Agent agent = agentService.getById(user.getAgentId());
+        if (agent == null) {
+            return resultMap;
+        }
+        //线程锁
+        String lockKey = this.getLockKey(param, userData.getUserId());
+        //上锁
+        if (!distributedLockComponent.doLock(lockKey, 0L, 1L, TimeUnit.MINUTES)) {
+            log.error("重复请求触发线程锁, 直接返回false, lockKey : {}", lockKey);
+            return resultMap;
+        }
+        try {
+            //判断回传
+            this.checkCallBack(user.getId(), agent, param.getCallBackTypeEnum(), resultMap, param);
+        } catch (Exception e) {
+            log.error("事件回传判断, 出现异常, param : {},  userData : {}, e : {}", JsonUtil.toString(param),
+                    JsonUtil.toString(userData), e.getMessage(), e);
+        } finally {
+            distributedLockComponent.unlock(lockKey);
+        }
+        //返回结果
+        return resultMap;
+    }
+
+    private String getLockKey(CallBackControlParam param, Long userId) {
+        //回传枚举
+        CallBackTypeEnum callBackTypeEnum = param.getCallBackTypeEnum();
+        //线程锁
+        String lockKey = RedisKeyConstant.CALL_BACK_JUDGE_LOCK + callBackTypeEnum.getValue() + "_" + userId;
+        if (Strings.isNotBlank(param.getRoleId())) {
+            lockKey = lockKey + "_" + param.getRoleId();
+        }
+        if (Strings.isNotBlank(param.getOrderId())) {
+            lockKey = lockKey + "_" + param.getOrderId();
+        }
+        return lockKey;
+    }
+
+    private Tuple2<Boolean, String> callBackParamCheck(CallBackControlParam param, Map<String, Object> resultMap) {
+        CallBackTypeEnum callBackTypeEnum = param.getCallBackTypeEnum();
+        //创角和新手引导回传, 必须传角色id
+        if (Objects.equals(callBackTypeEnum, CallBackTypeEnum.CALL_BACK_ACTIVATE)
+                || Objects.equals(callBackTypeEnum, CallBackTypeEnum.CALL_BACK_TUTORIAL_FINISH)) {
+            if (Strings.isBlank(param.getRoleId())) {
+                return Tuple2.with(Boolean.FALSE, "参数错误, 创角或新手引导回传, 必须传角色id");
+            }
+            resultMap.put("roleId", param.getRoleId());
+        }
+        //付费回传, 必须传订单id
+        if (Objects.equals(callBackTypeEnum, CallBackTypeEnum.CALL_BACK_PAY_ORDER)) {
+            if (Strings.isBlank(param.getOrderId())) {
+                return Tuple2.with(Boolean.FALSE, "参数错误, 付费回传, 必须传订单id");
+            }
+            resultMap.put("orderId", param.getOrderId());
+        }
+        return Tuple2.with(Boolean.TRUE, null);
+    }
+
+    private Tuple2<Boolean, List<Integer>> userEventTest(UserData userData, String orderId) {
+        Boolean callBack = Boolean.FALSE;
+        List<Integer> amountList = null;
+        //查询玩家
+        User user = userService.getById(userData.getUserId());
+        //判断是否测试过事件用户
+        if (userEventService.count(new LambdaQueryWrapper<UserEvent>()
+                .eq(UserEvent::getGameId, userData.getGameId())
+                .and(qw -> qw.eq(UserEvent::getUsername, user.getUsername())
+                        .or().eq(UserEvent::getUsername, user.getOpenId())
+                        .or().eq(UserEvent::getMobile, user.getMobile())
+                )
+        ) > 0) {
+            callBack = Boolean.TRUE;
+        }
+        //判断是否订单回传
+        if (callBack && Strings.isNotBlank(orderId)) {
+            PlatformOrderDTO platformOrderDTO = orderService.getByOrderId(orderId);
+            if (platformOrderDTO != null) {
+                amountList = Collections.singletonList(platformOrderDTO.getAmount().intValue());
+            }
+        }
+        //返回结果
+        return Tuple2.with(callBack, amountList);
+    }
+
+    private void checkCallBack(Long userId, Agent agent, CallBackTypeEnum callBackTypeEnum, Map<String, Object> resultMap,
+                               CallBackControlParam param) {
+        switch (callBackTypeEnum) {
+            case CALL_BACK_LOGIN_IN:
+                break;
+            case CALL_BACK_REGISTER:
+            case CALL_BACK_ACTIVATE:
+            case CALL_BACK_CREATE_ROLE:
+            case CALL_BACK_UPDATE_LEVEL:
+            case CALL_BACK_ADD_TO_WISHLIST:
+            case CALL_BACK_ON_SHARE_TIME_LINE:
+            case CALL_BACK_ON_SHARE_APP_MESSAGE:
+            case CALL_BACK_VIEW_CONTENT_MALL:
+            case CALL_BACK_VIEW_CONTENT_ACTIVITY:
+                resultMap.put("callBack", Boolean.TRUE);
+                break;
+            case CALL_BACK_RE_ACTIVE:
+                //沉默唤起
+                resultMap.put("callBack", Boolean.TRUE);
+                break;
+            case CALL_BACK_TUTORIAL_FINISH:
+                //完成新手引导
+                resultMap.put("callBack", Boolean.TRUE);
+                break;
+            case CALL_BACK_PAY_ORDER:
+                TtAppOrderBackQueryRpcDTO orderTransform = this.transform(userId, param.getOrderId(), agent);
+                OrderBackQueryRpcVO orderBackQueryRpcVO = ttAppBackRpc.orderBackQuery(orderTransform).getData();
+                resultMap.put("orderId", param.getOrderId());
+                resultMap.put("callBack", orderBackQueryRpcVO.getDoBack());
+                resultMap.put("backMsg", orderBackQueryRpcVO.getBackMsg());
+                if (Objects.equals(orderBackQueryRpcVO.getDoBack(), Boolean.TRUE)) {
+                    //传过来的金额是分, 换算成元, 存在小数直接舍弃
+                    List<Long> backMoney = orderBackQueryRpcVO.getBackMoney()
+                            .stream().map(money -> money / 100)
+                            .collect(Collectors.toList());
+                    resultMap.put("amount", backMoney);
+                }
+                break;
+            default:
+                resultMap.put("backMsg", "未知的回传类型");
+        }
+    }
+
+    @Override
+    public boolean addMediaSdkBackLog(BackLogMediaSdkParam param, UserData userData) {
+        return super.save(this.transform(param, userData));
+    }
+
+    private GameBackLogMediaSdk transform(BackLogMediaSdkParam param, UserData userData) {
+        return GameBackLogMediaSdk.builder()
+                .gameId(userData.getGameId())
+                .userId(userData.getUserId())
+                .callBackTypeEnum(param.getCallBackTypeEnum().getValue())
+                .callBackJudgeResult(JsonUtil.toString(param.getCallBackJudgeResult()))
+                .callBackParam(JsonUtil.toString(param.getCallBackParam()))
+                .errorMsg(param.getErrorMsg())
+                .createTime(LocalDateTime.now())
+                .build();
+    }
+
+    private TtAppOrderBackQueryRpcDTO transform(Long userId, String orderId, Agent agent) {
+        return TtAppOrderBackQueryRpcDTO.builder()
+                .gameId(agent.getGameId())
+                .userId(userId.toString())
+                .orderId(orderId)
+                .agentKey(agent.getAgentKey())
+                .build();
+    }
+}
+
+
+
+

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

@@ -24,16 +24,10 @@ public class GameServiceImpl extends ServiceImpl<GameMapper, Game> implements IG
 
     @Override
     public Map<String, Object> getAdSdkConfig(UserData userData) {
-
-        log.error("媒体初始化配置请求 userData : {}", JsonUtil.toString(userData));
-
         Game game = super.getById(userData.getGameId());
         if (Strings.isBlank(game.getAdSdkConfig())) {
             return Collections.singletonMap("adSdk", 0);
         }
-        Map<String, Object> map = JsonUtil.toMap(game.getAdSdkConfig(), Map.class, Object.class);
-
-        log.error("媒体初始化配置返回, map : {}", JsonUtil.toString(map));
-        return map;
+        return JsonUtil.toMap(game.getAdSdkConfig(), Map.class, Object.class);
     }
 }

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

@@ -144,6 +144,7 @@ public class LoginServiceImpl implements IRegisterLoginService {
             agentService.userAgentUpdate(user, userData);
             //返回登录信息
             UserLoginVO userLoginVO = this.createUserLoginVO(user, userData);
+            userLoginVO.setRegUser(Boolean.FALSE);
             userLoginVO.setAppletShellSwitch(gameAppletShellService.getUserShellSwitch(user, Boolean.FALSE, request));
             userLoginVO.setAccessToken(wxApiService.getAccessToken(gameAppletDTO.getAppId(), gameAppletDTO.getAppSecret()));
             log.error("返回用户登录信息, userLoginVO : {}", JsonUtil.toString(userLoginVO));
@@ -153,6 +154,7 @@ public class LoginServiceImpl implements IRegisterLoginService {
         user = userCreateSave(userData, openId, null, null, openId, sessionKey);
         //返回登录信息
         UserLoginVO userLoginVO = this.createUserLoginVO(user, userData);
+        userLoginVO.setRegUser(Boolean.TRUE);
         userLoginVO.setAppletShellSwitch(gameAppletShellService.getUserShellSwitch(user, Boolean.TRUE, request));
         userLoginVO.setAccessToken(wxApiService.getAccessToken(gameAppletDTO.getAppId(), gameAppletDTO.getAppSecret()));
         log.error("返回用户登录信息, userLoginVO : {}", JsonUtil.toString(userLoginVO));
@@ -374,6 +376,7 @@ public class LoginServiceImpl implements IRegisterLoginService {
         //构造用户登录信息
         UserLoginVO userLoginVO = UserLoginVO.builder()
                 .userId(user.getId())
+                .openId(user.getOpenId())
                 .userName(user.getUsername())
                 .token(userToken)
                 .authentication(user.getAuthentication())

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

@@ -69,6 +69,10 @@ public class UserCardServiceImpl extends ServiceImpl<UserCardMapper, UserCard> i
         if (!idCheck) {
             return ResultVO.fail(HttpStatusEnum.CARD_ID_ERROR.getMsg());
         }
+        //未成年禁止认证
+        if (this.getAge(cardId) < 18){
+            return ResultVO.fail(HttpStatusEnum.AUTHENTICATION_FAIL_UNDERAGE.getMsg());
+        }
         //阿里实名认证
         Tuple2<Boolean, String> tuple2 = aliApiService.userCardCheck(cardName, cardId);
         //实名认证失败