From 4eec26a4ea74c09ba545129ea9f9b3aec1137dcd Mon Sep 17 00:00:00 2001 From: jlzhou <12020042@qq.com> Date: Thu, 25 May 2023 10:08:47 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9B=86=E6=88=90=E7=BD=91=E5=BB=BA=E7=9F=AD?= =?UTF-8?q?=E4=BF=A1=E9=80=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.yml | 23 ++++- .../java/com/ruoyi/sms/config/SmsConfig.java | 13 ++- .../properties/SmsChineseProperties.java | 21 +++++ .../ruoyi/sms/core/ChineseSmsTemplate.java | 90 +++++++++++++++++++ 4 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 ruoyi-sms/src/main/java/com/ruoyi/sms/config/properties/SmsChineseProperties.java create mode 100644 ruoyi-sms/src/main/java/com/ruoyi/sms/core/ChineseSmsTemplate.java diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index b3de9e3..aff6510 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -250,7 +250,7 @@ swagger: springdoc: api-docs: # 是否开启接口文档 - enabled: true + enabled: false swagger-ui: # 持久化认证数据 persistAuthorization: true @@ -299,3 +299,24 @@ management: show-details: ALWAYS logfile: external-file: ./logs/sys-console.log + +# 短信配置 +sms: + # 网建短信通: http://www.smschinese.cn/ + # 建议使用本短信接口,原因:不需要申请短信模板 + chinese: + # 网建短信通是否激活,该实现优先级别大于阿里云和腾讯云接口 + enabled: true + # api接口地址 + api: https://utf8api.smschinese.cn/ + # api 账号 + uid: xxxxxx + # api秘钥 + key: XXXXXXXXXXXXXXXXXXXXXXXXXXXX + # 短信签名 + sign: XXXX + # 短信模板,可配置多个 + templates: + # 短信模板名: 短信模板内容:{数据map的key} + code: 您的验证码是:{1} + xxx: {key1},{key2} diff --git a/ruoyi-sms/src/main/java/com/ruoyi/sms/config/SmsConfig.java b/ruoyi-sms/src/main/java/com/ruoyi/sms/config/SmsConfig.java index 753773e..8a54651 100644 --- a/ruoyi-sms/src/main/java/com/ruoyi/sms/config/SmsConfig.java +++ b/ruoyi-sms/src/main/java/com/ruoyi/sms/config/SmsConfig.java @@ -1,13 +1,17 @@ package com.ruoyi.sms.config; +import com.ruoyi.sms.config.properties.SmsChineseProperties; import com.ruoyi.sms.config.properties.SmsProperties; import com.ruoyi.sms.core.AliyunSmsTemplate; +import com.ruoyi.sms.core.ChineseSmsTemplate; import com.ruoyi.sms.core.SmsTemplate; import com.ruoyi.sms.core.TencentSmsTemplate; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; /** * 短信配置类 @@ -31,7 +35,6 @@ public class SmsConfig { } @Configuration - @ConditionalOnProperty(value = "sms.enabled", havingValue = "true") @ConditionalOnClass(com.tencentcloudapi.sms.v20190711.SmsClient.class) static class TencentSmsConfig { @@ -42,4 +45,12 @@ public class SmsConfig { } + + @ConditionalOnProperty(value = "sms.chinese.enabled", havingValue = "true") + @Bean + @Primary + public SmsTemplate chineseSmsTemplate(SmsChineseProperties smsProperties) { + return new ChineseSmsTemplate(smsProperties); + } + } diff --git a/ruoyi-sms/src/main/java/com/ruoyi/sms/config/properties/SmsChineseProperties.java b/ruoyi-sms/src/main/java/com/ruoyi/sms/config/properties/SmsChineseProperties.java new file mode 100644 index 0000000..083fbbc --- /dev/null +++ b/ruoyi-sms/src/main/java/com/ruoyi/sms/config/properties/SmsChineseProperties.java @@ -0,0 +1,21 @@ +package com.ruoyi.sms.config.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import java.util.Map; + +@Data +@Configuration +@ConfigurationProperties(prefix = "sms.chinese") +public class SmsChineseProperties { + private Boolean enabled; + private String api; + private String uid; + private String key; + + private String sign; + + private Map templates; +} diff --git a/ruoyi-sms/src/main/java/com/ruoyi/sms/core/ChineseSmsTemplate.java b/ruoyi-sms/src/main/java/com/ruoyi/sms/core/ChineseSmsTemplate.java new file mode 100644 index 0000000..62cd69f --- /dev/null +++ b/ruoyi-sms/src/main/java/com/ruoyi/sms/core/ChineseSmsTemplate.java @@ -0,0 +1,90 @@ +package com.ruoyi.sms.core; + +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.ruoyi.common.utils.BeanCopyUtils; +import com.ruoyi.common.utils.JsonUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.sms.config.properties.SmsChineseProperties; +import com.ruoyi.sms.entity.SmsResult; +import com.ruoyi.sms.exception.SmsException; +import lombok.extern.slf4j.Slf4j; + +import java.util.HashMap; +import java.util.Map; + +@Slf4j +public class ChineseSmsTemplate implements SmsTemplate { + private final SmsChineseProperties properties; + + /** + * - 异常编号对应消息 + */ + private final Map exceptionMessage = new HashMap<>(); + + public ChineseSmsTemplate(SmsChineseProperties properties) { + this.properties = properties; + exceptionMessage.put(-1, "没有该用户账户"); + exceptionMessage.put(-2, "接口密钥不正确"); + exceptionMessage.put(-21, "MD5接口密钥加密不正确"); + exceptionMessage.put(-3, "短信数量不足"); + exceptionMessage.put(-11, "该用户被禁用"); + exceptionMessage.put(-14, "短信内容出现非法字符"); + exceptionMessage.put(-4, "手机号格式不正确"); + exceptionMessage.put(-41, "手机号码为空"); + exceptionMessage.put(-42, "短信内容为空"); + exceptionMessage.put(-51, "短信签名格式不正确"); + exceptionMessage.put(-52, "短信签名太长"); + exceptionMessage.put(-6, "IP限制"); + if (log.isInfoEnabled()) { + try { + log.info("正在创建[smschinese.com.cn]短信bean:\n{}", + JsonUtils.getObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(BeanCopyUtils.copy(properties, SmsChineseProperties.class))); + } catch (Exception e) { + log.warn("格式化短信配置异常", e); + } + } + + } + + @Override + public SmsResult send(String phones, String templateId, Map param) { + if (StringUtils.isBlank(phones)) { + throw new SmsException("手机号不能为空"); + } + if (StringUtils.isBlank(templateId)) { + throw new SmsException("模板ID不能为空"); + } + String template = properties.getTemplates().get(templateId); + if (template == null) { + throw new SmsException("未知的模板ID"); + } + String sms = template; + if (param != null) { + for (String name : param.keySet()) { + sms = sms.replace("{" + name + "}", param.get(name)); + } + } + + Map formMap = new HashMap<>(4); + formMap.put("Uid", properties.getUid()); + formMap.put("Key", properties.getKey()); + formMap.put("smsMob", phones); + formMap.put("smsText", sms); + + try (HttpResponse response = HttpUtil.createPost(properties.getApi()).form(formMap).execute()) { + if (!response.isOk()) { + throw new SmsException("访问短信发送接口失败"); + } else { + int ret = Integer.parseInt(response.charset("utf-8").body()); + log.info("短信调用结果:{}", ret); + if (ret <= 0) { + String msg = exceptionMessage.getOrDefault(ret, "发送短信失败!"); + return SmsResult.builder().isSuccess(false).message(msg).response(Integer.toString(ret)).build(); + } else { + return SmsResult.builder().isSuccess(true).message("发送成功").response(Integer.toString(ret)).build(); + } + } + } + } +}