Преглед изворни кода

feat : 用户接口代码补充提交

bilingfeng пре 2 година
родитељ
комит
7d39356b40

+ 1 - 6
game-module/game-common/src/main/java/com/zanxiang/common/enums/SmsTypeEnum.java

@@ -30,15 +30,10 @@ public enum SmsTypeEnum {
      */
     SMS_BIND(3, "绑定手机"),
 
-    /**
-     * 实名认证
-     */
-    SMS_ID_VERIFY(4, "实名认证"),
-
     /**
      * 找回密码
      */
-    SMS_FIND_PWD(5, "找回密码");
+    SMS_FIND_PWD(4, "找回密码");
 
     /**
      * 类型

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

@@ -1,5 +1,7 @@
 package com.zanxiang.mybatis.entity;
 
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.*;
 
@@ -21,6 +23,7 @@ public class UserCard {
     /**
      * 主键
      */
+    @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
     /**

+ 41 - 12
game-module/game-sdk/src/main/java/com/zanxiang/sdk/common/resolver/TokenArgumentResolver.java

@@ -3,15 +3,16 @@ package com.zanxiang.sdk.common.resolver;
 import com.zanxiang.common.enums.HttpStatusEnum;
 import com.zanxiang.common.exception.CustomException;
 import com.zanxiang.common.utils.StringUtils;
+import com.zanxiang.mybatis.entity.GameKey;
 import com.zanxiang.sdk.common.annotation.ValidLogin;
 import com.zanxiang.sdk.common.util.DeviceCheckUtil;
+import com.zanxiang.sdk.common.util.SignUtil;
 import com.zanxiang.sdk.domain.dto.UserTokenDTO;
 import com.zanxiang.sdk.domain.params.UserData;
-import com.zanxiang.sdk.service.Impl.pay.AliPayServiceImpl;
+import com.zanxiang.sdk.service.GameKeyService;
 import com.zanxiang.sdk.service.UserTokenService;
 import lombok.extern.slf4j.Slf4j;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.logging.log4j.util.Strings;
 import org.springframework.core.MethodParameter;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
@@ -22,6 +23,7 @@ import org.springframework.web.method.support.ModelAndViewContainer;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.util.Objects;
 
 /**
  * token转用户信息解析器
@@ -34,18 +36,20 @@ import javax.servlet.http.HttpServletRequest;
 @Slf4j
 public class TokenArgumentResolver implements HandlerMethodArgumentResolver {
 
-    private static final Logger logger = LoggerFactory.getLogger(AliPayServiceImpl.class);
-
     @Resource
     private UserTokenService userTokenService;
 
+    @Resource
+    private GameKeyService gameKeyService;
+
     @Override
     public boolean supportsParameter(MethodParameter parameter) {
         return parameter.getParameterType().equals(UserData.class);
     }
 
     @Override
-    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
+    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
+                                  WebDataBinderFactory binderFactory) throws Exception {
         HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
         if (request == null) {
             throw new CustomException(HttpStatusEnum.UNKNOWN_ERROR);
@@ -56,30 +60,55 @@ public class TokenArgumentResolver implements HandlerMethodArgumentResolver {
         if (b && StringUtils.isEmpty(token)) {
             throw new CustomException(HttpStatusEnum.USER_NO_LOGIN);
         }
+        //签名验证
+        String gameId = this.signCheck(request);
+        //请求头处理
         String userAgent = request.getHeader("user-agent");
-        logger.info("user-agent:{}", userAgent);
         Integer deviceType = DeviceCheckUtil.getType(userAgent);
         UserData data = new UserData();
         data.setDeviceType(deviceType);
         data.setDeviceSystem(DeviceCheckUtil.getDeviceSystem(userAgent));
-        logger.info("UserData:{}", data);
+        data.setGameId(Long.valueOf(gameId));
         if (StringUtils.isEmpty(token)) {
             if (b) {
                 throw new CustomException(HttpStatusEnum.USER_NO_LOGIN);
             }
             return data;
         }
-        UserTokenDTO tokenInfoByTokenDevice = userTokenService.getTokenInfoByTokenDevice(token, deviceType);
-        if (tokenInfoByTokenDevice == null) {
+        UserTokenDTO userTokenDTO = userTokenService.getTokenInfoByTokenDevice(token, deviceType);
+        if (userTokenDTO == null) {
             if (b) {
                 throw new CustomException(HttpStatusEnum.USER_NO_LOGIN);
             }
             return data;
         }
-        if (b && tokenInfoByTokenDevice.getUserId() == null) {
+        if (b && userTokenDTO.getUserId() == null) {
             throw new CustomException(HttpStatusEnum.USER_NO_LOGIN);
         }
-        data.setUserId(tokenInfoByTokenDevice.getUserId());
+        data.setUserId(userTokenDTO.getUserId());
+        log.info("UserData:{}", data);
         return data;
     }
+
+    private String signCheck(HttpServletRequest request) throws Exception {
+        //游戏id和密钥
+        String gameId = request.getHeader("gameId");
+        String sign = request.getHeader("sign");
+        String timestamp = request.getHeader("timestamp");
+        if (Strings.isBlank(sign) || Strings.isBlank(timestamp) || Strings.isBlank(gameId)) {
+            throw new CustomException(HttpStatusEnum.INVALID_PARAMS);
+        }
+        //签名验证
+        GameKey gameKey = gameKeyService.getByGameId(Long.valueOf(gameId));
+        if (gameKey == null || Strings.isBlank(gameKey.getAppKey())) {
+            throw new CustomException(HttpStatusEnum.INVALID_PARAMS);
+        }
+        String str = "appKey=" + gameKey.getAppKey() + "&gameId=" + gameId + "&timestamp=" + timestamp;
+        String mySign = SignUtil.MD5(str);
+        //签名对比
+        if (!Objects.equals(mySign, sign)) {
+            throw new CustomException(HttpStatusEnum.INVALID_PARAMS);
+        }
+        return gameId;
+    }
 }

+ 15 - 13
game-module/game-sdk/src/main/java/com/zanxiang/sdk/common/util/DeviceCheckUtil.java

@@ -1,7 +1,7 @@
 package com.zanxiang.sdk.common.util;
 
+import com.zanxiang.common.enums.DeviceTypeEnum;
 import com.zanxiang.common.enums.OsEnum;
-import com.zanxiang.common.enums.PayDeviceEnum;
 import com.zanxiang.common.utils.StringUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
@@ -69,18 +69,20 @@ public class DeviceCheckUtil {
      * @return PayDeviceEnum
      */
     public static Integer getType(String userAgent) {
-        //todo app判断场景待加入
-        boolean isMobile = isMobile(userAgent);
-        if (!isMobile) {
-            return PayDeviceEnum.PC_PAY.getCode();
-        }
-        //todo 微信小程序场景待校验
-        //验证是否为微信小程序环境
-        Matcher matcherWxMini = wxMiniPat.matcher(userAgent);
-        if (matcherWxMini.find()) {
-            return PayDeviceEnum.MINI_APP_PAY.getCode();
-        }
-        return PayDeviceEnum.H5_PAY.getCode();
+        //暂时只有安卓App, 只返回安卓app类型
+        return DeviceTypeEnum.DEVICE_TYPE_ANDROID_APP.getDeviceType();
+//        //todo app判断场景待加入
+//        boolean isMobile = isMobile(userAgent);
+//        if (!isMobile) {
+//            return PayDeviceEnum.PC_PAY.getCode();
+//        }
+//        //todo 微信小程序场景待校验
+//        //验证是否为微信小程序环境
+//        Matcher matcherWxMini = wxMiniPat.matcher(userAgent);
+//        if (matcherWxMini.find()) {
+//            return PayDeviceEnum.MINI_APP_PAY.getCode();
+//        }
+//        return PayDeviceEnum.H5_PAY.getCode();
     }
 
     /**

+ 19 - 4
game-module/game-sdk/src/main/java/com/zanxiang/sdk/controller/LoginController.java

@@ -3,6 +3,7 @@ package com.zanxiang.sdk.controller;
 import com.zanxiang.common.domain.ResultVO;
 import com.zanxiang.sdk.domain.params.LoginMobileParam;
 import com.zanxiang.sdk.domain.params.LoginPasswordParam;
+import com.zanxiang.sdk.domain.params.UserData;
 import com.zanxiang.sdk.domain.vo.UserLoginVO;
 import com.zanxiang.sdk.service.RegisterLoginService;
 import com.zanxiang.sdk.service.UserTokenService;
@@ -43,15 +44,29 @@ public class LoginController {
     @ApiOperation(value = "用户账号注册注册/登录")
     @PostMapping("/password")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
-    public ResultVO<UserLoginVO> loginPassword(@Validated @RequestBody LoginPasswordParam param, HttpServletRequest request) {
-        return registerPassword.loginPassword(param, request);
+    public ResultVO<UserLoginVO> loginPassword(@Validated @RequestBody LoginPasswordParam param, UserData userData, HttpServletRequest request) {
+        return registerPassword.loginPassword(param, userData, request);
     }
 
     @ApiOperation(value = "用户手机号注册/登录")
     @PostMapping("/mobile")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
-    public ResultVO<UserLoginVO> loginMobile(@Validated @RequestBody LoginMobileParam param, HttpServletRequest request) {
-        return registerPassword.loginMobile(param, request);
+    public ResultVO<UserLoginVO> loginMobile(@Validated @RequestBody LoginMobileParam param, UserData userData, HttpServletRequest request) {
+        return registerPassword.loginMobile(param, userData, request);
+    }
+
+    @ApiOperation(value = "用户退出")
+    @PostMapping("/sign/out")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
+    public ResultVO<Boolean> loginOut() {
+        return ResultVO.ok();
+    }
+
+    @ApiOperation(value = "用户账号注销")
+    @PostMapping("/write/off")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
+    public ResultVO<Boolean> writeOff() {
+        return ResultVO.ok();
     }
 
 //    @ApiOperation(value = "用户QQ授权登录")

+ 21 - 21
game-module/game-sdk/src/main/java/com/zanxiang/sdk/controller/OrderController.java

@@ -35,26 +35,26 @@ public class OrderController {
     @Autowired
     private GameStrategyService gameStrategyService;
 
-    @ApiOperation(value = "订单生成")
-    @PostMapping(value = "/preOrder")
-    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = PreOrderVO.class)})
-    public ResultMap preOrder(@Validated @RequestBody PreOrderParam order, UserData user) {
-        String userId = String.valueOf(user.getUserId());
-        PlatformOrderBO orderBo = BeanUtils.copy(order, PlatformOrderBO.class);
-        orderBo.setUserId(userId);
-        orderBo.setPayDevice(user.getDeviceType().toString());
-        Boolean paySwitch = gameStrategyService.paySwitch(user, orderBo);
-        String orderId = orderService.create(orderBo);
-        if (StringUtils.isEmpty(orderId)) {
-            return ResultMap.error("生成订单失败");
-        }
-        PreOrderVO data = new PreOrderVO();
-        data.setOrderId(orderId);
-        data.setPaySwitch(paySwitch);
-        //todo 此处切换与产品定义切换含义不一致 游戏是否切换支付方式临时为true
-        paySwitch = true;
-        orderBo.setIsSwitch(paySwitch);
-        return ResultMap.ok(data);
-    }
+//    @ApiOperation(value = "订单生成")
+//    @PostMapping(value = "/preOrder")
+//    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = PreOrderVO.class)})
+//    public ResultMap preOrder(@Validated @RequestBody PreOrderParam order, UserData user) {
+//        String userId = String.valueOf(user.getUserId());
+//        PlatformOrderBO orderBo = BeanUtils.copy(order, PlatformOrderBO.class);
+//        orderBo.setUserId(userId);
+//        orderBo.setPayDevice(user.getDeviceType().toString());
+//        Boolean paySwitch = gameStrategyService.paySwitch(user, orderBo);
+//        String orderId = orderService.create(orderBo);
+//        if (StringUtils.isEmpty(orderId)) {
+//            return ResultMap.error("生成订单失败");
+//        }
+//        PreOrderVO data = new PreOrderVO();
+//        data.setOrderId(orderId);
+//        data.setPaySwitch(paySwitch);
+//        //todo 此处切换与产品定义切换含义不一致 游戏是否切换支付方式临时为true
+//        paySwitch = true;
+//        orderBo.setIsSwitch(paySwitch);
+//        return ResultMap.ok(data);
+//    }
 
 }

+ 0 - 8
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/params/LoginMobileParam.java

@@ -4,7 +4,6 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
 
 /**
  * @author : lingfeng
@@ -27,11 +26,4 @@ public class LoginMobileParam {
     @ApiModelProperty(notes = "验证码")
     @NotBlank(message = "验证码不可为空")
     private String code;
-
-    /**
-     * 游戏id
-     */
-    @ApiModelProperty(notes = "游戏id")
-    @NotNull(message = "游戏id类型不可为空")
-    private Long gameId;
 }

