Ver Fonte

feat : 接口对接整理修改

bilingfeng há 2 anos atrás
pai
commit
5cb1c8394d
16 ficheiros alterados com 376 adições e 148 exclusões
  1. 20 0
      game-module/game-common/src/main/java/com/zanxiang/common/enums/HttpStatusEnum.java
  2. 0 15
      game-module/game-common/src/main/java/com/zanxiang/common/utils/StringUtils.java
  3. 2 1
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/adapter/ArgumentAdapter.java
  4. 66 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/constant/RegexConstant.java
  5. 7 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/controller/LoginController.java
  6. 2 3
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/controller/SmsController.java
  7. 1 13
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/dto/UserTokenDTO.java
  8. 10 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/params/UserData.java
  9. 46 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/result/CardCheckResult.java
  10. 5 22
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/SmsServiceImpl.java
  11. 123 10
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/UserCardServiceImpl.java
  12. 30 58
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/UserTokenServiceImpl.java
  13. 1 3
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/SmsService.java
  14. 10 21
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/UserTokenService.java
  15. 51 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/util/RegexUtil.java
  16. 2 2
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/util/RegisterUtil.java

+ 20 - 0
game-module/game-common/src/main/java/com/zanxiang/common/enums/HttpStatusEnum.java

@@ -242,6 +242,26 @@ public enum HttpStatusEnum {
      */
      */
     GAME_USER_UN_CREATE(41511, "更新游戏角色时,检测为先创建游戏用户"),
     GAME_USER_UN_CREATE(41511, "更新游戏角色时,检测为先创建游戏用户"),
 
 
+    /**
+     * 实名认证名字不合法
+     */
+    CARD_NAME_ERROR(41512, "名字输入错误"),
+
+    /**
+     * 实名认证身份证号不合法
+     */
+    CARD_ID_ERROR(41513, "身份证号输入错误"),
+
+    /**
+     * 已实名认证, 不可重复操作
+     */
+    REPEAT_OPERATE(41514, "已实名认证, 不可重复操作"),
+
+    /**
+     * 实名认证失败
+     */
+    AUTHENTICATION_FAIL(41515, "实名认证失败"),
+
     /**
     /**
      * 参数为空
      * 参数为空
      */
      */

+ 0 - 15
game-module/game-common/src/main/java/com/zanxiang/common/utils/StringUtils.java

@@ -351,21 +351,6 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
         return sb.toString();
         return sb.toString();
     }
     }
 
 
-    /**
-     * 验证字符串是否为手机号
-     *
-     * @param str : 字符串
-     * @return : 是否为手机号
-     */
-    public static boolean checkPhone(String str) {
-        return str.matches("^[1][3,4,5,7,8,9][0-9]{9}$");
-    }
-
-    @SuppressWarnings("unchecked")
-    public static <T> T cast(Object obj) {
-        return (T) obj;
-    }
-
     /**
     /**
      * 判断数组里的字符串是否存在空值
      * 判断数组里的字符串是否存在空值
      *
      *

+ 2 - 1
game-module/game-sdk/src/main/java/com/zanxiang/sdk/adapter/ArgumentAdapter.java

@@ -72,7 +72,8 @@ public class ArgumentAdapter implements HandlerMethodArgumentResolver {
             throw new CustomException(HttpStatusEnum.USER_NO_LOGIN);
             throw new CustomException(HttpStatusEnum.USER_NO_LOGIN);
         }
         }
         data.setUserId(userTokenDTO.getUserId());
         data.setUserId(userTokenDTO.getUserId());
-        log.info("UserData:{}", data);
+        data.setToken(userTokenDTO.getToken());
+        data.setExpireTime(userTokenDTO.getExpireTime());
         return data;
         return data;
     }
     }
 }
 }

+ 66 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/constant/RegexConstant.java

@@ -0,0 +1,66 @@
+package com.zanxiang.sdk.constant;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-10-08
+ * @description : 正则表达式
+ */
+public class RegexConstant {
+
+    /**
+     * 正则:手机号
+     */
+    public static final String REGEX_MOBILE_EXACT = "^[1][3,4,5,7,8,9][0-9]{9}$";
+
+    /**
+     * 正则:中文姓名
+     */
+    public static final String REGEX_CHINESE_NAME = "[\\u4E00-\\u9FA5]{2,5}(?:·[\\u4E00-\\u9FA5]{2,5})*";
+
+    /**
+     * 正则:身份证号码15位
+     */
+    public static final String REGEX_ID_CARD15 = "^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$";
+
+    /**
+     * 正则:身份证号码18位
+     */
+    public static final String REGEX_ID_CARD18 = "^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9Xx])$";
+
+    /**
+     * 正则:用户名,取值范围为a-z,A-Z,0-9,必须是6-20位
+     */
+    public static final String REGEX_USER_NAME = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{4,32}$";
+
+    /**
+     * 正则:密码,取值范围为a-z,A-Z,0-9,必须是6-20位
+     */
+    public static final String REGEX_PASSWORD = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,32}$";
+
+    /**
+     * 正则:邮箱
+     */
+    public static final String REGEX_EMAIL = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$";
+
+    /**
+     * 正则:URL
+     */
+    public static final String REGEX_URL = "[a-zA-z]+://[^\\s]*";
+
+    /**
+     * 正则:汉字
+     */
+    public static final String REGEX_ZH = "^[\\u4e00-\\u9fa5]+$";
+
+    /**
+     * 正则:QQ号
+     */
+    public static final String REGEX_TENCENT_NUM = "[1-9][0-9]{4,}";
+
+    /**
+     * 正则:中国邮政编码
+     */
+    public static final String REGEX_ZIP_CODE = "[1-9]\\d{5}(?!\\d)";
+
+
+}

