From 4f3e06237b984630f389a320edbf24668dbda0db Mon Sep 17 00:00:00 2001 From: XiaoHH <1431984546@qq.com> Date: Thu, 6 Jul 2023 10:52:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A3=80=E6=9F=A5=E7=9F=AD=E4=BF=A1=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PassengerVerificationController.java | 13 +++++++ .../service/PassengerVerificationService.java | 9 +++++ .../PassengerVerificationServiceImpl.java | 20 ++++++++++ .../business/VerificationCodeConstant.java | 39 +++++++++++++++++++ .../java/com/greateme/util/StringUtil.java | 19 ++++++++- .../feign/VerificationCodeRemote.java | 9 +++++ .../fallback/VerificationCodeFallback.java | 12 ++++++ .../VerificationCodeController.java | 11 ++++++ .../service/VerificationCodeService.java | 8 ++++ .../impl/VerificationCodeServiceImpl.java | 35 ++++++++++++++--- 10 files changed, 168 insertions(+), 7 deletions(-) create mode 100644 common/common-contant/src/main/java/com/greateme/contant/business/VerificationCodeConstant.java diff --git a/api/api-passenger/src/main/java/com/greateme/passenger/controller/PassengerVerificationController.java b/api/api-passenger/src/main/java/com/greateme/passenger/controller/PassengerVerificationController.java index 8d273fd..0be09ab 100644 --- a/api/api-passenger/src/main/java/com/greateme/passenger/controller/PassengerVerificationController.java +++ b/api/api-passenger/src/main/java/com/greateme/passenger/controller/PassengerVerificationController.java @@ -3,6 +3,7 @@ package com.greateme.passenger.controller; import com.greateme.entity.respose.ResponseEntity; import com.greateme.passenger.service.PassengerVerificationService; import com.greateme.verification.entity.dto.PassengerVerificationCodeDTO; +import com.greateme.verification.entity.vo.PassengerVerificationCodeVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.PostMapping; @@ -42,4 +43,16 @@ public class PassengerVerificationController { return ResponseEntity.error("生成短信验证码失败"); } } + + /** + * 检查手机验证码是否正确 + * + * @param passengerVerificationCode 手机验证码的检查对象 + * @return 检查结果,返回bool,判断是否正确 + */ + @PostMapping("/check") + public ResponseEntity checkVerificationCode(@RequestBody PassengerVerificationCodeVO passengerVerificationCode) { + Boolean checkResult = this.verificationService.checkPhoneVerificationCode(passengerVerificationCode); + return ResponseEntity.success(checkResult); + } } diff --git a/api/api-passenger/src/main/java/com/greateme/passenger/service/PassengerVerificationService.java b/api/api-passenger/src/main/java/com/greateme/passenger/service/PassengerVerificationService.java index 2ba42a5..3ac5ce4 100644 --- a/api/api-passenger/src/main/java/com/greateme/passenger/service/PassengerVerificationService.java +++ b/api/api-passenger/src/main/java/com/greateme/passenger/service/PassengerVerificationService.java @@ -1,6 +1,7 @@ package com.greateme.passenger.service; import com.greateme.verification.entity.dto.PassengerVerificationCodeDTO; +import com.greateme.verification.entity.vo.PassengerVerificationCodeVO; /** *

@@ -21,4 +22,12 @@ public interface PassengerVerificationService { * @return 手机验证码后续的验证token */ String generationPhoneVerificationCode(PassengerVerificationCodeDTO verificationCode); + + /** + * 检查手机验证码是否正确 + * + * @param passengerVerificationCode 手机验证码的检查对象 + * @return 检查结果,返回bool,判断是否正确 + */ + Boolean checkPhoneVerificationCode(PassengerVerificationCodeVO passengerVerificationCode); } diff --git a/api/api-passenger/src/main/java/com/greateme/passenger/service/impl/PassengerVerificationServiceImpl.java b/api/api-passenger/src/main/java/com/greateme/passenger/service/impl/PassengerVerificationServiceImpl.java index ff02b17..a95c5a4 100644 --- a/api/api-passenger/src/main/java/com/greateme/passenger/service/impl/PassengerVerificationServiceImpl.java +++ b/api/api-passenger/src/main/java/com/greateme/passenger/service/impl/PassengerVerificationServiceImpl.java @@ -1,5 +1,6 @@ package com.greateme.passenger.service.impl; +import com.greateme.contant.business.VerificationCodeConstant; import com.greateme.contant.http.HttpStatus; import com.greateme.entity.respose.ResponseEntity; import com.greateme.passenger.service.PassengerVerificationService; @@ -12,7 +13,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.ObjectUtils; +import java.util.Objects; import java.util.UUID; /** @@ -58,4 +61,21 @@ public class PassengerVerificationServiceImpl implements PassengerVerificationSe log.error("获取验证码的时候发生了错误,错误码:{},错误信息:{}", passengerVerificationCodeEntity.getCode(), passengerVerificationCodeEntity.getMessage()); return null; } + + + /** + * 检查手机验证码是否正确 + * + * @param passengerVerificationCode 手机验证码的检查对象 + * @return 检查结果,返回bool,判断是否正确 + */ + @Override + public Boolean checkPhoneVerificationCode(PassengerVerificationCodeVO passengerVerificationCode) { + ResponseEntity checkResult = verificationCodeRemote.checkPhoneVerificationCode(passengerVerificationCode); + if (HttpStatus.SUCCESS.getCode() == checkResult.getCode()) { + return Objects.equals(VerificationCodeConstant.VERIFICATION_CODE_RIGHT, checkResult.getDate()); + } + log.error("判断验证码是否正确的是否发生了错误,错误码:{},错误信息:{}", checkResult.getCode(), checkResult.getMessage()); + return null; + } } diff --git a/common/common-contant/src/main/java/com/greateme/contant/business/VerificationCodeConstant.java b/common/common-contant/src/main/java/com/greateme/contant/business/VerificationCodeConstant.java new file mode 100644 index 0000000..85b9a81 --- /dev/null +++ b/common/common-contant/src/main/java/com/greateme/contant/business/VerificationCodeConstant.java @@ -0,0 +1,39 @@ +package com.greateme.contant.business; + +/** + *

+ * 短信验证码相关常量 + *

+ * + * @author XiaoHH + * @version 1.0.0 + * @date 2023-07-05 星期三 22:26:23 + * @file VerificationCodeConstant.java + */ +public class VerificationCodeConstant { + /** + * 此类不允许被实例化 + */ + private VerificationCodeConstant() { + } + + /** + * 用户手机验证码redis存储的前缀 + */ + public static final String PASSENGER_PHONE_VERIFICATION_CODE_PREFIX = "PASSENGER::PHONE::VERIFICATION::CODE::"; + + /** + * 短信验证码正确 + */ + public static final Integer VERIFICATION_CODE_RIGHT = 0; + + /** + * 短信验证码已过期 + */ + public static final Integer VERIFICATION_CODE_TIMEOUT = 1; + + /** + * 短信验证码错误 + */ + public static final Integer VERIFICATION_CODE_WARING = 2; +} diff --git a/common/common-util/src/main/java/com/greateme/util/StringUtil.java b/common/common-util/src/main/java/com/greateme/util/StringUtil.java index 7305021..3cabc70 100644 --- a/common/common-util/src/main/java/com/greateme/util/StringUtil.java +++ b/common/common-util/src/main/java/com/greateme/util/StringUtil.java @@ -25,6 +25,23 @@ public class StringUtil { * @return 生成的随机字符串 */ public static String generationVerificationCode(int length) { - return String.valueOf((int) ((Math.random() * 9 + 1) * Math.pow(10, length -1))); + return String.valueOf((int) ((Math.random() * 9 + 1) * Math.pow(10, length - 1))); + } + + /** + * 判断两个字符串是否相等,如果都为空,那么返回true + * + * @param str1 字符串1 + * @param str2 字符串2 + * @return 判断结果 + */ + public static boolean equal(String str1, String str2) { + if (null == str1 && null == str2) { + return true; + } else if (null != str1) { + return str1.equals(str2); + } else { + return false; + } } } diff --git a/feign-client/verification-code-client/src/main/java/com/greateme/verification/feign/VerificationCodeRemote.java b/feign-client/verification-code-client/src/main/java/com/greateme/verification/feign/VerificationCodeRemote.java index 692dcc7..5fdfeba 100644 --- a/feign-client/verification-code-client/src/main/java/com/greateme/verification/feign/VerificationCodeRemote.java +++ b/feign-client/verification-code-client/src/main/java/com/greateme/verification/feign/VerificationCodeRemote.java @@ -32,4 +32,13 @@ public interface VerificationCodeRemote { */ @PostMapping("/verificationCode/passengerPhone/{length}") ResponseEntity passengerPhone(@RequestBody PassengerVerificationCodeDTO verificationCode, @PathVariable("length") int length); + + /** + * 检查手机验证码是否正确 + * + * @param passengerVerificationCode 手机验证码的检查对象 + * @return 检查结果,返回bool,判断是否正确 + */ + @PostMapping("/verificationCode/checkVerificationCode") + ResponseEntity checkPhoneVerificationCode(@RequestBody PassengerVerificationCodeVO passengerVerificationCode); } diff --git a/feign-client/verification-code-client/src/main/java/com/greateme/verification/feign/fallback/VerificationCodeFallback.java b/feign-client/verification-code-client/src/main/java/com/greateme/verification/feign/fallback/VerificationCodeFallback.java index 015199c..38352b5 100644 --- a/feign-client/verification-code-client/src/main/java/com/greateme/verification/feign/fallback/VerificationCodeFallback.java +++ b/feign-client/verification-code-client/src/main/java/com/greateme/verification/feign/fallback/VerificationCodeFallback.java @@ -43,6 +43,18 @@ public class VerificationCodeFallback implements FallbackFactory checkPhoneVerificationCode(PassengerVerificationCodeVO passengerVerificationCode) { + log.error("跳用远程验证验证码是否正确的接口发生错误,验证码的token:{},验证码:{}", passengerVerificationCode.getVerificationToken(), passengerVerificationCode.getVerificationCode()); + return ResponseEntity.error(); + } }; } } diff --git a/service/service-verification-code/src/main/java/com/greateme/verification/controller/VerificationCodeController.java b/service/service-verification-code/src/main/java/com/greateme/verification/controller/VerificationCodeController.java index 0e8757d..ac85590 100644 --- a/service/service-verification-code/src/main/java/com/greateme/verification/controller/VerificationCodeController.java +++ b/service/service-verification-code/src/main/java/com/greateme/verification/controller/VerificationCodeController.java @@ -35,4 +35,15 @@ public class VerificationCodeController { public ResponseEntity passengerPhone(@RequestBody PassengerVerificationCodeDTO verificationCode, @PathVariable("length") int length) { return ResponseEntity.success(this.verificationCodeService.generationPassengerPhone(verificationCode, length)); } + + /** + * 检查手机验证码是否正确 + * + * @param passengerVerificationCode 手机验证码的检查对象 + * @return 检查结果,返回bool,判断是否正确 + */ + @PostMapping("/checkVerificationCode") + public ResponseEntity checkPhoneVerificationCode(@RequestBody PassengerVerificationCodeVO passengerVerificationCode) { + return ResponseEntity.success(this.verificationCodeService.checkPhoneVerificationCode(passengerVerificationCode)); + } } diff --git a/service/service-verification-code/src/main/java/com/greateme/verification/service/VerificationCodeService.java b/service/service-verification-code/src/main/java/com/greateme/verification/service/VerificationCodeService.java index f80b47c..b6fff1b 100644 --- a/service/service-verification-code/src/main/java/com/greateme/verification/service/VerificationCodeService.java +++ b/service/service-verification-code/src/main/java/com/greateme/verification/service/VerificationCodeService.java @@ -23,4 +23,12 @@ public interface VerificationCodeService { * @return 生成后的详细数据 */ PassengerVerificationCodeVO generationPassengerPhone(PassengerVerificationCodeDTO verificationCode, int length); + + /** + * 检查手机验证码是否正确 + * + * @param passengerVerificationCode 手机验证码的检查对象 + * @return 检查结果,返回bool,判断是否正确 + */ + Integer checkPhoneVerificationCode(PassengerVerificationCodeVO passengerVerificationCode); } diff --git a/service/service-verification-code/src/main/java/com/greateme/verification/service/impl/VerificationCodeServiceImpl.java b/service/service-verification-code/src/main/java/com/greateme/verification/service/impl/VerificationCodeServiceImpl.java index b1d2af8..8d08a31 100644 --- a/service/service-verification-code/src/main/java/com/greateme/verification/service/impl/VerificationCodeServiceImpl.java +++ b/service/service-verification-code/src/main/java/com/greateme/verification/service/impl/VerificationCodeServiceImpl.java @@ -1,12 +1,13 @@ package com.greateme.verification.service.impl; +import com.greateme.contant.business.VerificationCodeConstant; import com.greateme.util.StringUtil; import com.greateme.verification.entity.dto.PassengerVerificationCodeDTO; import com.greateme.verification.entity.dto.PassengerVerificationCodeRedisDTO; import com.greateme.verification.entity.vo.PassengerVerificationCodeVO; import com.greateme.verification.service.VerificationCodeService; -import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; @@ -32,10 +33,8 @@ public class VerificationCodeServiceImpl implements VerificationCodeService { @Autowired private RedisTemplate redisTemplate; - /** - * 用户手机验证码redis存储的前缀 - */ - private static final String PASSENGER_PHONE_VERIFICATION_CODE_PREFIX = "PASSENGER::PHONE::VERIFICATION::CODE::"; + @Value("${business.verification-code.timeout-minute}") + private Integer verificationCodeTimeoutMinute; /** * 生成一个乘客的短信验证码 @@ -56,11 +55,35 @@ public class VerificationCodeServiceImpl implements VerificationCodeService { verificationCodeRedis.setPassengerPhone(verificationCode.getPassengerPhone()); verificationCodeRedis.setToken(token); // 将 verificationCodeRedis 存入redis - this.redisTemplate.opsForValue().set(PASSENGER_PHONE_VERIFICATION_CODE_PREFIX + token, verificationCodeRedis, 5, TimeUnit.MINUTES); + this.redisTemplate.opsForValue().set(VerificationCodeConstant.PASSENGER_PHONE_VERIFICATION_CODE_PREFIX + token, verificationCodeRedis, this.verificationCodeTimeoutMinute, TimeUnit.MINUTES); // 将token和code返回 PassengerVerificationCodeVO result = new PassengerVerificationCodeVO(); result.setVerificationCode(code); result.setVerificationToken(token); return result; } + + /** + * 检查手机验证码是否正确 + * + * @param passengerVerificationCode 手机验证码的检查对象 + * @return 检查结果,返回bool,判断是否正确 + */ + @Override + public Integer checkPhoneVerificationCode(PassengerVerificationCodeVO passengerVerificationCode) { + // 获取短信验证码的token并在redis当中获取正确的短信验证码 + String verificationToken = passengerVerificationCode.getVerificationToken(); + PassengerVerificationCodeRedisDTO verificationCodeRedis = (PassengerVerificationCodeRedisDTO) this.redisTemplate.opsForValue().get(VerificationCodeConstant.PASSENGER_PHONE_VERIFICATION_CODE_PREFIX + verificationToken); + if (null == verificationCodeRedis) { + return VerificationCodeConstant.VERIFICATION_CODE_TIMEOUT; + } else { + String verificationCode = verificationCodeRedis.getVerificationCode(); + if (StringUtil.equal(verificationCode, passengerVerificationCode.getVerificationCode())) { + this.redisTemplate.delete(VerificationCodeConstant.PASSENGER_PHONE_VERIFICATION_CODE_PREFIX + verificationToken); + return VerificationCodeConstant.VERIFICATION_CODE_RIGHT; + } else { + return VerificationCodeConstant.VERIFICATION_CODE_WARING; + } + } + } }