Forráskód Böngészése

发送短信支持多渠道

yzc 2 éve
szülő
commit
4d7c36c8c9

+ 3 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/common/enums/enums/DictEnum.java

@@ -15,6 +15,9 @@ import java.util.List;
 @Getter
 @AllArgsConstructor
 public enum DictEnum {
+    SMS_REGISTER("send_sms_type", "register", "短信注册"),
+    SMS_LOGIN("send_sms_type", "login", "短信登录"),
+    SMS_UPDATE_PASSWORD("send_sms_type", "updatePassword", "短信修改密码"),
     PRICE_TYPE_0("price_type", "0", "元/吨"),
     PRICE_TYPE_1("price_type", "1", "元/车"),
     WEIGHT_CAR_0("weight_car", "0", "吨/车"),

+ 1 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/common/enums/enums/DictTypeEnum.java

@@ -11,6 +11,7 @@ import lombok.Getter;
 @Getter
 @AllArgsConstructor
 public enum DictTypeEnum {
+    SEND_SMS_TYPE("send_sms_type", "发送短信类型"),
     INTEGRAL_TYPE("integral_type", "积分类型"),
     UNIT_TYPE("unit_type", "商品单位类型"),
     TAX_RATE("tax_rate", "商品税率"),

+ 2 - 2
sckw-common/sckw-common-redis/src/main/java/com/sckw/redis/constant/RedisConstant.java

@@ -10,11 +10,11 @@ public class RedisConstant {
     /**
      * 短信验证码值key
      */
-    public static final String MESSAGE_SMS_VERIFY_CODE_VALUE_KEY = "sckw:sms:verifyCode:value:%s";
+    public static final String MESSAGE_SMS_VERIFY_CODE_VALUE_KEY = "sckw:sms:verifyCode:value:%s:%s";
     /**
      * 短信验证码请求key
      */
-    public static final String MESSAGE_SMS_VERIFY_CODE_REQUEST_KEY = "sckw:sms:verifyCode:request:%s";
+    public static final String MESSAGE_SMS_VERIFY_CODE_REQUEST_KEY = "sckw:sms:verifyCode:request:%s:%s";
     /**
      * 短信验证码有效时间(秒)
      */

+ 6 - 1
sckw-common/sckw-common-stream/src/main/java/com/sckw/stream/model/SckwSms.java

@@ -3,8 +3,8 @@ package com.sckw.stream.model;
 import com.sckw.stream.enums.SmsCodeEnum;
 import lombok.AllArgsConstructor;
 import lombok.Data;
-import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
+
 import java.util.Map;
 
 /**
@@ -31,6 +31,11 @@ public class SckwSms {
      */
     private String phone;
 
+    /**
+     * 短信类型
+     */
+    private String type;
+
     /**
      * 手机号集合(腾讯短信)
      */

+ 1 - 1
sckw-modules-api/sckw-message-api/src/main/java/com/sckw/message/api/dubbo/SmsInfoService.java

@@ -13,6 +13,6 @@ public interface SmsInfoService {
      * @Param phone:
      * @return: java.lang.String
      */
-    String getVerifyCode(String phone);
+    String getVerifyCode(String type, String phone);
 
 }

+ 2 - 2
sckw-modules/sckw-message/src/main/java/com/sckw/message/dubbo/SmsInfoServiceImpl.java

@@ -13,8 +13,8 @@ import org.apache.dubbo.config.annotation.DubboService;
 @DubboService(group = "design", version = "2.0.0")
 public class SmsInfoServiceImpl implements SmsInfoService {
     @Override
-    public String getVerifyCode(String phone) {
-        String key = String.format(RedisConstant.MESSAGE_SMS_VERIFY_CODE_VALUE_KEY, phone);
+    public String getVerifyCode(String type, String phone) {
+        String key = String.format(RedisConstant.MESSAGE_SMS_VERIFY_CODE_VALUE_KEY, type, phone);
         return RedissonUtils.getString(key);
     }
 }

+ 2 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/model/vo/req/SendSmsVerifyCoderReqVO.java

@@ -21,4 +21,6 @@ public class SendSmsVerifyCoderReqVO {
     @Pattern(regexp = "^1[3456789]\\d{9}$", message = "非法的手机号")
     private String phone;
 
+    @NotBlank(message = "短信类型不能为空")
+    private String type;
 }

+ 8 - 6
sckw-modules/sckw-message/src/main/java/com/sckw/message/service/SckwSmsHandlerService.java

@@ -32,16 +32,18 @@ public class SckwSmsHandlerService {
      */
     public void handler(SckwSms sckwSms) {
         log.info("接收到发送短信消息:{},开始处理", JSON.toJSONString(sckwSms));
-        String requestKey = getKey(RedisConstant.MESSAGE_SMS_VERIFY_CODE_REQUEST_KEY, sckwSms.getPhone());
+        String type = sckwSms.getType();
+        String phone = sckwSms.getPhone();
+        String requestKey = getKey(RedisConstant.MESSAGE_SMS_VERIFY_CODE_REQUEST_KEY,type,phone);
         if (Boolean.FALSE.equals(RedissonUtils.tryLock(requestKey, 10L, RedisConstant.SMS_VERIFY_CODE_VALID_TIME))) {
             log.info("重复发送短信消息,不处理");
             return;
         }
-        String valueKey = getKey(RedisConstant.MESSAGE_SMS_VERIFY_CODE_VALUE_KEY, sckwSms.getPhone());
-        //发送短信
-        RedissonUtils.putString(valueKey, String.valueOf(sckwSms.getParams().get("code")), RedisConstant.SMS_VERIFY_CODE_VALID_TIME);
+        String valueKey = getKey(RedisConstant.MESSAGE_SMS_VERIFY_CODE_VALUE_KEY, type,phone);
         //发送短信
         SmsUtil.sendSms(sckwSms.getPhone(), sckwSms.getSignName(), sckwSms.getTemplateCode().getName(), JSON.toJSONString(sckwSms.getParams()));
+        //放入缓存
+        RedissonUtils.putString(valueKey, String.valueOf(sckwSms.getParams().get("code")), RedisConstant.SMS_VERIFY_CODE_VALID_TIME);
         //数据入库
         SmsCodeEnum smsCodeEnum = sckwSms.getTemplateCode();
         KwmSms kwmSms = KwmSms.builder().type(smsCodeEnum.getType()).code(smsCodeEnum.getName())
@@ -52,7 +54,7 @@ public class SckwSmsHandlerService {
         kwmSmsService.add(kwmSms);
     }
 
-    private String getKey(String prefix, String args) {
-        return String.format(prefix, args);
+    private String getKey(String prefix, String args1, String args2) {
+        return String.format(prefix, args1, args2);
     }
 }

+ 14 - 10
sckw-modules/sckw-message/src/main/java/com/sckw/message/service/SmsService.java

@@ -1,6 +1,8 @@
 package com.sckw.message.service;
 
 import com.alibaba.fastjson2.JSON;
+import com.sckw.core.common.enums.enums.DictEnum;
+import com.sckw.core.common.enums.enums.DictTypeEnum;
 import com.sckw.core.exception.BusinessException;
 import com.sckw.core.utils.NumberUtils;
 import com.sckw.core.web.context.LoginUserHolder;
@@ -16,6 +18,7 @@ import org.springframework.stereotype.Service;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * @author: yzc
@@ -37,23 +40,24 @@ public class SmsService {
      * @date: 2023-06-13 13:43
      */
     public void sendVerifyCode(SendSmsVerifyCoderReqVO param) {
+        String type = param.getType();
+        if (Objects.isNull(DictEnum.getLabel(DictTypeEnum.SEND_SMS_TYPE.getType(), type))) {
+            throw new BusinessException("非法短信类型!");
+        }
         String phone = param.getPhone();
-        // 防重攻击
-        String messageSmsVerifyCodeKey = getMessageSmsVerifyCodeKey(phone);
+        String messageSmsVerifyCodeKey = getMessageSmsVerifyCodeKey(type, phone);
         if (Boolean.TRUE.equals(RedissonUtils.exists(messageSmsVerifyCodeKey))) {
-            throw new BusinessException("请勿频繁获取短信验证码");
+            throw new BusinessException("请勿频繁获取短信验证码");
         }
-        SckwSms sckwSms = new SckwSms();
-        sckwSms.setPhone(param.getPhone());
-        sckwSms.setTemplateCode(SmsCodeEnum.VERIFICATION_CODE);
         Map<String, Object> params = new HashMap<>();
         params.put("code", NumberUtils.createRandomVcode());
-        sckwSms.setParams(params);
-        sckwSms.setCreateBy(LoginUserHolder.getUserId());
+        SckwSms sckwSms = new SckwSms();
+        sckwSms.setPhone(param.getPhone()).setType(type).setTemplateCode(SmsCodeEnum.VERIFICATION_CODE)
+                .setParams(params).setCreateBy(LoginUserHolder.getUserId());
         streamBridge.send("sckw-sms", JSON.toJSONString(sckwSms));
     }
 
-    private String getMessageSmsVerifyCodeKey(String phone) {
-        return String.format(RedisConstant.MESSAGE_SMS_VERIFY_CODE_VALUE_KEY, phone);
+    private String getMessageSmsVerifyCodeKey(String type, String phone) {
+        return String.format(RedisConstant.MESSAGE_SMS_VERIFY_CODE_VALUE_KEY, type, phone);
     }
 }