+ 7 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/controller/LoginController.java

@@ -42,6 +42,13 @@ public class LoginController {
         return userTokenService.userTokenCheck(gameId, userId, token, sign);
         return userTokenService.userTokenCheck(gameId, userId, token, sign);
     }
     }
 
 
+    @ApiOperation(value = "登录凭证时效验证")
+    @GetMapping("/token/expireTime/check")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Long.class)})
+    public ResultVO<Boolean> userTokenExpireTimeCheck(@ValidLogin UserData userData) {
+        return ResultVO.ok(userTokenService.userTokenExpireTimeCheck(userData));
+    }
+
     @ApiOperation(value = "用户账号注册/登录")
     @ApiOperation(value = "用户账号注册/登录")
     @PostMapping("/password")
     @PostMapping("/password")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})

+ 2 - 3
game-module/game-sdk/src/main/java/com/zanxiang/sdk/controller/SmsController.java

@@ -3,7 +3,6 @@ package com.zanxiang.sdk.controller;
 import com.zanxiang.common.domain.ResultVO;
 import com.zanxiang.common.domain.ResultVO;
 import com.zanxiang.sdk.domain.params.SmsCheckParam;
 import com.zanxiang.sdk.domain.params.SmsCheckParam;
 import com.zanxiang.sdk.domain.params.SmsSendParam;
 import com.zanxiang.sdk.domain.params.SmsSendParam;
-import com.zanxiang.sdk.domain.params.UserData;
 import com.zanxiang.sdk.domain.vo.UserLoginVO;
 import com.zanxiang.sdk.domain.vo.UserLoginVO;
 import com.zanxiang.sdk.service.SmsService;
 import com.zanxiang.sdk.service.SmsService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
@@ -40,7 +39,7 @@ public class SmsController {
     @ApiOperation(value = "验证码校验")
     @ApiOperation(value = "验证码校验")
     @PostMapping("/check/msg")
     @PostMapping("/check/msg")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
-    public ResultVO<String> smsCheck(@Validated @RequestBody SmsCheckParam smsCheckParam, UserData userData) {
-        return smsService.smsCheck(smsCheckParam, userData);
+    public ResultVO<String> smsCheck(@Validated @RequestBody SmsCheckParam smsCheckParam) {
+        return smsService.smsCheck(smsCheckParam);
     }
     }
 }
 }

+ 1 - 13
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/dto/UserTokenDTO.java

@@ -2,8 +2,6 @@ package com.zanxiang.sdk.domain.dto;
 
 
 import lombok.Data;
 import lombok.Data;
 
 
-import java.time.LocalDateTime;
-
 /**
 /**
  * @author : lingfeng
  * @author : lingfeng
  * @time : 2022-06-08
  * @time : 2022-06-08
@@ -33,17 +31,7 @@ public class UserTokenDTO {
     private String token;
     private String token;
 
 
     /**
     /**
-     * 设备类型;mobile,android,iphone,ipad,web,pc,mac,wxapp
+     * 客户端类型, 1:安卓app, 2: 苹果iosApp, 3: h5网页, 4 : 小程序(小游戏)
      */
      */
     private Integer deviceType;
     private Integer deviceType;
-
-    /**
-     * 创建时间
-     */
-    private LocalDateTime createTime;
-
-    /**
-     * 更新时间
-     */
-    private LocalDateTime updateTime;
 }
 }

+ 10 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/params/UserData.java

