Sfoglia il codice sorgente

fix : 游戏用户和订单回传逻辑代码提交

bilingfeng 1 anno fa
parent
commit
6efb80ff08
15 ha cambiato i file con 366 aggiunte e 195 eliminazioni
  1. 6 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/oceanengine/pojo/dto/OrderReportRpcDTO.java
  2. 6 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/oceanengine/pojo/dto/UserActiveReportRpcDTO.java
  3. 10 5
      game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/pojo/enums/GameCategoryEnum.java
  4. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GamePictureServiceImpl.java
  5. 3 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/Agent.java
  6. 6 0
      game-module/game-module-sdk/pom.xml
  7. 1 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/listener/OrderPaySuccessListener.java
  8. 1 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/pojo/dto/UserDTO.java
  9. 7 3
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IAgentService.java
  10. 20 13
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/ICallBackService.java
  11. 51 2
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/AgentServiceImpl.java
  12. 172 86
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/CallBackServiceImpl.java
  13. 2 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/GameServiceImpl.java
  14. 63 76
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/LoginServiceImpl.java
  15. 17 6
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/OrderServiceImpl.java

+ 6 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/oceanengine/pojo/dto/OrderReportRpcDTO.java

@@ -1,11 +1,17 @@
 package com.zanxiang.game.back.base.oceanengine.pojo.dto;
 
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import java.io.Serializable;
 import java.time.LocalDateTime;
 
 @Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
 public class OrderReportRpcDTO implements Serializable {
     private static final long serialVersionUID = 1L;
     /**

+ 6 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/oceanengine/pojo/dto/UserActiveReportRpcDTO.java

@@ -1,11 +1,17 @@
 package com.zanxiang.game.back.base.oceanengine.pojo.dto;
 
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import java.io.Serializable;
 import java.time.LocalDateTime;
 
 @Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
 public class UserActiveReportRpcDTO implements Serializable {
     private static final long serialVersionUID = 1L;
 

+ 10 - 5
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/enums/GameCategoryEnum.java → game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/pojo/enums/GameCategoryEnum.java

@@ -1,4 +1,4 @@
-package com.zanxiang.game.module.manage.enums;
+package com.zanxiang.game.module.base.pojo.enums;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;
@@ -15,22 +15,27 @@ public enum GameCategoryEnum {
     /**
      * 微信小游戏
      */
-    CATEGORY_WX_APPLET("wx_applet", "微信小游戏"),
+    CATEGORY_WX_APPLET(1L, "wx_applet", "微信小游戏"),
 
     /**
      * 抖音小游戏
      */
-    CATEGORY_DY_APPLET("byte_applet", "抖音小游戏"),
+    CATEGORY_DY_APPLET(2L, "byte_applet", "抖音小游戏"),
 
     /**
      * h5游戏
      */
-    CATEGORY_H5("h5", "h5游戏"),
+    CATEGORY_H5(3L, "h5", "h5游戏"),
 
     /**
      * app游戏
      */
-    CATEGORY_APP("app", "app游戏");
+    CATEGORY_APP(4L, "app", "app游戏");
+
+    /**
+     * 应用id
+     */
+    private Long category;
 
     /**
      * 游戏分类key

+ 1 - 1
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GamePictureServiceImpl.java

@@ -3,7 +3,7 @@ package com.zanxiang.game.module.manage.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.zanxiang.game.module.manage.enums.GameCategoryEnum;
+import com.zanxiang.game.module.base.pojo.enums.GameCategoryEnum;
 import com.zanxiang.game.module.manage.pojo.dto.GameCategoryDTO;
 import com.zanxiang.game.module.manage.pojo.dto.GameDTO;
 import com.zanxiang.game.module.manage.pojo.params.GamePictureParam;

+ 3 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/Agent.java

@@ -22,6 +22,9 @@ import java.time.LocalDateTime;
 public class Agent implements Serializable {
     private static final long serialVersionUID = 1L;
 
+    public static final Integer ACCOUNT_TYPE_TENCENT = 1;
+    public static final Integer ACCOUNT_TYPE_BYTE = 2;
+
     public static final Integer PUT_STATUS_ING = 1;
     public static final Integer PUT_STATUS_STOP = 2;
 

+ 6 - 0
game-module/game-module-sdk/pom.xml

@@ -113,6 +113,12 @@
             <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo-metadata-definition-protobuf</artifactId>
         </dependency>
+        <!-- 广告回传 -->
+        <dependency>
+            <groupId>com.zanxiang.game</groupId>
+            <artifactId>game-back-base</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 1 - 1
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/listener/OrderPaySuccessListener.java

@@ -57,7 +57,7 @@ public class OrderPaySuccessListener {
         //商户号额度统计更新
         performOrderService.payMerchantTotal(platformOrderDTO);
         //订单回传
-//        callBackService.orderCallBack(platformOrderDTO);
+        callBackService.orderCallBack(platformOrderDTO);
         log.info("订单:{} 支付成功履约监听逻辑 ------end---------", event.getOrderId());
     }
 }

+ 1 - 1
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/pojo/dto/UserDTO.java

@@ -26,7 +26,7 @@ public class UserDTO {
     /**
      * 最新渠道id
      */
-    private Long lastAgentId;
+    private Long agentId;
 
     /**
      * 注册游戏id

+ 7 - 3
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IAgentService.java

@@ -2,6 +2,9 @@ package com.zanxiang.game.module.sdk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zanxiang.game.module.mybatis.entity.Agent;
+import reactor.util.function.Tuple2;
+
+import java.util.Map;
 
 /**
  * @author bilingfeng
@@ -11,8 +14,9 @@ public interface IAgentService extends IService<Agent> {
     /**
      * 根据前端参数获取渠道信息
      *
-     * @param channel 通道
-     * @return {@link Long}
+     * @param channel     通道
+     * @param shareUserId 分享用户id
+     * @return {@link Tuple2}<{@link Long}, {@link Map}<{@link String}, {@link String}>>
      */
-    Long getAgentIdByChannel(String channel);
+    Tuple2<Long, Map<String, String>> getUserAgentId(String channel, Long shareUserId);
 }

