疯狂的狮子Li
2024-01-18 b628c9b0271b33f68f6e743ef415ce5fbc47f6ca
update sms4j 2.2.0 => 3.1.1 大升级 支持自定义配置key 可用于多厂商多租户等
已添加1个文件
已修改7个文件
256 ■■■■ 文件已修改
pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-dev.yml 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-prod.yml 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-sms/pom.xml 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/SmsAutoConfiguration.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/dao/PlusSmsDao.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -47,7 +47,7 @@
        <aws.sdk.version>2.23.0</aws.sdk.version>
        <aws.crt.version>0.29.6</aws.crt.version>
        <!-- SMS é…ç½® -->
        <sms4j.version>2.2.0</sms4j.version>
        <sms4j.version>3.1.1</sms4j.version>
        <!-- é™åˆ¶æ¡†æž¶ä¸­çš„fastjson版本 -->
        <fastjson.version>1.2.83</fastjson.version>
ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java
@@ -5,6 +5,9 @@
import cn.hutool.captcha.generator.CodeGenerator;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.domain.R;
@@ -21,11 +24,7 @@
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.core.factory.SmsFactory;
import org.dromara.sms4j.provider.enumerate.SupplierType;
import org.dromara.web.domain.vo.CaptchaVo;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
@@ -66,11 +65,11 @@
        String templateId = "";
        LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
        map.put("code", code);
        SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA);
        SmsBlend smsBlend = SmsFactory.getSmsBlend("config1");
        SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, templateId, map);
        if (!"OK".equals(smsResponse.getCode())) {
        if (!smsResponse.isSuccess()) {
            log.error("验证码短信发送异常 => {}", smsResponse);
            return R.fail(smsResponse.getMessage());
            return R.fail(smsResponse.getData().toString());
        }
        return R.ok();
    }
ruoyi-admin/src/main/resources/application-dev.yml
@@ -149,31 +149,36 @@
  connectionTimeout: 0
--- # sms çŸ­ä¿¡ æ”¯æŒ é˜¿é‡Œäº‘ è…¾è®¯äº‘ äº‘片 ç­‰ç­‰å„式各样的短信服务商
# https://wind.kim/doc/start æ–‡æ¡£åœ°å€ å„个厂商可同时使用
# https://sms4j.com/doc3/ å·®å¼‚配置文档地址 æ”¯æŒå•厂商多配置,可以配置多个同时使用
sms:
  # é˜¿é‡Œäº‘ dysmsapi.aliyuncs.com
  alibaba:
    #请求地址 é»˜è®¤ä¸º dysmsapi.aliyuncs.com å¦‚无特殊改变可以不用设置
    requestUrl: dysmsapi.aliyuncs.com
    #阿里云的accessKey
    accessKeyId: xxxxxxx
    #阿里云的accessKeySecret
    accessKeySecret: xxxxxxx
    #短信签名
    signature: æµ‹è¯•
  tencent:
    #请求地址默认为 sms.tencentcloudapi.com å¦‚无特殊改变可不用设置
    requestUrl: sms.tencentcloudapi.com
    #腾讯云的accessKey
    accessKeyId: xxxxxxx
    #腾讯云的accessKeySecret
    accessKeySecret: xxxxxxx
    #短信签名
    signature: æµ‹è¯•
    #短信sdkAppId
    sdkAppId: appid
    #地域信息默认为 ap-guangzhou å¦‚无特殊改变可不用设置
    territory: ap-guangzhou
  # é…ç½®æºç±»åž‹ç”¨äºŽæ ‡å®šé…ç½®æ¥æº(interface,yaml)
  config-type: yaml
  # ç”¨äºŽæ ‡å®šyml中的配置是否开启短信拦截,接口配置不受此限制
  restricted: true
  # çŸ­ä¿¡æ‹¦æˆªé™åˆ¶å•手机号每分钟最大发送,只对开启了拦截的配置有效
  minute-max: 1
  # çŸ­ä¿¡æ‹¦æˆªé™åˆ¶å•手机号每日最大发送量,只对开启了拦截的配置有效
  account-max: 30
  # ä»¥ä¸‹é…ç½®æ¥è‡ªäºŽ org.dromara.sms4j.provider.config.BaseConfig类中
  blends:
    # å”¯ä¸€ID ç”¨äºŽå‘送短信寻找具体配置 éšä¾¿å®šä¹‰åˆ«ç”¨ä¸­æ–‡å³å¯
    # å¯ä»¥åŒæ—¶å­˜åœ¨ä¸¤ä¸ªç›¸åŒåނ商 ä¾‹å¦‚: ali1 ali2 ä¸¤ä¸ªä¸åŒçš„阿里短信账号 ä¹Ÿå¯ç”¨äºŽåŒºåˆ†ç§Ÿæˆ·
    config1:
      # æ¡†æž¶å®šä¹‰çš„厂商名称标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分
      supplier: alibaba
      # æœ‰äº›ç§°ä¸ºaccessKey有些称之为apiKey,也有称为sdkKey或者appId。
      access-key-id: æ‚¨çš„accessKey
      # ç§°ä¸ºaccessSecret有些称之为apiSecret
      access-key-secret: æ‚¨çš„accessKeySecret
      signature: æ‚¨çš„短信签名
      sdk-app-id: æ‚¨çš„sdkAppId
    config2:
      # åŽ‚å•†æ ‡è¯†ï¼Œæ ‡å®šæ­¤é…ç½®æ˜¯å“ªä¸ªåŽ‚å•†ï¼Œè¯¦ç»†è¯·çœ‹åŽ‚å•†æ ‡è¯†ä»‹ç»éƒ¨åˆ†
      supplier: tencent
      access-key-id: æ‚¨çš„accessKey
      access-key-secret: æ‚¨çš„accessKeySecret
      signature: æ‚¨çš„短信签名
      sdk-app-id: æ‚¨çš„sdkAppId
