package cn.lili.modules.sms.plugin.impl; import cn.hutool.json.JSONUtil; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.utils.Base64Utils; import cn.lili.modules.sms.entity.dos.SmsSign; import cn.lili.modules.sms.entity.dos.SmsTemplate; import cn.lili.modules.sms.entity.enums.SmsEnum; import cn.lili.modules.sms.plugin.SmsPlugin; import cn.lili.modules.system.entity.dto.SmsSetting; import com.aliyun.dysmsapi20170525.models.*; import com.aliyun.teaopenapi.models.Config; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 阿里云短信插件 * * @author Bulbasaur * @since 2023-02-16 */ @Slf4j public class AliSmsPlugin implements SmsPlugin { private SmsSetting smsSetting; public AliSmsPlugin(SmsSetting smsSetting) { this.smsSetting = smsSetting; } @Override public SmsEnum pluginName() { return SmsEnum.ALI; } @Override public void sendSmsCode(String signName, String mobile, Map param, String templateCode) { com.aliyun.dysmsapi20170525.Client client = this.createClient(); SendSmsRequest sendSmsRequest = new SendSmsRequest() .setSignName(signName) .setPhoneNumbers(mobile) .setTemplateCode(templateCode) .setTemplateParam(JSONUtil.toJsonStr(param)); try { SendSmsResponse response = client.sendSms(sendSmsRequest); if (!("OK").equals(response.getBody().getCode())) { throw new ServiceException(response.getBody().getMessage()); } } catch (Exception e) { log.error("发送短信错误", e); } } @Override public void sendBatchSms(String signName, List mobile, String templateCode) { com.aliyun.dysmsapi20170525.Client client = this.createClient(); List sign = new ArrayList(); sign.addAll(mobile); sign.replaceAll(e -> signName); //手机号拆成多个小组进行发送 List> mobileList = new ArrayList<>(); //签名名称多个小组 List> signNameList = new ArrayList<>(); //循环分组 for (int i = 0; i < (mobile.size() / 100 + (mobile.size() % 100 == 0 ? 0 : 1)); i++) { int endPoint = Math.min((100 + (i * 100)), mobile.size()); mobileList.add(mobile.subList((i * 100), endPoint)); signNameList.add(sign.subList((i * 100), endPoint)); } // //发送短信 for (int i = 0; i < mobileList.size(); i++) { SendBatchSmsRequest sendBatchSmsRequest = new SendBatchSmsRequest() .setPhoneNumberJson(JSONUtil.toJsonStr(mobileList.get(i))) .setSignNameJson(JSONUtil.toJsonStr(signNameList.get(i))) .setTemplateCode(templateCode); try { client.sendBatchSms(sendBatchSmsRequest); } catch (Exception e) { log.error("批量发送短信错误", e); } } } @Override public void addSmsSign(SmsSign smsSign) throws Exception { //设置参数添加短信签名 com.aliyun.dysmsapi20170525.Client client = this.createClient(); //营业执照 AddSmsSignRequest.AddSmsSignRequestSignFileList signFileList0 = new AddSmsSignRequest.AddSmsSignRequestSignFileList() .setFileContents(Base64Utils.encode(smsSign.getBusinessLicense())) .setFileSuffix(smsSign.getBusinessLicense().substring(smsSign.getBusinessLicense().lastIndexOf(".") + 1)); //授权委托书 AddSmsSignRequest.AddSmsSignRequestSignFileList signFileList1 = new AddSmsSignRequest.AddSmsSignRequestSignFileList() .setFileContents(Base64Utils.encode(smsSign.getLicense())) .setFileSuffix(smsSign.getLicense().substring(smsSign.getLicense().lastIndexOf(".")) + 1); //添加短信签名 AddSmsSignRequest addSmsSignRequest = new AddSmsSignRequest() .setSignName(smsSign.getSignName()) .setSignSource(smsSign.getSignSource()) .setRemark(smsSign.getRemark()) .setSignFileList(java.util.Arrays.asList( signFileList0, signFileList1 )); AddSmsSignResponse response = client.addSmsSign(addSmsSignRequest); if (!("OK").equals(response.getBody().getCode())) { throw new ServiceException(response.getBody().getMessage()); } } @Override public void deleteSmsSign(String signName) throws Exception { com.aliyun.dysmsapi20170525.Client client = this.createClient(); DeleteSmsSignRequest deleteSmsSignRequest = new DeleteSmsSignRequest() .setSignName(signName); DeleteSmsSignResponse response = client.deleteSmsSign(deleteSmsSignRequest); if (!("OK").equals(response.getBody().getCode())) { throw new ServiceException(response.getBody().getMessage()); } } @Override public Map querySmsSign(String signName) throws Exception { //设置参数查看短信签名 com.aliyun.dysmsapi20170525.Client client = this.createClient(); QuerySmsSignRequest querySmsSignRequest = new QuerySmsSignRequest().setSignName(signName); QuerySmsSignResponse response = client.querySmsSign(querySmsSignRequest); if (!("OK").equals(response.getBody().getCode())) { throw new ServiceException(response.getBody().getMessage()); } Map map = new HashMap<>(2); map.put("SignStatus", response.getBody().getSignStatus()); map.put("Reason", response.getBody().getReason()); return map; } @Override public void modifySmsSign(SmsSign smsSign) throws Exception { //设置参数添加短信签名 com.aliyun.dysmsapi20170525.Client client = this.createClient(); ModifySmsSignRequest.ModifySmsSignRequestSignFileList signFileList0 = new ModifySmsSignRequest.ModifySmsSignRequestSignFileList() .setFileContents(Base64Utils.encode(smsSign.getBusinessLicense())) .setFileSuffix(smsSign.getBusinessLicense().substring(smsSign.getBusinessLicense().lastIndexOf(".") + 1)); ModifySmsSignRequest.ModifySmsSignRequestSignFileList signFileList1 = new ModifySmsSignRequest.ModifySmsSignRequestSignFileList() .setFileContents(Base64Utils.encode(smsSign.getLicense())) .setFileSuffix(smsSign.getLicense().substring(smsSign.getBusinessLicense().lastIndexOf(".") + 1)); ModifySmsSignRequest modifySmsSign = new ModifySmsSignRequest() .setSignName(smsSign.getSignName()) .setSignSource(smsSign.getSignSource()) .setRemark(smsSign.getRemark()) .setSignFileList(java.util.Arrays.asList( signFileList0, signFileList1 )); ModifySmsSignResponse response = client.modifySmsSign(modifySmsSign); if (!("OK").equals(response.getBody().getCode())) { throw new ServiceException(response.getBody().getMessage()); } } @Override public void modifySmsTemplate(SmsTemplate smsTemplate) throws Exception { com.aliyun.dysmsapi20170525.Client client = this.createClient(); ModifySmsTemplateRequest modifySmsTemplateRequest = new ModifySmsTemplateRequest() .setTemplateType(smsTemplate.getTemplateType()) .setTemplateName(smsTemplate.getTemplateName()) .setTemplateContent(smsTemplate.getTemplateContent()) .setRemark(smsTemplate.getRemark()) .setTemplateCode(smsTemplate.getTemplateCode()); ModifySmsTemplateResponse response = client.modifySmsTemplate(modifySmsTemplateRequest); if (!("OK").equals(response.getBody().getCode())) { throw new ServiceException(response.getBody().getMessage()); } } @Override public Map querySmsTemplate(String templateCode) throws Exception { com.aliyun.dysmsapi20170525.Client client = this.createClient(); QuerySmsTemplateRequest querySmsTemplateRequest = new QuerySmsTemplateRequest() .setTemplateCode(templateCode); QuerySmsTemplateResponse response = client.querySmsTemplate(querySmsTemplateRequest); if (!("OK").equals(response.getBody().getCode())) { throw new ServiceException(response.getBody().getMessage()); } Map map = new HashMap<>(4); map.put("TemplateStatus", response.getBody().getTemplateStatus()); map.put("Reason", response.getBody().getReason()); map.put("TemplateCode", response.getBody().getTemplateCode()); return map; } @Override public String addSmsTemplate(SmsTemplate smsTemplate) throws Exception { com.aliyun.dysmsapi20170525.Client client = this.createClient(); AddSmsTemplateRequest addSmsTemplateRequest = new AddSmsTemplateRequest() .setTemplateType(1) .setTemplateName(smsTemplate.getTemplateName()) .setTemplateContent(smsTemplate.getTemplateContent()) .setRemark(smsTemplate.getRemark()); AddSmsTemplateResponse response = client.addSmsTemplate(addSmsTemplateRequest); if (!("OK").equals(response.getBody().getCode())) { throw new ServiceException(response.getBody().getMessage()); } return response.getBody().getTemplateCode(); } @Override public void deleteSmsTemplate(String templateCode) throws Exception { com.aliyun.dysmsapi20170525.Client client = this.createClient(); DeleteSmsTemplateRequest deleteSmsTemplateRequest = new DeleteSmsTemplateRequest() .setTemplateCode(templateCode); DeleteSmsTemplateResponse response = client.deleteSmsTemplate(deleteSmsTemplateRequest); if (!("OK").equals(response.getBody().getCode())) { throw new ServiceException(response.getBody().getMessage()); } } /** * 初始化账号Client * * @return Client 短信操作 */ public com.aliyun.dysmsapi20170525.Client createClient() { try { if (smsSetting == null) { throw new ServiceException(ResultCode.ALI_SMS_SETTING_ERROR); } Config config = new Config(); //您的AccessKey ID config.accessKeyId = smsSetting.getAccessKeyId(); //您的AccessKey Secret config.accessKeySecret = smsSetting.getAccessSecret(); //访问的域名 config.endpoint = "dysmsapi.aliyuncs.com"; return new com.aliyun.dysmsapi20170525.Client(config); } catch (Exception e) { log.error("短信初始化错误", e); } return null; } }