+ 20 - 13
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/ICallBackService.java

@@ -1,5 +1,11 @@
 package com.zanxiang.game.module.sdk.service;
 
+import com.zanxiang.game.module.mybatis.entity.User;
+import com.zanxiang.game.module.sdk.pojo.dto.PlatformOrderDTO;
+import reactor.util.function.Tuple2;
+
+import java.util.Map;
+
 /**
  * @author : lingfeng
  * @time : 2022-11-10
@@ -7,17 +13,18 @@ package com.zanxiang.game.module.sdk.service;
  */
 public interface ICallBackService {
 
-//    /**
-//     * 用户回传
-//     *
-//     * @param user 用户
-//     */
-//    void userCallBack(User user);
-//
-//    /**
-//     * 订单回传
-//     *
-//     * @param orderInfo 订单信息
-//     */
-//    void orderCallBack(PlatformOrderDTO orderInfo);
+    /**
+     * 用户回传
+     *
+     * @param user   用户
+     * @param tuple2 tuple2
+     */
+    void userCallBack(User user, Tuple2<Long, Map<String, String>> tuple2);
+
+    /**
+     * 订单回传
+     *
+     * @param orderInfo 订单信息
+     */
+    void orderCallBack(PlatformOrderDTO orderInfo);
 }

+ 51 - 2
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/AgentServiceImpl.java

@@ -1,11 +1,22 @@
 package com.zanxiang.game.module.sdk.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.game.module.mybatis.entity.Agent;
+import com.zanxiang.game.module.mybatis.entity.User;
 import com.zanxiang.game.module.mybatis.mapper.AgentMapper;
 import com.zanxiang.game.module.sdk.service.IAgentService;
