Procházet zdrojové kódy

fix : 绑定手机号新增3个接口

bilingfeng před 3 měsíci
rodič
revize
e709164aa2

+ 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服务启动成功 <腾讯媒体sdk回传优化> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <绑定手机号新增3个接口> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +

+ 28 - 7
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/controller/SmsController.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.BindPhoneParam;
 import com.zanxiang.game.module.sdk.pojo.param.SmsCheckParam;
 import com.zanxiang.game.module.sdk.pojo.param.SmsSendParam;
 import com.zanxiang.game.module.sdk.pojo.param.UserData;
-import com.zanxiang.game.module.sdk.pojo.vo.UserLoginVO;
 import com.zanxiang.game.module.sdk.service.ISmsService;
 import com.zanxiang.module.util.pojo.ResultVO;
 import io.swagger.annotations.Api;
@@ -12,10 +13,9 @@ import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
 
 /**
  * @author : lingfeng
@@ -32,15 +32,36 @@ public class SmsController {
 
     @ApiOperation(value = "发送短信")
     @PostMapping("/send/msg")
-    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Boolean.class)})
     public ResultVO<Boolean> smsSend(@Validated @RequestBody SmsSendParam smsSendParam, UserData userData) {
         return smsService.smsSend(smsSendParam, userData);
     }
 
     @ApiOperation(value = "验证码校验")
     @PostMapping("/check/msg")
-    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Boolean.class)})
     public ResultVO<Boolean> smsCheck(@Validated @RequestBody SmsCheckParam smsCheckParam) {
         return smsService.smsCheck(smsCheckParam);
     }
+
+    @ApiOperation(value = "获取绑定手机号")
+    @GetMapping("/bind/phone")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Map.class)})
+    public ResultVO<Map<String, Object>> getBindPhone(@ValidLogin UserData userData) {
+        return ResultVO.ok(smsService.getBindPhone(userData));
+    }
+
+    @ApiOperation(value = "绑定手机号发送验证码")
+    @GetMapping("/bind/phone/send")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Map.class)})
+    public ResultVO<Map<String, Object>> bindPhoneSend(@RequestParam String phone, @ValidLogin UserData userData) {
+        return ResultVO.ok(smsService.bindPhoneSend(phone, userData));
+    }
+
+    @ApiOperation(value = "绑定手机号验证")
+    @PostMapping("/bind/phone/check")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Map.class)})
+    public ResultVO<Map<String, Object>> bindPhoneCheck(@Validated @RequestBody BindPhoneParam param, @ValidLogin UserData userData) {
+        return ResultVO.ok(smsService.bindPhoneCheck(param, userData));
+    }
 }

+ 2 - 2
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/enums/CallBackEnum.java

@@ -30,10 +30,10 @@ public enum CallBackEnum {
     /**
      * 数据类型
      */
-    private Integer callBackStatus;
+    private final Integer callBackStatus;
 
     /**
      * 描述
      */
-    private String name;
+    private final String name;
 }

+ 1 - 1
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/enums/CpPushDataEnum.java

@@ -40,5 +40,5 @@ public enum CpPushDataEnum {
     /**
      * 枚举值
      */
-    private String value;
+    private final String value;
 }

+ 2 - 2
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/enums/DataTypeEnum.java

@@ -40,10 +40,10 @@ public enum DataTypeEnum {
     /**
      * 数据类型
      */
-    private Integer dateType;
+    private final Integer dateType;
 
     /**
      * 描述
      */
-    private String name;
+    private final String name;
 }

+ 2 - 2
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/enums/DeviceTypeEnum.java

