集成网建短信通

master
管理员 3 years ago
parent a58f440e00
commit 4eec26a4ea

@ -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}

@ -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);
}
}

@ -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<String,String> templates;
}

@ -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<Integer, String> 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<String, String> 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<String, Object> 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();
}
}
}
}
}
Loading…
Cancel
Save