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。
*
* 迁移说明:逻辑取自 {@code com.smartor.service.impl.BaseSmsaccountServiceImpl},
* 但不再依赖 smartor 的 domain 对象({@code BaseSmsRequest} / {@code BatchBaseSmsRequest} /
* {@code TemplateSmsRequest}),改为直接接收基础参数,从而让本模块可以放在
* {@code ruoyi-system} 之前、被所有业务模块复用。
*
* 原 {@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 phoneNumbers, String templateCode) {
try {
Client client = createClient();
List 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);
}
}