package com.ruoyi.message.sms.provider.aliyun;
|
|
import com.aliyun.dysmsapi20170525.Client;
|
import com.aliyun.dysmsapi20170525.models.AddSmsTemplateRequest;
|
import com.aliyun.dysmsapi20170525.models.AddSmsTemplateResponse;
|
import com.aliyun.dysmsapi20170525.models.AddSmsTemplateResponseBody;
|
import com.aliyun.dysmsapi20170525.models.ModifySmsTemplateRequest;
|
import com.aliyun.dysmsapi20170525.models.ModifySmsTemplateResponse;
|
import com.aliyun.dysmsapi20170525.models.ModifySmsTemplateResponseBody;
|
import com.aliyun.dysmsapi20170525.models.QuerySmsTemplateListRequest;
|
import com.aliyun.dysmsapi20170525.models.QuerySmsTemplateListResponse;
|
import com.aliyun.dysmsapi20170525.models.QuerySmsTemplateListResponseBody;
|
import com.aliyun.dysmsapi20170525.models.QuerySmsTemplateRequest;
|
import com.aliyun.dysmsapi20170525.models.QuerySmsTemplateResponse;
|
import com.aliyun.dysmsapi20170525.models.QuerySmsTemplateResponseBody;
|
import com.aliyun.dysmsapi20170525.models.SendBatchSmsRequest;
|
import com.aliyun.dysmsapi20170525.models.SendBatchSmsResponse;
|
import com.aliyun.dysmsapi20170525.models.SendBatchSmsResponseBody;
|
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
|
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
|
import com.aliyun.dysmsapi20170525.models.SendSmsResponseBody;
|
import com.aliyun.tea.TeaException;
|
import com.aliyun.teaopenapi.models.Config;
|
import com.aliyun.teautil.Common;
|
import com.aliyun.teautil.models.RuntimeOptions;
|
import com.ruoyi.message.config.MessageProperties;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.stereotype.Component;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
|
/**
|
* 阿里云短信 API。
|
* <p>
|
* 迁移说明:逻辑取自 {@code com.smartor.service.impl.BaseSmsaccountServiceImpl},
|
* 但<b>不再依赖 smartor 的 domain 对象</b>({@code BaseSmsRequest} / {@code BatchBaseSmsRequest} /
|
* {@code TemplateSmsRequest}),改为直接接收基础参数,从而让本模块可以放在
|
* {@code ruoyi-system} 之前、被所有业务模块复用。
|
* <p>
|
* 原 {@code BaseSmsaccountServiceImpl} 保留为「短信账号管理 + DB 读写」的 Service,
|
* 其上的阿里云调用改为委托本类(见改造说明)。
|
*/
|
@Slf4j
|
@Component
|
public class AliYunSmsApi {
|
|
private final MessageProperties properties;
|
|
public AliYunSmsApi(MessageProperties properties) {
|
this.properties = properties;
|
}
|
|
/**
|
* 发送短信
|
*
|
* @param phoneNumbers 手机号,多个用逗号分隔
|
* @param templateCode 模板编码
|
* @param templateParam 模板参数 JSON
|
*/
|
public SendSmsResponseBody sendSms(String phoneNumbers, String templateCode, String templateParam) {
|
try {
|
Client client = createClient();
|
SendSmsRequest sendSmsRequest = new SendSmsRequest()
|
.setPhoneNumbers(phoneNumbers)
|
.setSignName(properties.getSms().getAliyun().getSignName())
|
.setTemplateCode(templateCode)
|
.setTemplateParam(templateParam);
|
SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, new RuntimeOptions());
|
return sendSmsResponse.getBody();
|
} catch (Exception e) {
|
log.error("阿里云短信发送失败,phoneNumbers:{},templateCode:{}", phoneNumbers, templateCode, e);
|
}
|
return null;
|
}
|
|
/**
|
* 批量发送短信
|
*/
|
public SendBatchSmsResponseBody batchSendMsg(List<String> phoneNumbers, String templateCode) {
|
try {
|
Client client = createClient();
|
List<String> signNameJson = new ArrayList<>();
|
for (int i = 0; i < phoneNumbers.size(); i++) {
|
signNameJson.add("\"" + properties.getSms().getAliyun().getSignName() + "\"");
|
}
|
SendBatchSmsRequest sendBatchSmsRequest = new SendBatchSmsRequest()
|
.setSignNameJson(signNameJson.toString())
|
.setPhoneNumberJson(phoneNumbers.toString())
|
.setTemplateCode(templateCode);
|
RuntimeOptions runtime = new RuntimeOptions();
|
try {
|
SendBatchSmsResponse sendBatchSmsResponse = client.sendBatchSmsWithOptions(sendBatchSmsRequest, runtime);
|
return sendBatchSmsResponse.getBody();
|
} catch (TeaException error) {
|
Common.assertAsString(error.message);
|
} catch (Exception innerError) {
|
TeaException error = new TeaException(innerError.getMessage(), innerError);
|
Common.assertAsString(error.message);
|
}
|
} catch (Exception e) {
|
log.error("阿里云短信批量发送失败,templateCode:{}", templateCode, e);
|
}
|
return null;
|
}
|
|
/**
|
* 新增短信模板
|
*/
|
public AddSmsTemplateResponseBody addSmsTemplate(Integer templateType, String templateName,
|
String templateContent, String remark) {
|
try {
|
Client client = createClient();
|
AddSmsTemplateRequest addSmsTemplateRequest = new AddSmsTemplateRequest()
|
.setTemplateType(templateType)
|
.setTemplateName(templateName)
|
.setTemplateContent(templateContent)
|
.setRemark(remark);
|
RuntimeOptions runtime = new RuntimeOptions();
|
AddSmsTemplateResponse response = client.addSmsTemplateWithOptions(addSmsTemplateRequest, runtime);
|
return response.getBody();
|
} catch (TeaException error) {
|
Common.assertAsString(error.message);
|
} catch (Exception innerError) {
|
TeaException error = new TeaException(innerError.getMessage(), innerError);
|
Common.assertAsString(error.message);
|
}
|
return null;
|
}
|
|
/**
|
* 修改短信模板
|
*/
|
public ModifySmsTemplateResponseBody modifySmsTemplate(Integer templateType, String templateName,
|
String templateCode, String templateContent, String remark) {
|
try {
|
Client client = createClient();
|
ModifySmsTemplateRequest modifySmsTemplateRequest = new ModifySmsTemplateRequest();
|
modifySmsTemplateRequest.setTemplateType(templateType);
|
modifySmsTemplateRequest.setTemplateName(templateName);
|
modifySmsTemplateRequest.setTemplateCode(templateCode);
|
modifySmsTemplateRequest.setTemplateContent(templateContent);
|
modifySmsTemplateRequest.setRemark(remark);
|
RuntimeOptions runtime = new RuntimeOptions();
|
ModifySmsTemplateResponse response = client.modifySmsTemplateWithOptions(modifySmsTemplateRequest, runtime);
|
return response.getBody();
|
} catch (TeaException error) {
|
Common.assertAsString(error.message);
|
} catch (Exception innerError) {
|
TeaException error = new TeaException(innerError.getMessage(), innerError);
|
Common.assertAsString(error.message);
|
}
|
return null;
|
}
|
|
/**
|
* 查询短信模板列表
|
*/
|
public QuerySmsTemplateListResponseBody querySmsTemplate(Integer pageIndex, Integer pageSize) {
|
try {
|
Client client = createClient();
|
QuerySmsTemplateListRequest request = new QuerySmsTemplateListRequest()
|
.setPageIndex(pageIndex)
|
.setPageSize(pageSize);
|
RuntimeOptions runtime = new RuntimeOptions();
|
QuerySmsTemplateListResponse response = client.querySmsTemplateListWithOptions(request, runtime);
|
return response.getBody();
|
} catch (TeaException error) {
|
Common.assertAsString(error.message);
|
} catch (Exception innerError) {
|
TeaException error = new TeaException(innerError.getMessage(), innerError);
|
Common.assertAsString(error.message);
|
}
|
return null;
|
}
|
|
/**
|
* 查询短信模板审核状态
|
*/
|
public QuerySmsTemplateResponseBody querySmsTemplateStatus(String templateCode) {
|
try {
|
Client client = createClient();
|
QuerySmsTemplateRequest request = new QuerySmsTemplateRequest().setTemplateCode(templateCode);
|
RuntimeOptions runtime = new RuntimeOptions();
|
QuerySmsTemplateResponse response = client.querySmsTemplateWithOptions(request, runtime);
|
return response.getBody();
|
} catch (TeaException error) {
|
Common.assertAsString(error.message);
|
} catch (Exception innerError) {
|
TeaException error = new TeaException(innerError.getMessage(), innerError);
|
Common.assertAsString(error.message);
|
}
|
return null;
|
}
|
|
private Client createClient() throws Exception {
|
Config config = new Config()
|
.setAccessKeyId(properties.getSms().getAliyun().getAccessKeyId())
|
.setAccessKeySecret(properties.getSms().getAliyun().getAccessKeySecret());
|
// 访问的域名
|
config.endpoint = "dysmsapi.aliyuncs.com";
|
return new Client(config);
|
}
|
}
|