前言
- 前提是已经在阿里云官网上申请了签名及模板并获取了accessKeyId以及accessKeySecret。
我这边的accessKeyId及accessKeySecret是已经写在配置文件中了。
提示:仅供参考
一、加入依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.0.6</version> <!-- 注:如提示报错,先升级基础包版,无法解决可联系技术支持 -->
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
</dependency>
二、写工具类
代码如下(示例):
public static boolean DomesticSendBatch(String accessKeyId, String accessKeySecret, List<Sms> smsList) throws Exception {
//设置超时时间-可自行调整
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//初始化ascClient需要的几个参数
final String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)
final String domain = "dysmsapi.aliyuncs.com";//短信API产品域名(接口地址固定,无需修改)
//初始化ascClient,暂时不支持多region(请勿修改)
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId,
accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象
SendBatchSmsRequest request = new SendBatchSmsRequest();
//使用post提交
request.setMethod(MethodType.POST);
// 这个应该也是可以不写的,这个是我后期报错添加上的
request.setVersion("2017-05-25");
// JSONArray,是一个有序的值序列,可以自动转换成json数组,例如:["tom","kate","jerry"]或者[1,2,3]
// 电话
JSONArray telJsonArray = new JSONArray();
// 这个是短信模板里要传的参数
JSONArray paramsJsonArray = new JSONArray();
// 签名
JSONArray signJsonArray = new JSONArray();
for (Sms sms : smsList) {
// sign、tempate都有多个,所以要遍历获取
String signs = sms.getSign();
signJsonArray.add(signs);
// 因为是批量发送,所以电话也要遍历获取
telJsonArray.add(sms.getTel());
AliTemplate template = (AliTemplate) sms.getTemplate();
// 这个是短信模板里面要传的参数,因为是批量发送,每发一条的短信,要传的参数也不一样
paramsJsonArray.add(template.getParamsAsJson());
}
request.setPhoneNumberJson(telJsonArray.toString());
request.setSignNameJson(signJsonArray.toString());
AliTemplate template = (AliTemplate) smsList.get(0).getTemplate();
request.setTemplateCode(template.getCode());
request.setTemplateParamJson(paramsJsonArray.toString());
SendBatchSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
// 请求成功
for (Sms sms : smsList) {
sms.setResponse(sendSmsResponse);
}
// smsList.get(0).setResponse(sendSmsResponse);
return true;
}
return false;
}
/**
* 批量发送短信测试
*/
@Test
void Test() throws Exception {
List<Sms> list = new ArrayList<>();
Company c = companyService.getTopByUcc("..");
GroupDO grp = groupRepository.findGroupDOById(..);
Optional<GroupInviteLetterDO> gil = groupInviteLetterRepository.findById(..);
// 这里是ArticlePostNoticeTemplateSMS_243196596类继承了AliTemplate接口 ,ArticlePostNoticeTemplateSMS_243196596这里面主要是写了短信模板里要传的字段,然后再写一个有参构造器,AliTemplate接口写了获取短信模板id, 获取短信模板,获取短信模板里的参数的方法。
AliTemplate template = new ArticlePostNoticeTemplateSMS_243196596("小明", "2019", "小花", "12", 1);
Company c1 = companyService.getTopByUcc("..");
// 这里用的是jpa, 不是mybatis
GroupDO grp1 = groupRepository.findGroupDOById(..);
Optional<GroupInviteLetterDO> gil1 = groupInviteLetterRepository.findById(..);
AliTemplate template1 = new ArticlePostNoticeTemplateSMS_243196596("小白", "2020", "小花", "13", 1);
// 添加两条数据测试批量发送
list.add(new MessageDO(SIGN1,gil.get(),c,template));
list.add(new MessageDO(SIGN2,gil1.get(),c1,template1));
System.out.println(list);
// 调用工具类里的方法
SmsAli.DomesticSendBatch(keyId, keySecret, list);
}
总结
这也是我第一次写批量短信发送,也写了挺久,也是实习期间,公司给了我这么一个机会让我接触到阿里云批量短信发送,毕竟如果光靠自己是申请不到签名和模板的,哭唧唧,所以浅浅记录一下吧。
这里面我还学到了一个封装类就是 JSONArray,他可以自动转换成json数组,而且还是自带中括号的,就比如[“tom”,“kate”,“jerry”],就不用我手动拼接成这样了,就很棒!
版权声明:本文为weixin_57393819原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。