@@ -25,6 +25,16 @@ public class UserData implements Serializable {
      */
      */
     private Long userId;
     private Long userId;
 
 
+    /**
+     * token
+     */
+    private String token;
+
+    /**
+     * 过期时间
+     */
+    private Long expireTime;
+
     /**
     /**
      * 游戏id
      * 游戏id
      */
      */

+ 46 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/result/CardCheckResult.java

@@ -0,0 +1,46 @@
+package com.zanxiang.sdk.domain.result;
+
+import lombok.Data;
+
+import java.util.Objects;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-10-08
+ * @description : 实名认证结果
+ */
+@Data
+public class CardCheckResult {
+
+    /**
+     * 消息
+     */
+    private String message;
+
+    /**
+     * 返回码
+     */
+    private String code;
+
+    /**
+     * 结果
+     */
+    private ResultBean result;
+
+    @Data
+    public static class ResultBean {
+
+        /**
+         * 认证结果, 一致, 未查
+         */
+        private String data;
+    }
+
+    public boolean isSuccess() {
+        return Objects.equals(this.code, "0000");
+    }
+
+    public boolean isPast() {
+        return Objects.equals(this.result.getData(), "一致");
+    }
+}

+ 5 - 22
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/SmsServiceImpl.java

@@ -4,18 +4,16 @@ import com.zanxiang.common.domain.ResultVO;
 import com.zanxiang.common.enums.ExpireTimeEnum;
 import com.zanxiang.common.enums.ExpireTimeEnum;
 import com.zanxiang.common.enums.HttpStatusEnum;
 import com.zanxiang.common.enums.HttpStatusEnum;
 import com.zanxiang.common.enums.SmsTypeEnum;
 import com.zanxiang.common.enums.SmsTypeEnum;
-import com.zanxiang.common.utils.StringUtils;
 import com.zanxiang.module.sms.pojo.SendResult;
 import com.zanxiang.module.sms.pojo.SendResult;
 import com.zanxiang.module.sms.service.impl.AliSmsService;
 import com.zanxiang.module.sms.service.impl.AliSmsService;
 import com.zanxiang.sdk.constant.RedisKeyConstant;
 import com.zanxiang.sdk.constant.RedisKeyConstant;
 import com.zanxiang.sdk.domain.dto.UserDTO;
 import com.zanxiang.sdk.domain.dto.UserDTO;
 import com.zanxiang.sdk.domain.params.SmsCheckParam;
 import com.zanxiang.sdk.domain.params.SmsCheckParam;
 import com.zanxiang.sdk.domain.params.SmsSendParam;
 import com.zanxiang.sdk.domain.params.SmsSendParam;
-import com.zanxiang.sdk.domain.params.UserData;
 import com.zanxiang.sdk.service.SmsService;
 import com.zanxiang.sdk.service.SmsService;
 import com.zanxiang.sdk.service.UserService;
 import com.zanxiang.sdk.service.UserService;
-import com.zanxiang.sdk.service.UserTokenService;
 import com.zanxiang.sdk.util.RedisUtil;
 import com.zanxiang.sdk.util.RedisUtil;
+import com.zanxiang.sdk.util.RegexUtil;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.logging.log4j.util.Strings;
 import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -42,9 +40,6 @@ public class SmsServiceImpl implements SmsService {
     @Autowired
     @Autowired
     private AliSmsService aliSmsService;
     private AliSmsService aliSmsService;
 
 
-    @Autowired
-    private UserTokenService userTokenService;
-
     /**
     /**
      * 发送短信验证码
      * 发送短信验证码
      *
      *
@@ -74,7 +69,7 @@ public class SmsServiceImpl implements SmsService {
             }
             }
         }
         }
         //验证手机号
         //验证手机号
-        if (!StringUtils.checkPhone(mobile)) {
+        if (!RegexUtil.checkPhone(mobile)) {
             return new ResultVO<>(HttpStatusEnum.PHONE_ERROR);
             return new ResultVO<>(HttpStatusEnum.PHONE_ERROR);
         }
         }
         //验证类型
         //验证类型
@@ -101,26 +96,14 @@ public class SmsServiceImpl implements SmsService {
      * 前端校验短信验证码
      * 前端校验短信验证码
      *
      *
      * @param smsCheckParam : 参数
      * @param smsCheckParam : 参数
-     * @param userData      : userData
      * @return : 返回验证结果和token
      * @return : 返回验证结果和token
      */
      */
     @Override
     @Override
-    public ResultVO<String> smsCheck(SmsCheckParam smsCheckParam, UserData userData) {
+    public ResultVO<String> smsCheck(SmsCheckParam smsCheckParam) {
         //校验短信验证码
         //校验短信验证码
         HttpStatusEnum httpStatusEnum = this.smsCheck(smsCheckParam.getType(), smsCheckParam.getMobile(), smsCheckParam.getCode());
         HttpStatusEnum httpStatusEnum = this.smsCheck(smsCheckParam.getType(), smsCheckParam.getMobile(), smsCheckParam.getCode());
-        //校验不通过
-        if (!Objects.equals(httpStatusEnum, HttpStatusEnum.SUCCESS)) {
-            return new ResultVO<>(httpStatusEnum);
-        }
-        //查询用户信息
-        UserDTO userDTO = userService.getUserInfoByMobile(smsCheckParam.getMobile());
-        if (userDTO == null) {
-            return new ResultVO<>(HttpStatusEnum.PHONE_NOT_REG);
-        }
-        //获取token
-        String userToken = userTokenService.getUserToken(userDTO.getId(), userData.getDeviceType());
         //返回
         //返回
-        return new ResultVO<>(HttpStatusEnum.SUCCESS, userToken);
+        return new ResultVO<>(httpStatusEnum);
     }
     }
 
 
     /**
     /**
@@ -139,7 +122,7 @@ public class SmsServiceImpl implements SmsService {
             return HttpStatusEnum.CODE_TYPE_ERROR;
             return HttpStatusEnum.CODE_TYPE_ERROR;
         }
         }
         //验证手机号
         //验证手机号
-        if (!StringUtils.checkPhone(mobile)) {
+        if (!RegexUtil.checkPhone(mobile)) {
             return HttpStatusEnum.PHONE_ERROR;
             return HttpStatusEnum.PHONE_ERROR;
         }
         }
         //获取缓存中的验证码
         //获取缓存中的验证码

+ 123 - 10
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/UserCardServiceImpl.java

@@ -5,19 +5,34 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.common.domain.ResultVO;
 import com.zanxiang.common.domain.ResultVO;
 import com.zanxiang.common.enums.HttpStatusEnum;
 import com.zanxiang.common.enums.HttpStatusEnum;
+import com.zanxiang.common.exception.BaseException;
 import com.zanxiang.mybatis.entity.User;
 import com.zanxiang.mybatis.entity.User;
 import com.zanxiang.mybatis.entity.UserCard;
 import com.zanxiang.mybatis.entity.UserCard;
 import com.zanxiang.mybatis.mapper.UserCardMapper;
 import com.zanxiang.mybatis.mapper.UserCardMapper;
+import com.zanxiang.sdk.constant.RegexConstant;
 import com.zanxiang.sdk.domain.params.UserCardUpdateParam;
 import com.zanxiang.sdk.domain.params.UserCardUpdateParam;
 import com.zanxiang.sdk.domain.params.UserData;
 import com.zanxiang.sdk.domain.params.UserData;
+import com.zanxiang.sdk.domain.result.CardCheckResult;
 import com.zanxiang.sdk.service.UserCardService;
 import com.zanxiang.sdk.service.UserCardService;
 import com.zanxiang.sdk.service.UserService;
 import com.zanxiang.sdk.service.UserService;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.client.RestTemplate;
 
 
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.UUID;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 
 /**
 /**
  * @author : lingfeng
  * @author : lingfeng
@@ -31,6 +46,15 @@ public class UserCardServiceImpl extends ServiceImpl<UserCardMapper, UserCard> i
     @Autowired
     @Autowired
     private UserService userService;
     private UserService userService;
 
 
+    @Autowired
+    private RestTemplate restTemplate;
+
+    /**
+     * 异步回调地址
+     */
+    @Value("${authentication.appCode}")
+    private String appCode;
+
     /**
     /**
      * 用户实名认证
      * 用户实名认证
      *
      *
@@ -41,18 +65,30 @@ public class UserCardServiceImpl extends ServiceImpl<UserCardMapper, UserCard> i
     @Override
     @Override
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
     public ResultVO<Boolean> userAuthentication(UserCardUpdateParam param, UserData userData) {
     public ResultVO<Boolean> userAuthentication(UserCardUpdateParam param, UserData userData) {
-        String cardId = param.getCardId();
-        String cardName = param.getCardName();
-        //todo : 调用阿里的实名认证接口
-        int authentication = 1;
+        //查询实名认证信息
         UserCard userCard = super.getOne(new LambdaQueryWrapper<UserCard>()
         UserCard userCard = super.getOne(new LambdaQueryWrapper<UserCard>()
                 .eq(UserCard::getUserId, userData.getUserId()));
                 .eq(UserCard::getUserId, userData.getUserId()));
+        //已经实名认证, 不可重复认证
         if (userCard != null) {
         if (userCard != null) {
-            this.update(new LambdaUpdateWrapper<UserCard>()
-                    .set(UserCard::getCardId, cardId)
-                    .set(UserCard::getCardName, cardName)
-                    .set(UserCard::getUpdateTime, LocalDateTime.now()));
-            return new ResultVO<>(HttpStatusEnum.SUCCESS, Boolean.TRUE);
+            return new ResultVO<>(HttpStatusEnum.REPEAT_OPERATE);
+        }
+        String cardId = param.getCardId();
+        String cardName = param.getCardName();
+        boolean nameCheck = this.cardNameCheck(cardName);
+        //名字输入不合法
+        if (!nameCheck) {
+            return new ResultVO<>(HttpStatusEnum.CARD_NAME_ERROR);
+        }
+        boolean idCheck = this.cardIdCheck(cardId);
+        //身份证号输入不合法
+        if (!idCheck) {
+            return new ResultVO<>(HttpStatusEnum.CARD_ID_ERROR);
+        }
+        //阿里实名认证
+        boolean authenticationCheck = this.authenticationCheck(cardName, cardId);
+        //实名认证失败
+        if (!authenticationCheck) {
+            return new ResultVO<>(HttpStatusEnum.AUTHENTICATION_FAIL);
         }
         }
         //新建记录
         //新建记录
         userCard = UserCard.builder()
         userCard = UserCard.builder()
@@ -65,8 +101,85 @@ public class UserCardServiceImpl extends ServiceImpl<UserCardMapper, UserCard> i
         this.save(userCard);
         this.save(userCard);
         //更新用户信息
         //更新用户信息
         userService.update(new LambdaUpdateWrapper<User>()
         userService.update(new LambdaUpdateWrapper<User>()
-                .set(User::getAuthentication, authentication)
+                .set(User::getAuthentication, this.getAge(cardId) >= 18 ? 1 : 2)
                 .eq(User::getId, userData.getUserId()));
                 .eq(User::getId, userData.getUserId()));
         return new ResultVO<>(HttpStatusEnum.SUCCESS, Boolean.TRUE);
         return new ResultVO<>(HttpStatusEnum.SUCCESS, Boolean.TRUE);
     }
     }
+
+    /**
+     * 姓名正则验证
+     *
+     * @param cardName : 姓名
+     * @return : 返回是否合法
+     */
+    private boolean cardNameCheck(String cardName) {
+        Pattern pattern = Pattern.compile(RegexConstant.REGEX_CHINESE_NAME);
+        Matcher matcher = pattern.matcher(cardName);
+        return matcher.matches();
+    }
+
+    /**
+     * 身份证正则验证
+     *
+     * @param cardId : 身份证号
+     * @return : 返回是否合法
+     */
+    private boolean cardIdCheck(String cardId) {
+        String idValid = "(" + RegexConstant.REGEX_ID_CARD18 + ")" + "|" + "(" + RegexConstant.REGEX_ID_CARD15 + ")";
+        Pattern pattern = Pattern.compile(idValid);
+        Matcher matcher = pattern.matcher(cardId);
+        return matcher.matches();
+    }
+
+    /**
+     * 通过身份证号码获取年龄
+     *
+     * @param cardId : 身份证号码
+     * @return : 返回用户年龄
+     */
+    private int getAge(String cardId) {
+        String birthday = cardId.substring(6, 14);
+        Date birthDate = null;
+        try {
+            birthDate = new SimpleDateFormat("yyyyMMdd").parse(birthday);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        if (birthDate == null) {
+            return 0;
+        }
+        GregorianCalendar currentDay = new GregorianCalendar();
+        currentDay.setTime(birthDate);
+        int birYear = currentDay.get(Calendar.YEAR);
+        // 获取年龄
+        return LocalDate.now().getYear() - birYear;
+    }
+
+    /**
+     * 阿里实名认证
+     *
+     * @param cardName : 姓名
+     * @param cardId   : 身份证号
+     * @return : 返回是否匹配
+     */
+    private boolean authenticationCheck(String cardName, String cardId) {
+        String host = "https://dskj.market.alicloudapi.com/platform/check/verified";
+        String url = host + "?certCode=" + cardId + "&realName=" + cardName;
+        HttpHeaders headers = new HttpHeaders();
+        headers.set("Authorization", "APPCODE " + this.appCode);
+        headers.set("X-Ca-Nonce", UUID.randomUUID().toString());
+        HttpEntity httpEntity = new HttpEntity<>(headers);
+        CardCheckResult result;
+        try {
+            result = restTemplate.postForObject(url, httpEntity, CardCheckResult.class);
+        } catch (Exception e) {
+            log.error("请求阿里实名认证接口异常, cardName : {}, cardId : {}, e : {}", cardName, cardId, e.getMessage());
+            throw new BaseException("请求阿里实名认证接口异常");
+        }
+        if (result == null || !result.isSuccess()) {
+            log.error("请求阿里实名认证接口返回值为空, cardName : {}, cardId : {}", cardName, cardId);
+            throw new BaseException("实名认证失败");
+        }
+        return result.isPast();
+    }
 }
 }

+ 30 - 58
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/UserTokenServiceImpl.java

@@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.common.constant.Constants;
 import com.zanxiang.common.constant.Constants;
 import com.zanxiang.common.domain.ResultVO;
 import com.zanxiang.common.domain.ResultVO;
 import com.zanxiang.common.enums.ExpireTimeEnum;
 import com.zanxiang.common.enums.ExpireTimeEnum;
-import com.zanxiang.common.enums.HttpStatusEnum;
 import com.zanxiang.common.exception.BaseException;
 import com.zanxiang.common.exception.BaseException;
 import com.zanxiang.common.text.UUID;
 import com.zanxiang.common.text.UUID;
 import com.zanxiang.common.utils.DateUtils;
 import com.zanxiang.common.utils.DateUtils;
@@ -16,6 +15,7 @@ import com.zanxiang.mybatis.entity.UserToken;
 import com.zanxiang.mybatis.mapper.UserTokenMapper;
 import com.zanxiang.mybatis.mapper.UserTokenMapper;
 import com.zanxiang.sdk.constant.RedisKeyConstant;
 import com.zanxiang.sdk.constant.RedisKeyConstant;
 import com.zanxiang.sdk.domain.dto.UserTokenDTO;
 import com.zanxiang.sdk.domain.dto.UserTokenDTO;
+import com.zanxiang.sdk.domain.params.UserData;
 import com.zanxiang.sdk.service.GameExtService;
 import com.zanxiang.sdk.service.GameExtService;
 import com.zanxiang.sdk.service.UserTokenService;
 import com.zanxiang.sdk.service.UserTokenService;
 import com.zanxiang.sdk.util.RedisUtil;
 import com.zanxiang.sdk.util.RedisUtil;
@@ -48,41 +48,61 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken
     /**
     /**
      * 登录凭证验证
      * 登录凭证验证
      *
      *
-     * @param gameId : 游戏id
+     * @param appId  : 游戏id
      * @param userId : 用户id
      * @param userId : 用户id
      * @param token  : 用户token
      * @param token  : 用户token
      * @param sign   : 签名
      * @param sign   : 签名
      * @return : 返回验证结果
      * @return : 返回验证结果
      */
      */
     @Override
     @Override
-    public ResultVO<Long> userTokenCheck(Long gameId, Long userId, String token, String sign) {
+    public ResultVO<Long> userTokenCheck(Long appId, Long userId, String token, String sign) {
         //查询登录签名
         //查询登录签名
-        GameExt gameKey = gameExtService.getByGameId(gameId);
-        if (gameKey == null || Strings.isBlank(gameKey.getLoginKey())) {
-            return ResultVO.ok(-3, "验证失败");
+        GameExt gameExt = gameExtService.getByGameId(appId);
+        if (gameExt == null || Strings.isBlank(gameExt.getLoginKey())) {
+            return ResultVO.ok(-1, "参数不全");
         }
         }
         //查询token是否存在
         //查询token是否存在
         UserToken userToken = super.getOne(new LambdaQueryWrapper<UserToken>()
         UserToken userToken = super.getOne(new LambdaQueryWrapper<UserToken>()
                 .eq(UserToken::getToken, token)
                 .eq(UserToken::getToken, token)
                 .eq(UserToken::getUserId, userId));
                 .eq(UserToken::getUserId, userId));
-        if (userToken == null) {
+        //判断token是否存在, 并且没有过期
+        if (userToken == null || userToken.getExpireTime() < DateUtils.localDateTimeToSecond(LocalDateTime.now())) {
             return ResultVO.ok(-3, "验证失败");
             return ResultVO.ok(-3, "验证失败");
         }
         }
         //登录密钥
         //登录密钥
-        String loginKey = gameKey.getLoginKey();
+        String loginKey = gameExt.getLoginKey();
         //计算用户签名
         //计算用户签名
-        String sb = "loginKey=" + loginKey + "&gameId=" + gameId + "&userId=" + userId + "&token=" + token;
+        String sb = "loginKey=" + loginKey + "&appId=" + appId + "&userId=" + userId + "&token=" + token;
         String mySign;
         String mySign;
         try {
         try {
             mySign = SignUtil.MD5(sb);
             mySign = SignUtil.MD5(sb);
         } catch (Exception e) {
         } catch (Exception e) {
+            log.error("md5工具类加密异常");
             throw new BaseException("MD5加密异常");
             throw new BaseException("MD5加密异常");
         }
         }
         //签名错误
         //签名错误
         if (!Objects.equals(mySign, sign)) {
         if (!Objects.equals(mySign, sign)) {
             return ResultVO.ok(-2, "签名错误");
             return ResultVO.ok(-2, "签名错误");
         }
         }
-        return ResultVO.ok(1, "验证成功", userId);
+        return ResultVO.ok(userId);
+    }
+
+    /**
+     * 登录凭证验证
+     *
+     * @param userData : 用户信息
+     * @return : 返回凭证是否过期
+     */
+    @Override
+    public Boolean userTokenExpireTimeCheck(UserData userData) {
+        Long expireTime = userData.getExpireTime();
+        if (expireTime == null) {
+            return Boolean.FALSE;
+        }
+        //判断token是否过期
+        long endTime = DateUtils.localDateTimeToSecond(LocalDateTime.now().plusDays(1));
+        //判断有效期时间是否大于1天
+        return expireTime > endTime;
     }
     }
 
 
     /**
     /**
@@ -116,54 +136,6 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken
         return BeanUtils.copy(userToken, UserTokenDTO.class);
         return BeanUtils.copy(userToken, UserTokenDTO.class);
     }
     }
 
 
-    /**
-     * 通过用户设备获取token详情
-     *
-     * @param userId     : 用户id
-     * @param deviceType : 设备类型
-     * @return : 返回token
-     */
-    @Override
-    public UserTokenDTO getTokenInfoByUserDevice(Long userId, Integer deviceType) {
-        //查询缓存信息
-        String userTokenKey = this.getUserTokenKey(userId, deviceType);
-        UserToken userToken = redisUtil.getCache(userTokenKey);
-        if (userToken != null) {
-            return BeanUtils.copy(userToken, UserTokenDTO.class);
-        }
-        //缓存不存在, 查询数据库
-        userToken = super.getOne(new LambdaQueryWrapper<UserToken>()
-                .eq(UserToken::getUserId, userId)
-                .eq(UserToken::getDeviceType, deviceType));
-        if (userToken == null) {
-            return null;
-        }
-        //设置token详情缓存
-        String tokenInfoKey = this.getTokenInfoKey(userToken.getToken(), deviceType);
-        redisUtil.setCache(tokenInfoKey, userToken, ExpireTimeEnum.ONE_DAY.getTime());
-        //设置用户缓存
-        redisUtil.setCache(userTokenKey, userToken, ExpireTimeEnum.ONE_DAY.getTime());
-        //返回数据
-        return BeanUtils.copy(userToken, UserTokenDTO.class);
-    }
-
-    /**
-     * 用户token校验
-     *
-     * @param token      : 用户token
-     * @param userId     : 用户id
-     * @param deviceType : 设备类型
-     * @return : 返回token校验结果
-     */
-    @Override
-    public HttpStatusEnum checkUserToken(String token, Long userId, Integer deviceType) {
-        UserTokenDTO userTokenDTO = this.getTokenInfoByUserDevice(userId, deviceType);
-        if (userTokenDTO != null && Objects.equals(userTokenDTO.getToken(), token)) {
-            return HttpStatusEnum.SUCCESS;
-        }
-        return HttpStatusEnum.INVALID_PARAMS;
-    }
-
     /**
     /**
      * 获取用户token
      * 获取用户token
      *
      *

+ 1 - 3
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/SmsService.java

@@ -4,7 +4,6 @@ import com.zanxiang.common.domain.ResultVO;
 import com.zanxiang.common.enums.HttpStatusEnum;
 import com.zanxiang.common.enums.HttpStatusEnum;
 import com.zanxiang.sdk.domain.params.SmsCheckParam;
 import com.zanxiang.sdk.domain.params.SmsCheckParam;
 import com.zanxiang.sdk.domain.params.SmsSendParam;
 import com.zanxiang.sdk.domain.params.SmsSendParam;
-import com.zanxiang.sdk.domain.params.UserData;
 
 
 /**
 /**
  * @author : lingfeng
  * @author : lingfeng
@@ -25,10 +24,9 @@ public interface SmsService {
      * 前端校验短信验证码
      * 前端校验短信验证码
      *
      *
      * @param smsCheckParam : 参数
      * @param smsCheckParam : 参数
-     * @param userData      : userData
      * @return : 返回验证结果和token
      * @return : 返回验证结果和token
      */
      */
-    ResultVO<String> smsCheck(SmsCheckParam smsCheckParam, UserData userData);
+    ResultVO<String> smsCheck(SmsCheckParam smsCheckParam);
 
 
     /**
     /**
      * 校验短信验证码
      * 校验短信验证码

+ 10 - 21
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/UserTokenService.java

@@ -2,9 +2,9 @@ package com.zanxiang.sdk.service;
 
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zanxiang.common.domain.ResultVO;
 import com.zanxiang.common.domain.ResultVO;
-import com.zanxiang.common.enums.HttpStatusEnum;
 import com.zanxiang.mybatis.entity.UserToken;
 import com.zanxiang.mybatis.entity.UserToken;
 import com.zanxiang.sdk.domain.dto.UserTokenDTO;
 import com.zanxiang.sdk.domain.dto.UserTokenDTO;
+import com.zanxiang.sdk.domain.params.UserData;
 
 
 /**
 /**
  * @author : lingfeng
  * @author : lingfeng
@@ -16,41 +16,30 @@ public interface UserTokenService extends IService<UserToken> {
     /**
     /**
      * 登录凭证验证
      * 登录凭证验证
      *
      *
-     * @param gameId : 游戏id
+     * @param appId  : 游戏id
      * @param userId : 用户id
      * @param userId : 用户id
      * @param token  : 用户token
      * @param token  : 用户token
      * @param sign   : 签名
      * @param sign   : 签名
      * @return : 返回验证结果
      * @return : 返回验证结果
      */
      */
-    ResultVO<Long> userTokenCheck(Long gameId, Long userId, String token, String sign);
+    ResultVO<Long> userTokenCheck(Long appId, Long userId, String token, String sign);
 
 
     /**
     /**
-     * 通过token设备获取token详情
-     *
-     * @param token      : 用户token
-     * @param deviceType : 设备类型
-     * @return : 返回用户token详情
-     */
-    UserTokenDTO getTokenInfoByTokenDevice(String token, Integer deviceType);
-
-    /**
-     * 通过用户设备获取token详情
+     * 登录凭证验证
      *
      *
-     * @param userId     : 用户id
-     * @param deviceType : 设备类型
-     * @return : 返回token
+     * @param userData : 用户信息
+     * @return : 返回凭证是否过期
      */
      */
-    UserTokenDTO getTokenInfoByUserDevice(Long userId, Integer deviceType);
+    Boolean userTokenExpireTimeCheck(UserData userData);
 
 
     /**
     /**
-     * 用户token校验
+     * 通过token设备获取token详情
      *
      *
      * @param token      : 用户token
      * @param token      : 用户token
-     * @param userId     : 用户id
      * @param deviceType : 设备类型
      * @param deviceType : 设备类型
-     * @return : 返回token校验结果
+     * @return : 返回用户token详情
      */
      */
-    HttpStatusEnum checkUserToken(String token, Long userId, Integer deviceType);
+    UserTokenDTO getTokenInfoByTokenDevice(String token, Integer deviceType);
 
 
     /**
     /**
      * 获取用户token
      * 获取用户token

+ 51 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/util/RegexUtil.java

@@ -0,0 +1,51 @@
+package com.zanxiang.sdk.util;
+
+import com.zanxiang.sdk.constant.RegexConstant;
+import org.apache.logging.log4j.util.Strings;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-10-09
+ * @description : 正则匹配
+ */
+public class RegexUtil {
+
+    /**
+     * 验证字符串是否为手机号
+     *
+     * @param phone : 字符串
+     * @return : 是否为手机号
+     */
+    public static boolean checkPhone(String phone) {
+        if (Strings.isBlank(phone)) {
+            return Boolean.FALSE;
+        }
+        return phone.matches(RegexConstant.REGEX_MOBILE_EXACT);
+    }
+
+    /**
+     * 验证用户名是否合规范
+     *
+     * @param userName : 字符串
+     * @return : 是否符合规定
+     */
+    public static boolean checkUserName(String userName) {
+        if (Strings.isBlank(userName)) {
+            return Boolean.FALSE;
+        }
+        return userName.matches(RegexConstant.REGEX_USER_NAME);
+    }
+
+    /**
+     * 验证密码是否合规范
+     *
+     * @param password : 密码
+     * @return : 是否符合规定
+     */
+    public static boolean checkPassword(String password) {
+        if (Strings.isBlank(password)) {
+            return Boolean.FALSE;
+        }
+        return password.matches(RegexConstant.REGEX_PASSWORD);
+    }
+}

+ 2 - 2
game-module/game-sdk/src/main/java/com/zanxiang/sdk/util/RegisterUtil.java

@@ -54,7 +54,7 @@ public class RegisterUtil {
             return HttpStatusEnum.USERNAME_TOO_LONG;
             return HttpStatusEnum.USERNAME_TOO_LONG;
         }
         }
         //用户名只能是数字字母组合
         //用户名只能是数字字母组合
-        if (userName.matches("/\\s/") || !userName.matches("^[A-Za-z0-9]+$")) {
+        if (!RegexUtil.checkUserName(userName)) {
             return HttpStatusEnum.USERNAME_BAD_CHAR;
             return HttpStatusEnum.USERNAME_BAD_CHAR;
         }
         }
         //密码验证
         //密码验证
@@ -78,7 +78,7 @@ public class RegisterUtil {
             return HttpStatusEnum.PASSWORD_TOO_LONG;
             return HttpStatusEnum.PASSWORD_TOO_LONG;
         }
         }
         //密码只能是数字字母组合
         //密码只能是数字字母组合
-        if (password.matches("/\\s/") || !password.matches("^[A-Za-z0-9]+$")) {
+        if (!RegexUtil.checkPassword(password)) {
             return HttpStatusEnum.PASSWORD_BAD_CHAR;
             return HttpStatusEnum.PASSWORD_BAD_CHAR;
         }
         }
         return HttpStatusEnum.SUCCESS;
         return HttpStatusEnum.SUCCESS;