@@ -37,12 +37,12 @@ public enum DeviceTypeEnum {
     /**
      * 设备类型
      */
-    private Integer deviceType;
+    private final Integer deviceType;
 
     /**
      * 描述
      */
-    private String describe;
+    private final String describe;
 
     public static DeviceTypeEnum getByDeviceType(Integer deviceType) {
         for (DeviceTypeEnum deviceTypeEnum : DeviceTypeEnum.values()) {

+ 1 - 1
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/enums/KafkaEventTrackEnum.java

@@ -50,5 +50,5 @@ public enum KafkaEventTrackEnum {
     /**
      * 数据埋点类型
      */
-    private String value;
+    private final String value;
 }

+ 2 - 2
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/enums/LoginTypeEnum.java

@@ -30,10 +30,10 @@ public enum LoginTypeEnum {
     /**
      * 登录类型
      */
-    private Integer loginType;
+    private final Integer loginType;
 
     /**
      * 描述
      */
-    private String name;
+    private final String name;
 }

+ 2 - 2
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/enums/ShellSwitchEnum.java

@@ -30,11 +30,11 @@ public enum ShellSwitchEnum {
     /**
      * 壳包控制
      */
-    private Integer shellSwitch;
+    private final Integer shellSwitch;
 
     /**
      * 描述
      */
-    private String name;
+    private final String name;
 
 }

+ 2 - 2
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/enums/SmsTypeEnum.java

@@ -38,12 +38,12 @@ public enum SmsTypeEnum {
     /**
      * 类型
      */
-    private Integer type;
+    private final Integer type;
 
     /**
      * 描述
      */
-    private String describe;
+    private final String describe;
 
     /**
      * 根据type获取枚举

+ 2 - 2
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/enums/TokenCheckEnum.java

@@ -30,10 +30,10 @@ public enum TokenCheckEnum {
     /**
      * 支付方式
      */
-    private Integer code;
+    private final Integer code;
 
     /**
      * 支付类前缀
      */
-    private String msg;
+    private final String msg;
 }

+ 29 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/ISmsService.java

@@ -1,11 +1,14 @@
 package com.zanxiang.game.module.sdk.service;
 
 import com.zanxiang.game.module.base.pojo.enums.HttpStatusEnum;
+import com.zanxiang.game.module.sdk.pojo.param.BindPhoneParam;
 import com.zanxiang.game.module.sdk.pojo.param.SmsCheckParam;
 import com.zanxiang.game.module.sdk.pojo.param.SmsSendParam;
 import com.zanxiang.game.module.sdk.pojo.param.UserData;
 import com.zanxiang.module.util.pojo.ResultVO;
 
+import java.util.Map;
+
 /**
  * @author : lingfeng
  * @time : 2022-06-13
@@ -13,6 +16,32 @@ import com.zanxiang.module.util.pojo.ResultVO;
  */
 public interface ISmsService {
 
+    /**
+     * 获取用户绑定的手机号
+     *
+     * @param userData : 用户信息
+     * @return : 返回是否绑定手机号
+     */
+    Map<String, Object> getBindPhone(UserData userData);
+
+    /**
+     * 绑定手机号发送验证码
+     *
+     * @param phone    : 手机号
+     * @param userData : 用户信息
+     * @return : 返回发送结果
+     */
+    Map<String, Object> bindPhoneSend(String phone, UserData userData);
+
+    /**
+     * 绑定手机号
+     *
+     * @param param    : 手机号验证码信息
+     * @param userData : 用户信息
+     * @return : 返回绑定结果
+     */
+    Map<String, Object> bindPhoneCheck(BindPhoneParam param, UserData userData);
+
     /**
      * 短信发送
      *

+ 78 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/SmsServiceImpl.java

@@ -1,11 +1,15 @@
 package com.zanxiang.game.module.sdk.service.impl;
 
 import cn.hutool.core.util.RandomUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.zanxiang.game.module.base.pojo.enums.HttpStatusEnum;
+import com.zanxiang.game.module.mybatis.entity.User;
 import com.zanxiang.game.module.sdk.constant.RedisKeyConstant;
 import com.zanxiang.game.module.sdk.enums.ExpireTimeEnum;
 import com.zanxiang.game.module.sdk.enums.SmsTypeEnum;
 import com.zanxiang.game.module.sdk.pojo.dto.UserDTO;
+import com.zanxiang.game.module.sdk.pojo.param.BindPhoneParam;
 import com.zanxiang.game.module.sdk.pojo.param.SmsCheckParam;
 import com.zanxiang.game.module.sdk.pojo.param.SmsSendParam;
 import com.zanxiang.game.module.sdk.pojo.param.UserData;
@@ -15,12 +19,17 @@ import com.zanxiang.game.module.sdk.util.RedisUtil;
 import com.zanxiang.game.module.sdk.util.RegexUtil;
 import com.zanxiang.module.sms.pojo.SendResult;
 import com.zanxiang.module.sms.service.impl.AliSmsService;
+import com.zanxiang.module.util.exception.BaseException;
 import com.zanxiang.module.util.pojo.ResultVO;
 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 java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Objects;
 
 /**
@@ -41,6 +50,75 @@ public class SmsServiceImpl implements ISmsService {
     @Autowired
     private AliSmsService aliSmsService;
 
+    @Override
+    public Map<String, Object> getBindPhone(UserData userData) {
+        User user = userService.getById(userData.getUserId());
+        if (user == null) {
+            throw new BaseException("参数错误, 用户信息不存在");
+        }
+        if (Strings.isBlank(user.getMobile())) {
+            return Collections.singletonMap("isBindPhone", Boolean.FALSE);
+        }
+        Map<String, Object> resultMap = new HashMap<>(2);
+        resultMap.put("isBindPhone", Boolean.TRUE);
+        resultMap.put("phone", user.getShowPhoneNum());
+        return resultMap;
+    }
+
+    @Override
+    public Map<String, Object> bindPhoneSend(String phone, UserData userData) {
+        //验证手机号
+        if (!RegexUtil.checkPhone(phone)) {
+            return this.buildResultMap(Boolean.FALSE, "手机号不合法, 请重新输入");
+        }
+        //校验手机号是否已经绑定了其他账号
+        if (userService.count(new LambdaQueryWrapper<User>()
+                .eq(User::getGameId, userData.getGameId())
+                .eq(User::getMobile, phone)
+        ) > 0) {
+            return this.buildResultMap(Boolean.FALSE, "手机号已被其他账号绑定, 请联系客服");
+        }
+        //验证码缓存key
+        String key = this.smsKey(phone, SmsTypeEnum.SMS_BIND.getType());
+        //判断是否已经发送
+        if (Strings.isNotBlank(redisUtil.getCache(key))) {
+            return this.buildResultMap(Boolean.FALSE, "验证码已经发送, 请勿重复操作");
+        }
+        //发送验证码
+        String randomCode = this.randomCode();
+        SendResult sendResult = aliSmsService.sendCode(randomCode, phone);
+        //发送失败
+        if (!sendResult.isSuccess()) {
+            return this.buildResultMap(Boolean.FALSE, "验证码发送失败, 请稍后重试或者联系客服");
+        }
+        //发送成功设置缓存, 时效5分钟
+        redisUtil.setCache(key, randomCode, ExpireTimeEnum.FIVE_MIN.getTime());
+        return this.buildResultMap(Boolean.TRUE, "发送成功");
+    }
+
+    private Map<String, Object> buildResultMap(Boolean sendResult, String msg) {
+        Map<String, Object> resultMap = new HashMap<>(2);
+        resultMap.put("result", sendResult);
+        resultMap.put("msg", msg);
+        return resultMap;
+    }
+
+    @Override
+    public Map<String, Object> bindPhoneCheck(BindPhoneParam param, UserData userData) {
+        //验证码验证
+        HttpStatusEnum statusEnum = this.smsCheck(SmsTypeEnum.SMS_BIND.getType(), param.getMobile(), param.getCode());
+        if (!Objects.equals(statusEnum, HttpStatusEnum.SUCCESS)) {
+            return this.buildResultMap(Boolean.FALSE, statusEnum.getMsg());
+        }
+        //更新用户手机号
+        userService.update(new LambdaUpdateWrapper<User>()
+                .set(User::getMobile, param.getMobile())
+                .set(User::getUpdateTime, LocalDateTime.now())
+                .eq(User::getId, userData.getUserId()));
+        //返回结果
+        return this.buildResultMap(Boolean.TRUE, "绑定成功");
+    }
+
     @Override
     public ResultVO<Boolean> smsSend(SmsSendParam smsSendParam, UserData userData) {
         //类型