+import com.zanxiang.game.module.sdk.service.IUserService;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.logging.log4j.util.Strings;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import reactor.util.function.Tuple2;
+import reactor.util.function.Tuples;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * @author bilingfeng
@@ -14,8 +25,46 @@ import org.springframework.stereotype.Service;
 @Service
 public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements IAgentService {
 
+    @Autowired
+    private IUserService userService;
+
+    public void userAgentUpdate() {
+
+    }
+
     @Override
-    public Long getAgentIdByChannel(String channel) {
-        return null;
+    public Tuple2<Long, Map<String, String>> getUserAgentId(String channel, Long shareUserId) {
+        if (Strings.isBlank(channel) && shareUserId != null) {
+            User user = userService.getById(shareUserId);
+            return Tuples.of(user.getAgentId(), Collections.emptyMap());
+        }
+        if (Strings.isBlank(channel)) {
+            return Tuples.of(0L, Collections.emptyMap());
+        }
+        log.error("接收到的渠道参数 channel : {}", channel);
+        //数据解析
+        Map<String, String> urlParamMap = this.channelTransform(channel);
+        //查询渠道
+        String state = urlParamMap.get("state");
+        Agent agent = super.getOne(new LambdaQueryWrapper<Agent>()
+                .eq(Agent::getAgentKey, state));
+        if (agent == null) {
+            return Tuples.of(0L, Collections.emptyMap());
+        }
+        return Tuples.of(agent.getId(), urlParamMap);
+    }
+
+    private Map<String, String> channelTransform(String channel) {
+        Map<String, String> paramMap = new HashMap<>(11);
+        String[] params = channel.split("&");
+        for (String param : params) {
+            String[] keyValue = param.split("=");
+            if (keyValue.length > 1) {
+                String key = keyValue[0];
+                String value = keyValue[1];
+                paramMap.put(key, value);
+            }
+        }
+        return paramMap;
     }
 }

+ 172 - 86
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/CallBackServiceImpl.java

@@ -1,11 +1,30 @@
 package com.zanxiang.game.module.sdk.service.impl;
 
-import com.zanxiang.game.module.sdk.service.ICallBackService;
-import com.zanxiang.game.module.sdk.service.IOrderService;
-import com.zanxiang.game.module.sdk.service.IUserService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.zanxiang.game.back.base.ServerInfo;
+import com.zanxiang.game.back.base.oceanengine.pojo.dto.AccountReportRpcDTO;
+import com.zanxiang.game.back.base.oceanengine.pojo.dto.OrderReportRpcDTO;
+import com.zanxiang.game.back.base.oceanengine.pojo.dto.UserActiveReportRpcDTO;
+import com.zanxiang.game.back.base.oceanengine.rpc.IWechatMiniGameDataReportRpc;
+import com.zanxiang.game.back.base.tencent.pojo.dto.TencentOrderDTO;
+import com.zanxiang.game.back.base.tencent.pojo.dto.TencentUserDTO;
+import com.zanxiang.game.back.base.tencent.rpc.IGameBackTencentRpc;
+import com.zanxiang.game.module.base.pojo.enums.GameCategoryEnum;
+import com.zanxiang.game.module.mybatis.entity.Agent;
+import com.zanxiang.game.module.mybatis.entity.Game;
+import com.zanxiang.game.module.mybatis.entity.GameApplet;
+import com.zanxiang.game.module.mybatis.entity.User;
+import com.zanxiang.game.module.sdk.pojo.dto.PlatformOrderDTO;
+import com.zanxiang.game.module.sdk.service.*;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import reactor.util.function.Tuple2;
+
+import java.util.Map;
+import java.util.Objects;
 
 /**
  * @author : lingfeng
@@ -16,93 +35,160 @@ import org.springframework.stereotype.Service;
 @Service
 public class CallBackServiceImpl implements ICallBackService {
 
+    @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
+    private IGameBackTencentRpc gameBackTencentRpc;
+
+    @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
+    private IWechatMiniGameDataReportRpc wechatMiniGameDataReportRpc;
+
     @Autowired
-    private IUserService userService;
+    private IAgentService agentService;
+
+    @Autowired
+    private IGameService gameService;
 
     @Autowired
-    private IOrderService orderService;
+    private IGameAppletService gameAppletService;
+
+    @Autowired
+    private IUserService userService;
+
+    @Override
+    public void userCallBack(User user, Tuple2<Long, Map<String, String>> tuple2) {
+        Long agentId = tuple2.getT1();
+        Map<String, String> urlParamMap = tuple2.getT2();
+        //自然量, 或者跳转链接参数不存在, 不做回传处理
+        if (agentId == 0L || CollectionUtils.isEmpty(urlParamMap)) {
+            return;
+        }
+        //查询用户渠道信息
+        Agent agent = agentService.getById(user.getAgentId());
+        if (agent == null) {
+            log.error("用户回传不存在渠道信息, userId : {}", user.getId());
+            return;
+        }
+        //查询小游戏信息或者H5游戏相关公众号信息
+        GameApplet gameApplet = gameAppletService.getOne(new LambdaQueryWrapper<GameApplet>()
+                .eq(GameApplet::getGameId, user.getGameId()));
+        try {
+            //腾讯回传
+            if (Objects.equals(agent.getAccountType(), Agent.ACCOUNT_TYPE_TENCENT)) {
+                TencentUserDTO tencentUserDTO = this.transform(user, agent, gameApplet);
+                gameBackTencentRpc.backUser(tencentUserDTO);
+            }
+            //头条回传
+            if (CollectionUtils.isNotEmpty(urlParamMap) && Objects.equals(agent.getAccountType(), Agent.ACCOUNT_TYPE_BYTE)) {
+                Game game = gameService.getById(user.getGameId());
+                //判断是微信小游戏
+                if (Objects.equals(game.getCategory(), GameCategoryEnum.CATEGORY_WX_APPLET.getCategory())) {
+                    UserActiveReportRpcDTO activeReportRpcDTO = this.transform(user, agent, gameApplet, urlParamMap);
+                    wechatMiniGameDataReportRpc.userActiveReport(activeReportRpcDTO);
+                }
+            }
+        } catch (Exception e) {
+            log.error("用户回传异常, userId : {}, e : {}", user.getId(), e.getMessage());
+        }
+    }
+
+    @Override
+    public void orderCallBack(PlatformOrderDTO platformOrderDTO) {
+        //查询用户渠道信息
+        Agent agent = agentService.getById(platformOrderDTO.getAgentId());
+        if (agent == null) {
+            log.error("订单回传不存在渠道信息, orderId : {}", platformOrderDTO.getOrderId());
+            return;
+        }
+        User user = userService.getById(platformOrderDTO.getUserId());
+        //查询小游戏信息或者H5游戏相关公众号信息
+        GameApplet gameApplet = gameAppletService.getOne(new LambdaQueryWrapper<GameApplet>()
+                .eq(GameApplet::getGameId, user.getGameId()));
+        try {
+            //腾讯回传
+            if (Objects.equals(agent.getAccountType(), Agent.ACCOUNT_TYPE_TENCENT)) {
+                TencentOrderDTO tencentOrderDTO = this.transform(platformOrderDTO, user, agent, gameApplet);
+                gameBackTencentRpc.backOrder(tencentOrderDTO);
+            }
+            //头条回传
+            if (Objects.equals(agent.getAccountType(), Agent.ACCOUNT_TYPE_BYTE)) {
+                //判断游戏类型
+                Game game = gameService.getById(platformOrderDTO.getGameId());
+                if (Objects.equals(game.getCategory(), GameCategoryEnum.CATEGORY_WX_APPLET.getCategory())) {
+                    OrderReportRpcDTO orderReportRpcDTO = this.transform(platformOrderDTO, user.getOpenId(), agent, gameApplet);
+                    wechatMiniGameDataReportRpc.orderReport(orderReportRpcDTO);
+                }
+            }
+        } catch (Exception e) {
+            log.error("订单回传异常, orderId : {}, e : {}", platformOrderDTO.getOrderId(), e.getMessage());
+        }
+    }
+
+    private TencentUserDTO transform(User user, Agent agent, GameApplet gameApplet) {
+        return TencentUserDTO.builder()
+                .gameId(user.getGameId())
+                .adAccountId(agent.getAccountId())
+                .registerTime(user.getCreateTime())
+                .channel(agent.getAgentKey())
+                .wechatOpenid(user.getOpenId())
+                .wechatAppId(gameApplet == null ? null : gameApplet.getAppId())
+                .build();
+    }
 
+    private UserActiveReportRpcDTO transform(User user, Agent agent, GameApplet gameApplet, Map<String, String> urlParamMap) {
+        AccountReportRpcDTO accountReportRpcDTO = AccountReportRpcDTO.builder()
+                .accountId(agent.getAccountId())
+                .reportToken(agent.getReportToken())
+                .reportUrl(agent.getReportUrl())
+                .build();
+        return UserActiveReportRpcDTO.builder()
+                .gameId(user.getGameId())
+                .wechatAppId(gameApplet == null ? null : gameApplet.getAppId())
+                .wechatOpenId(user.getOpenId())
+                .accountReport(accountReportRpcDTO)
+                .agentKey(agent.getAgentKey())
+                .activeTime(user.getCreateTime())
+                .clueToken(urlParamMap.get("clue_token"))
+                .projectId(urlParamMap.get("project_id") == null ? null : Long.valueOf(urlParamMap.get("project_id")))
+                .promotionId(urlParamMap.get("promotion_id") == null ? null : Long.valueOf(urlParamMap.get("promotion_id")))
+                .advertiserId(urlParamMap.get("advertiser_id") == null ? null : Long.valueOf(urlParamMap.get("advertiser_id")))
+                .reqId(urlParamMap.get("req_id"))
+                .build();
+    }
 
-//    @DubboReference(providedBy = PlatformServer.SERVER_DUBBO_NAME)
-//    private IAppUserRpc appUserRpc;
-//
-//    @DubboReference(providedBy = PlatformServer.SERVER_DUBBO_NAME)
-//    private IAppOrderRpc appOrderRpc;
-//
-//    @Override
-//    public void userCallBack(User user) {
-//        if (user == null) {
-//            return;
-//        }
-//        log.error("用户注册回传, userId : {}", user.getId());
-//        UserRegisterRpcDTO dto = UserRegisterRpcDTO.builder()
-//                .appKey(String.valueOf(user.getGameId()))
-//                .userId(String.valueOf(user.getId()))
-//                .username(user.getUsername())
-//                .mac(user.getMac())
-//                .imei(user.getImei())
-//                .androidId(user.getAndroidId())
-//                .ip(user.getIp())
-//                .osType(OsEnum.getByName(user.getDeviceSystem()))
-//                .registerTime(user.getCreateTime())
-//                .build();
-//        //调接口
-//        ResultVO<AppReportLogRpcVO> result;
-//        try {
-//            result = appUserRpc.register(dto);
-//        } catch (Exception e) {
-//            log.error("用户注册回传上报异常, user : {}, e : {}", JsonUtil.toString(user), e.getMessage());
-//            return;
-//        }
-//        log.error("用户注册回传结果, userId : {}, result : {}", user.getId(), JsonUtil.toString(result));
-//        String adId = "AD_ID";
-//        //成功
-//        if (result.isSuccess() && result.getData() != null && result.getData().getAid() != null) {
-//            adId = result.getData().getAid().toString();
-//        }
-//        //更新数据库
-//        userService.update(new LambdaUpdateWrapper<User>().set(User::getAdId, adId).eq(User::getId, user.getId()));
-//    }
-//
-//    @Override
-//    public void orderCallBack(PlatformOrderDTO orderInfo) {
-//        if (orderInfo == null) {
-//            return;
-//        }
-//        log.error("用户注册回传, orderId : {}", orderInfo.getOrderId());
-//        AppOrderRpcDTO dto = AppOrderRpcDTO.builder()
-//                .appKey(String.valueOf(orderInfo.getGameId()))
-//                .orderId(orderInfo.getOrderId())
-//                .userId(String.valueOf(orderInfo.getUserId()))
-//                .amount(orderInfo.getAmount().multiply(new BigDecimal("100")).longValue())
-//                .realAmount(orderInfo.getRealAmount().multiply(new BigDecimal("100")).longValue())
-//                .tranNo(orderInfo.getMerchantOrderNo())
-//                .orderStatus(orderInfo.getStatus())
-//                .payType(PayTypeEnum.getByPayType(orderInfo.getPayWayId()))
-//                .payTime(orderInfo.getPayTime())
-//                .createTime(orderInfo.getCreateTime())
-//                .build();
-//        //调接口
-//        ResultVO<AppReportLogRpcVO> result;
-//        try {
-//            result = appOrderRpc.order(dto);
-//        } catch (Exception e) {
-//            log.error("订单回传上报异常, orderInfo : {}, e : {}", JsonUtil.toString(orderInfo), e.getMessage());
-//            return;
-//        }
-//        log.error("订单回传结果, orderId : {}, result : {}", orderInfo.getOrderId(), JsonUtil.toString(result));
-//        String adId = "AD_ID";
-//        Integer callBackStatus = CallBackEnum.FAIL_CALL_BACK.getCallBackStatus();
-//        //成功
-//        if (result.isSuccess() && result.getData() != null && result.getData().getAid() != null) {
-//            adId = result.getData().getAid().toString();
-//            callBackStatus = CallBackEnum.SUCCESS_CALL_BACK.getCallBackStatus();
-//        }
-//        //更新数据库
-//        orderService.update(new LambdaUpdateWrapper<Order>()
-//                .set(Order::getAdId, adId)
-//                .set(Order::getCallBackStatus, callBackStatus)
-//                .eq(Order::getOrderId, orderInfo.getOrderId()));
-//    }
+    private TencentOrderDTO transform(PlatformOrderDTO platformOrderDTO, User user, Agent agent, GameApplet gameApplet) {
+        return TencentOrderDTO.builder()
+                .backPolicyId(agent.getBackPolicyId())
+                .gameId(platformOrderDTO.getGameId())
+                .adAccountId(agent.getAccountId())
+                .registerTime(user.getCreateTime())
+                .rechargeMoney(platformOrderDTO.getAmount().longValue() * 100)
+                .rechargeTime(platformOrderDTO.getCreateTime())
+                .orderId(platformOrderDTO.getOrderId())
+                .channel(agent.getAgentKey())
+                .wechatOpenid(user.getOpenId())
+                .wechatAppId(gameApplet == null ? null : gameApplet.getAppId())
+                .orderStatus(platformOrderDTO.getStatus())
+                .payTime(platformOrderDTO.getPayTime())
+                .build();
+    }
 
+    private OrderReportRpcDTO transform(PlatformOrderDTO platformOrderDTO, String openId, Agent agent, GameApplet gameApplet) {
+        AccountReportRpcDTO accountReportRpcDTO = AccountReportRpcDTO.builder()
+                .accountId(agent.getAccountId())
+                .reportToken(agent.getReportToken())
+                .reportUrl(agent.getReportUrl())
+                .build();
+        return OrderReportRpcDTO.builder()
+                .gameId(platformOrderDTO.getGameId())
+                .accountReport(accountReportRpcDTO)
+                .wechatAppId(gameApplet == null ? null : gameApplet.getAppId())
+                .wechatOpenId(openId)
+                .orderId(platformOrderDTO.getOrderId())
+                .agentKey(agent.getAgentKey())
+                .backPolicyId(agent.getBackPolicyId())
+                .rechargeMoney(platformOrderDTO.getAmount().longValue() * 100)
+                .orderStatus(platformOrderDTO.getStatus())
+                .createTime(platformOrderDTO.getCreateTime())
+                .payTime(platformOrderDTO.getPayTime())
+                .build();
+    }
 }

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

@@ -8,7 +8,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 /**
- * @author : xufeng
+ * @author : lingfeng
  * @time : 2022-07-13
  * @description : game管理
  */
@@ -16,4 +16,5 @@ import org.springframework.stereotype.Service;
 @Service
 public class GameServiceImpl extends ServiceImpl<GameMapper, Game> implements IGameService {
 
+
 }

+ 63 - 76
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/LoginServiceImpl.java

@@ -11,7 +11,6 @@ import com.zanxiang.game.module.mybatis.entity.UserShare;
 import com.zanxiang.game.module.sdk.enums.LoginTypeEnum;
 import com.zanxiang.game.module.sdk.enums.SmsTypeEnum;
 import com.zanxiang.game.module.sdk.pojo.dto.GameAppletDTO;
-import com.zanxiang.game.module.sdk.pojo.dto.UserDTO;
 import com.zanxiang.game.module.sdk.pojo.param.LoginMobileParam;
 import com.zanxiang.game.module.sdk.pojo.param.LoginPasswordParam;
 import com.zanxiang.game.module.sdk.pojo.param.LoginVxCodeParam;
@@ -28,6 +27,7 @@ import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import reactor.util.function.Tuple2;
 
 import java.time.LocalDateTime;
 import java.util.Map;
@@ -105,7 +105,7 @@ public class LoginServiceImpl implements IRegisterLoginService {
         //根据openId查询用户
         User user = userService.getOne(new LambdaQueryWrapper<User>()
                 .eq(User::getGameId, userData.getGameId()).eq(User::getOpenId, openId));
-        //用户注册
+        //已注册
         if (user != null) {
             //更新用户sessionKey
             userService.update(new LambdaUpdateWrapper<User>()
@@ -118,37 +118,8 @@ public class LoginServiceImpl implements IRegisterLoginService {
             //返回登录信息
             return ResultVO.ok(this.createUserLoginVO(user, userData));
         }
-        //渠道标识
-        Long agentId;
-        Long fromUserId = null;
-        if (param.getShareUserId() == null) {
-            agentId = agentService.getAgentIdByChannel(userData.getChannel());
-        } else {
-            UserDTO userDTO = userService.getUserByUserId(param.getShareUserId());
-            agentId = userDTO.getLastAgentId();
-            fromUserId = userDTO.getId();
-        }
-        //构造用户信息
-        user = transform(userData, agentId, openId);
-        user.setOpenId(openId);
-        user.setSessionKey(sessionKey);
-        //创建用户信息
-        userService.save(user);
-        gameUserService.createGameUser(user);
-//        callBackService.userCallBack(user);
-        //返回登录信息
-        if (fromUserId == null) {
-            return ResultVO.ok(this.createUserLoginVO(user, userData));
-        }
-        //记录分享信息
-        UserShare userShare = UserShare.builder()
-                .gameId(userData.getGameId())
-                .fromUserId(fromUserId)
-                .toUserId(user.getId())
-                .createTime(LocalDateTime.now())
-                .updateTime(LocalDateTime.now())
-                .build();
-        userShareService.save(userShare);
+        //用户注册
+        user = userCreateSave(userData, openId, null, null, openId, sessionKey, param.getShareUserId());
         //返回登录信息
         return ResultVO.ok(this.createUserLoginVO(user, userData));
     }
@@ -187,20 +158,16 @@ public class LoginServiceImpl implements IRegisterLoginService {
             if (!Objects.equals(RegisterUtil.cmfPassword(password), user.getPassword())) {
                 return ResultVO.fail(HttpStatusEnum.USERNAME_OR_PASSWORD_ERR.getMsg());
             }
-        } else {
-            //注册, 用户名密码校验
-            HttpStatusEnum checkRegisterEnum = this.checkRegister(username, password);
-            if (!Objects.equals(checkRegisterEnum, HttpStatusEnum.SUCCESS)) {
-                return ResultVO.fail(checkRegisterEnum.getMsg());
-            }
-            //创建用户信息
-            Long agentId = agentService.getAgentIdByChannel(userData.getChannel());
-            user = transform(userData, agentId, username);
-            user.setPassword(password);
-            userService.save(user);
-            gameUserService.createGameUser(user);
-//            callBackService.userCallBack(user);
+            //返回登录信息
+            return ResultVO.ok(this.createUserLoginVO(user, userData));
+        }
+        //用户注册, 用户名密码校验
+        HttpStatusEnum checkRegisterEnum = this.checkRegister(username, password);
+        if (!Objects.equals(checkRegisterEnum, HttpStatusEnum.SUCCESS)) {
+            return ResultVO.fail(checkRegisterEnum.getMsg());
         }
+        //用户注册
+        user = userCreateSave(userData, username, password, null, null, null, null);
         //返回登录信息
         return ResultVO.ok(this.createUserLoginVO(user, userData));
     }
@@ -222,24 +189,65 @@ public class LoginServiceImpl implements IRegisterLoginService {
         //获取用户信息
         User user = userService.getOne(new LambdaQueryWrapper<User>()
                 .eq(User::getGameId, userData.getGameId()).eq(User::getMobile, mobile));
-        //用户信息不存在, 直接注册
-        if (user == null) {
-            Long agentId = agentService.getAgentIdByChannel(userData.getChannel());
-            user = transform(userData, agentId, mobile);
-            user.setMobile(mobile);
-            userService.save(user);
-            gameUserService.createGameUser(user);
-//            callBackService.userCallBack(user);
-        } else {
+        //用户信息存在
+        if (user != null) {
             //判断账号是否停用
             if (Objects.equals(BanStatusEnum.BAN_STATUS.getStatus(), user.getStatus())) {
                 return ResultVO.fail(HttpStatusEnum.ACCOUNT_HALT.getMsg());
             }
+            //返回登录信息
+            return ResultVO.ok(this.createUserLoginVO(user, userData));
         }
+        //用户注册
+        user = userCreateSave(userData, mobile, null, mobile, null, null, null);
         //返回登录信息
         return ResultVO.ok(this.createUserLoginVO(user, userData));
     }
 
+    private User userCreateSave(UserData userData, String userName, String password, String mobile, String openId,
+                                String sessionKey, Long shareUserId) {
+        Tuple2<Long, Map<String, String>> tuple2 = agentService.getUserAgentId(userData.getChannel(), shareUserId);
+        User user = transform(userData, tuple2.getT1(), userName);
+        user.setPassword(password);
+        user.setMobile(mobile);
+        user.setOpenId(openId);
+        user.setSessionKey(sessionKey);
+        userService.save(user);
+        gameUserService.createGameUser(user);
+        callBackService.userCallBack(user, tuple2);
+        //记录分享信息
+        if (shareUserId != null) {
+            userShareService.save(UserShare.builder()
+                    .gameId(userData.getGameId())
+                    .fromUserId(shareUserId)
+                    .toUserId(user.getId())
+                    .createTime(LocalDateTime.now())
+                    .updateTime(LocalDateTime.now())
+                    .build());
+        }
+        return user;
+    }
+
+    private User transform(UserData userData, Long agentId, String userName) {
+        return User.builder()
+                .regAgentId(agentId)
+                .agentId(agentId)
+                .gameId(userData.getGameId())
+                .username(userName)
+                .nickname(RegisterUtil.randomNickName(userName))
+                .deviceType(userData.getDeviceType())
+                .status(BanStatusEnum.NORMAL_STATUS.getStatus())
+                .authentication(0)
+                .createTime(LocalDateTime.now())
+                .updateTime(LocalDateTime.now())
+                .deviceSystem(userData.getDeviceSystem())
+                .mac(userData.getMac())
+                .imei(userData.getImei())
+                .androidId(userData.getAndroidId())
+                .ip(userData.getIp())
+                .build();
+    }
+
     private UserLoginVO createUserLoginVO(User user, UserData userData) {
         //获取token
         String userToken = userTokenService.getUserToken(user.getId(), userData.getDeviceType());
@@ -299,25 +307,4 @@ public class LoginServiceImpl implements IRegisterLoginService {
         //密码验证
         return RegisterUtil.checkPassword(password);
     }
-
-    private User transform(UserData userData, Long agentId, String userName) {
-        //构造用户信息
-        return User.builder()
-                .regAgentId(agentId)
-                .agentId(agentId)
-                .gameId(userData.getGameId())
-                .username(userName)
-                .nickname(RegisterUtil.randomNickName(userName))
-                .deviceType(userData.getDeviceType())
-                .status(BanStatusEnum.NORMAL_STATUS.getStatus())
-                .authentication(0)
-                .createTime(LocalDateTime.now())
-                .updateTime(LocalDateTime.now())
-                .deviceSystem(userData.getDeviceSystem())
-                .mac(userData.getMac())
-                .imei(userData.getImei())
-                .androidId(userData.getAndroidId())
-                .ip(userData.getIp())
-                .build();
-    }
 }

+ 17 - 6
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/OrderServiceImpl.java

@@ -47,6 +47,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     @Autowired
     private IGamePayWayService gamePayWayService;
 
+    @Autowired
+    private ICallBackService callBackService;
+
     @Override
     @Transactional(rollbackFor = {Exception.class, RuntimeException.class})
     public Boolean createOrder(ProductPayParam payParam, UserData userData) {
@@ -83,7 +86,19 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         //生成订单id
         String orderNum = this.getOrderNum(userData.getUserId());
         //构造订单
-        super.save(Order.builder()
+        Order order = this.transform(userData, orderNum, payParam, user, gameUser, game, gameUserRole, gamePayWayDTO);
+        super.save(order);
+        //设置订单号
+        payParam.setOrderId(orderNum);
+        //订单回传
+        callBackService.orderCallBack(BeanUtil.copy(order, PlatformOrderDTO.class));
+        //返回
+        return Boolean.TRUE;
+    }
+
+    private Order transform(UserData userData, String orderNum, ProductPayParam payParam, User user, GameUser gameUser,
+                            Game game, GameUserRole gameUserRole, GamePayWayDTO gamePayWayDTO) {
+        return Order.builder()
                 .orderId(orderNum)
                 .agentId(user.getAgentId())
                 .cpId(game.getCpId())
@@ -112,11 +127,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                 .callBackStatus(CallBackEnum.UN_CALL_BACK.getCallBackStatus())
                 .roleLevel(gameUserRole.getRoleLevel())
                 .roleVipLevel(gameUserRole.getRoleVipLevel())
-                .build());
-        //设置订单号
-        payParam.setOrderId(orderNum);
-        //返回
-        return Boolean.TRUE;
+                .build();
     }
 
     private String getOrderNum(Long userId) {