+ 0 - 7
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/params/LoginPasswordParam.java

@@ -38,11 +38,4 @@ public class LoginPasswordParam {
     @ApiModelProperty(notes = "类型 , 0 : 注册登录, 1 : 登录")
     @NotNull(message = "类型不可为空")
     private Integer type;
-
-    /**
-     * 游戏id
-     */
-    @ApiModelProperty(notes = "游戏id")
-    @NotNull(message = "游戏id类型不可为空")
-    private Long gameId;
 }

+ 0 - 3
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/params/SmsSendParam.java

@@ -1,6 +1,5 @@
 package com.zanxiang.sdk.domain.params;
 
-import com.fasterxml.jackson.annotation.JsonAlias;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -19,7 +18,6 @@ public class SmsSendParam {
      * 验证码类型
      */
     @ApiModelProperty(notes = "验证码类型")
-    @JsonAlias("sms-type")
     @NotNull(message = "验证码类型不可为空")
     private Integer type;
 
@@ -27,7 +25,6 @@ public class SmsSendParam {
      * 手机号码
      */
     @ApiModelProperty(notes = "手机号码")
-    @JsonAlias("sms-mobile")
     @NotBlank(message = "手机号码不可为空")
     private String mobile;
 }

+ 11 - 1
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/params/UserData.java

@@ -18,12 +18,13 @@ import java.io.Serializable;
 @AllArgsConstructor
 public class UserData implements Serializable {
 
+    private static final long serialVersionUID = -7831270456996143737L;
+
     /**
      * 玩家id
      */
     private Long userId;
 
-
     /**
      * 设备类型;
      */
@@ -34,6 +35,11 @@ public class UserData implements Serializable {
      */
     private String deviceSystem;
 
+    /**
+     * 游戏id
+     */
+    private Long gameId;
+
     public Long getUserId() {
         if (userId == null) {
             return 1L;
@@ -54,4 +60,8 @@ public class UserData implements Serializable {
         }
         return deviceSystem;
     }
+
+    public Long getGameId() {
+        return gameId;
+    }
 }

+ 10 - 8
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/LoginServiceImpl.java

@@ -88,16 +88,17 @@ public class LoginServiceImpl implements RegisterLoginService {
     /**
      * 用户名注册或者登录
      *
-     * @param param   : 注册登录参数
-     * @param request : 请求信息
+     * @param param    : 注册登录参数
+     * @param request  : 请求信息
+     * @param userData : 用户信息
      * @return : 返回用户登录信息
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public ResultVO<UserLoginVO> loginPassword(LoginPasswordParam param, HttpServletRequest request) {
+    public ResultVO<UserLoginVO> loginPassword(LoginPasswordParam param, UserData userData, HttpServletRequest request) {
         String username = param.getUsername();
         String password = param.getPassword();
-        Long gameId = param.getGameId();
+        Long gameId = userData.getGameId();
         Integer type = param.getType();
         //用户信息
         User user;
@@ -156,16 +157,17 @@ public class LoginServiceImpl implements RegisterLoginService {
     /**
      * 手机号登录
      *
-     * @param param   : 手机号登录参数
-     * @param request : HttpServletRequest
+     * @param param    : 手机号登录参数
+     * @param request  : 请求信息
+     * @param userData : 用户信息
      * @return : 返回登录信息
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public ResultVO<UserLoginVO> loginMobile(LoginMobileParam param, HttpServletRequest request) {
+    public ResultVO<UserLoginVO> loginMobile(LoginMobileParam param, UserData userData, HttpServletRequest request) {
         String mobile = param.getMobile();
         String code = param.getCode();
-        Long gameId = param.getGameId();
+        Long gameId = userData.getGameId();
         //验证码校验
         HttpStatusEnum httpStatusEnum = smsService.smsCheck(SmsTypeEnum.SMS_REG.getType(), mobile, code);
         //验证不通过, 返回

+ 6 - 4
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/RegisterLoginService.java

@@ -20,20 +20,22 @@ public interface RegisterLoginService {
     /**
      * 用户名注册或者登录
      *
-     * @param param   : 注册登录参数
-     * @param request : 请求信息
+     * @param param    : 注册登录参数
+     * @param userData : 用户信息
+     * @param request  : 请求信息
      * @return : 返回用户登录信息
      */
-    ResultVO<UserLoginVO> loginPassword(LoginPasswordParam param, HttpServletRequest request);
+    ResultVO<UserLoginVO> loginPassword(LoginPasswordParam param, UserData userData, HttpServletRequest request);
 
     /**
      * 手机号登录
      *
      * @param param   : 手机号登录参数
+     * @param userData   : 用户信息
      * @param request : HttpServletRequest
      * @return : 返回登录信息
      */
-    ResultVO<UserLoginVO> loginMobile(LoginMobileParam param, HttpServletRequest request);
+    ResultVO<UserLoginVO> loginMobile(LoginMobileParam param, UserData userData, HttpServletRequest request);
 
     /**
      * QQ授权登录