--- # ä¸‰æ–¹æŽˆæƒ
ruoyi-admin/src/main/resources/application-prod.yml
@@ -152,31 +152,36 @@
  connectionTimeout: 0
--- # sms çŸ­ä¿¡ æ”¯æŒ é˜¿é‡Œäº‘ è…¾è®¯äº‘ äº‘片 ç­‰ç­‰å„式各样的短信服务商
# https://wind.kim/doc/start æ–‡æ¡£åœ°å€ å„个厂商可同时使用
# https://sms4j.com/doc3/ å·®å¼‚配置文档地址 æ”¯æŒå•厂商多配置,可以配置多个同时使用
sms:
  # é˜¿é‡Œäº‘ dysmsapi.aliyuncs.com
  alibaba:
    #请求地址 é»˜è®¤ä¸º dysmsapi.aliyuncs.com å¦‚无特殊改变可以不用设置
    requestUrl: dysmsapi.aliyuncs.com
    #阿里云的accessKey
    accessKeyId: xxxxxxx
    #阿里云的accessKeySecret
    accessKeySecret: xxxxxxx
    #短信签名
    signature: æµ‹è¯•
  tencent:
    #请求地址默认为 sms.tencentcloudapi.com å¦‚无特殊改变可不用设置
    requestUrl: sms.tencentcloudapi.com
    #腾讯云的accessKey
    accessKeyId: xxxxxxx
    #腾讯云的accessKeySecret
    accessKeySecret: xxxxxxx
    #短信签名
    signature: æµ‹è¯•
    #短信sdkAppId
    sdkAppId: appid
    #地域信息默认为 ap-guangzhou å¦‚无特殊改变可不用设置
    territory: ap-guangzhou
  # é…ç½®æºç±»åž‹ç”¨äºŽæ ‡å®šé…ç½®æ¥æº(interface,yaml)
  config-type: yaml
  # ç”¨äºŽæ ‡å®šyml中的配置是否开启短信拦截,接口配置不受此限制
  restricted: true
  # çŸ­ä¿¡æ‹¦æˆªé™åˆ¶å•手机号每分钟最大发送,只对开启了拦截的配置有效
  minute-max: 1
  # çŸ­ä¿¡æ‹¦æˆªé™åˆ¶å•手机号每日最大发送量,只对开启了拦截的配置有效
  account-max: 30
  # ä»¥ä¸‹é…ç½®æ¥è‡ªäºŽ org.dromara.sms4j.provider.config.BaseConfig类中
  blends:
    # å”¯ä¸€ID ç”¨äºŽå‘送短信寻找具体配置 éšä¾¿å®šä¹‰åˆ«ç”¨ä¸­æ–‡å³å¯
    # å¯ä»¥åŒæ—¶å­˜åœ¨ä¸¤ä¸ªç›¸åŒåނ商 ä¾‹å¦‚: ali1 ali2 ä¸¤ä¸ªä¸åŒçš„阿里短信账号 ä¹Ÿå¯ç”¨äºŽåŒºåˆ†ç§Ÿæˆ·
    config1:
      # æ¡†æž¶å®šä¹‰çš„厂商名称标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分
      supplier: alibaba
      # æœ‰äº›ç§°ä¸ºaccessKey有些称之为apiKey,也有称为sdkKey或者appId。
      access-key-id: æ‚¨çš„accessKey
      # ç§°ä¸ºaccessSecret有些称之为apiSecret
      access-key-secret: æ‚¨çš„accessKeySecret
      signature: æ‚¨çš„短信签名
      sdk-app-id: æ‚¨çš„sdkAppId
    config2:
      # åŽ‚å•†æ ‡è¯†ï¼Œæ ‡å®šæ­¤é…ç½®æ˜¯å“ªä¸ªåŽ‚å•†ï¼Œè¯¦ç»†è¯·çœ‹åŽ‚å•†æ ‡è¯†ä»‹ç»éƒ¨åˆ†
      supplier: tencent
      access-key-id: æ‚¨çš„accessKey
      access-key-secret: æ‚¨çš„accessKeySecret
      signature: æ‚¨çš„短信签名
      sdk-app-id: æ‚¨çš„sdkAppId
--- # ä¸‰æ–¹æŽˆæƒ
justauth:
ruoyi-common/ruoyi-common-sms/pom.xml
@@ -20,13 +20,12 @@
        <dependency>
            <groupId>org.dromara.sms4j</groupId>
            <artifactId>sms4j-spring-boot-starter</artifactId>
            <exclusions>
                <!-- æŽ’除京东短信内存在的fastjson等待作者后续修复 -->
                <exclusion>
                    <groupId>com.alibaba</groupId>
                    <artifactId>fastjson</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- RuoYi Common Redis-->
        <dependency>
            <groupId>org.dromara</groupId>
            <artifactId>ruoyi-common-redis</artifactId>
        </dependency>
    </dependencies>
ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/config/SmsAutoConfiguration.java
@@ -1,14 +1,24 @@
package org.dromara.common.sms.config;
import org.dromara.common.sms.core.dao.PlusSmsDao;
import org.dromara.sms4j.api.dao.SmsDao;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
/**
 * çŸ­ä¿¡é…ç½®ç±»(暂时没用 é¢„留扩展)
 * çŸ­ä¿¡é…ç½®ç±»
 *
 * @author Lion Li
 * @version 4.2.0
 * @author Feng
 */
@AutoConfiguration
@AutoConfiguration(after = {RedisAutoConfiguration.class})
public class SmsAutoConfiguration {
    @Primary
    @Bean
    public SmsDao smsDao() {
        return new PlusSmsDao();
    }
}
ruoyi-common/ruoyi-common-sms/src/main/java/org/dromara/common/sms/core/dao/PlusSmsDao.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
package org.dromara.common.sms.core.dao;
import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.sms4j.api.dao.SmsDao;
import java.time.Duration;
/**
 * SmsDao缓存配置 (使用框架自带RedisUtils实现 åè®®ç»Ÿä¸€)
 * <p>主要用于短信重试和拦截的缓存
 *
 * @author Feng
 */
public class PlusSmsDao implements SmsDao {
    /**
     * å­˜å‚¨
     *
     * @param key       é”®
     * @param value     å€¼
     * @param cacheTime ç¼“存时间(单位:秒)
     */
    @Override
    public void set(String key, Object value, long cacheTime) {
        RedisUtils.setCacheObject(GlobalConstants.GLOBAL_REDIS_KEY + key, value, Duration.ofSeconds(cacheTime));
    }
    /**
     * å­˜å‚¨
     *
     * @param key   é”®
     * @param value å€¼
     */
    @Override
    public void set(String key, Object value) {
        RedisUtils.setCacheObject(GlobalConstants.GLOBAL_REDIS_KEY + key, value, true);
    }
    /**
     * è¯»å–
     *
     * @param key é”®
     * @return å€¼
     */
    @Override
    public Object get(String key) {
        return RedisUtils.getCacheObject(GlobalConstants.GLOBAL_REDIS_KEY + key);
    }
    /**
     * remove
     * <p> æ ¹æ®key移除缓存
     *
     * @param key ç¼“存键
     * @return è¢«åˆ é™¤çš„value
     * @author :Wind
     */
    @Override
    public Object remove(String key) {
        return RedisUtils.deleteObject(GlobalConstants.GLOBAL_REDIS_KEY + key);
    }
    /**
     * æ¸…空
     */
    @Override
    public void clean() {
        RedisUtils.deleteObject(GlobalConstants.GLOBAL_REDIS_KEY + "sms:");
    }
}
ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/SmsController.java
@@ -1,11 +1,11 @@
package org.dromara.demo.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.core.factory.SmsFactory;
import org.dromara.sms4j.provider.enumerate.SupplierType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -20,12 +20,12 @@
 * @author Lion Li
 * @version 4.2.0
 */
@SaIgnore
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/sms")
public class SmsController {
    /**
     * å‘送短信Aliyun
     *
@@ -36,7 +36,7 @@
    public R<Object> sendAliyun(String phones, String templateId) {
        LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
        map.put("code", "1234");
        SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA);
        SmsBlend smsBlend = SmsFactory.getSmsBlend("config1");
        SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map);
        return R.ok(smsResponse);
    }
@@ -52,9 +52,33 @@
        LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
//        map.put("2", "测试测试");
        map.put("1", "1234");
        SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.TENCENT);
        SmsBlend smsBlend = SmsFactory.getSmsBlend("config2");
        SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map);
        return R.ok(smsResponse);
    }
    /**
     * æ·»åŠ é»‘åå•
     *
     * @param phone æ‰‹æœºå·
     */
    @GetMapping("/addBlacklist")
    public R<Object> addBlacklist(String phone){
        SmsBlend smsBlend = SmsFactory.getSmsBlend("config1");
        smsBlend.joinInBlacklist(phone);
        return R.ok();
    }
    /**
     * ç§»é™¤é»‘名单
     *
     * @param phone æ‰‹æœºå·
     */
    @GetMapping("/removeBlacklist")
    public R<Object> removeBlacklist(String phone){
        SmsBlend smsBlend = SmsFactory.getSmsBlend("config1");
        smsBlend.removeFromBlacklist(phone);
        return R.ok();
    }
}