支持批量发送短信、单条发送短信。
查询短信发送状态等接口。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
</dependency>
package com.dpxdata.backend.sms.aliyun;
import com.alibaba.fastjson.JSON;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 阿里云短信发送
* @author Lish
*
*/
public class AliyunSmsSend {
/**
* 单条短信发送
* @param phoneNumbers 接收短信的手机号码,多个用英文逗号隔开
* @param signName 短信签名名称,eg: "阿里云"
* @param templateCode 短信模板CODE
* @param templateParam 短信模板变量对应的实际值,eg:{"code":"1234"}
* @return sendResp.body.bizId可用于查询短信发送结果
* @throws Exception
*/
public static SendSmsResponse send(String phoneNumbers, String signName, String templateCode, String templateParam) throws Exception {
com.aliyun.dysmsapi20170525.Client client = AliyunSmsBase.createClient("accessKeyId", "keySecret");
SendSmsRequest sendReq = new SendSmsRequest()
.setPhoneNumbers(phoneNumbers)
.setSignName(signName)
.setTemplateCode(templateCode)
.setTemplateParam(templateParam);
SendSmsResponse sendResp = client.sendSms(sendReq);
String code = sendResp.body.code;
if (!com.aliyun.teautil.Common.equalString(code, "OK")) {
throw new RuntimeException("错误信息: " + sendResp.body.message + "");
}
return sendResp;
}
public static SendSmsResponse send(com.aliyun.dysmsapi20170525.Client client, String phoneNumbers, String signName, String templateCode, String templateParam) throws Exception {
SendSmsRequest sendReq = new SendSmsRequest()
.setPhoneNumbers(phoneNumbers)
.setSignName(signName)
.setTemplateCode(templateCode)
.setTemplateParam(templateParam);
SendSmsResponse sendResp = client.sendSms(sendReq);
String code = sendResp.body.code;
if (!com.aliyun.teautil.Common.equalString(code, "OK")) {
throw new RuntimeException("错误信息: " + sendResp.body.message + "");
}
return sendResp;
}
/**
* 批量短信发送
* @param phoneNumberJson 接收短信的手机号码,JSON 数组格式,eg: ["1590***0000","13500***000"]
* @param signNameJson 短信签名名称,JSON 数组格式,eg: ["阿里云","阿里巴巴"]
* @param templateCode 短信模板CODE
* @param templateParamJson 短信模板变量对应的实际值,JSON 数组格式,eg:[{"code":"1234"},{"code":"2345"}]
* @return sendResp.body.bizId可用于查询短信发送结果
* @throws Exception
*/
public static SendBatchSmsResponse batchSend(String phoneNumberJson, String signNameJson, String templateCode, String templateParamJson) throws Exception {
com.aliyun.dysmsapi20170525.Client client = AliyunSmsBase.createClient("accessKeyId", "keySecret");
SendBatchSmsRequest sendReq = new SendBatchSmsRequest()
.setPhoneNumberJson(phoneNumberJson)
.setSignNameJson(signNameJson)
.setTemplateCode(templateCode)
.setTemplateParamJson(templateParamJson);
SendBatchSmsResponse sendResp = client.sendBatchSms(sendReq);
String code = sendResp.body.code;
if (!com.aliyun.teautil.Common.equalString(code, "OK")) {
throw new RuntimeException("错误信息: " + sendResp.body.message + "");
}
return sendResp;
}
/**
* 单条短信发送 多个手机号发送结果查询
* @param phoneNumbers 接收短信的手机号码
* @param bizId 发送回执ID,即发送流水号。调用发送接口SendSms或SendBatchSms发送短信时,返回值中的BizId字段。
* @param pageSize 分页查看发送记录,指定每页显示的短信记录数量 取值范围为1~50
* @param currentPage 分页查看发送记录,指定发送记录的当前页码。
* @return Map集合 key:手机号value返回结果
*/
public static Map<String, QuerySendDetailsResponse> sendResultMany(String phoneNumbers, String bizId, String date, Long pageSize, Long currentPage) throws Exception {
com.aliyun.dysmsapi20170525.Client client = AliyunSmsBase.createClient("accessKeyId", "keySecret");
Map<String, QuerySendDetailsResponse> map = new ConcurrentHashMap<>();
java.util.List<String> phoneNums = Arrays.asList(phoneNumbers.split(","));
for (String phoneNum : phoneNums) {
QuerySendDetailsRequest queryReq = new QuerySendDetailsRequest()
.setPhoneNumber(com.aliyun.teautil.Common.assertAsString(phoneNum))
.setBizId(bizId)
.setSendDate(date)
.setPageSize(pageSize)
.setCurrentPage(currentPage);
QuerySendDetailsResponse queryResp = client.querySendDetails(queryReq);
// java.util.List<QuerySendDetailsResponseBody.QuerySendDetailsResponseBodySmsSendDetailDTOsSmsSendDetailDTO> dtos = queryResp.body.smsSendDetailDTOs.smsSendDetailDTO;
// // 打印结果
// for (QuerySendDetailsResponseBody.QuerySendDetailsResponseBodySmsSendDetailDTOsSmsSendDetailDTO dto : dtos) {
// if (com.aliyun.teautil.Common.equalString("" + dto.sendStatus + "", "3")) {
// System.out.println("" + dto.phoneNum + " 发送成功,接收时间: " + dto.receiveDate + "");
// } else if (com.aliyun.teautil.Common.equalString("" + dto.sendStatus + "", "2")) {
// System.out.println("" + dto.phoneNum + " 发送失败");
// } else {
// System.out.println("" + dto.phoneNum + " 正在发送中...");
// }
// }
map.put(phoneNum, queryResp);
}
return map;
}
/**
* 根据日期获取统计数据
* @param isGlobe 1:国内 2:2:国际/港澳台短信发送记录。
* @param startDate 开始日期,格式为yyyyMMdd,例如20181225。
* @param endDate 结束日期,格式为yyyyMMdd,例如20181225。
* @param pageIndex 页码。默认取值为1。
* @param pageSize 页数。取值范围:1~50。
* @return
*/
public static QuerySendStatisticsResponse getSendStatistics(Integer isGlobe, String startDate, String endDate, Integer pageIndex, Integer pageSize) {
Client client = null;
try {
client = AliyunSmsBase.createClient("accessKeyId", "keySecret");
QuerySendStatisticsRequest query = new QuerySendStatisticsRequest();
query.setIsGlobe(isGlobe);
query.setStartDate(startDate);
query.setEndDate(endDate);
query.setPageIndex(pageIndex);
query.setPageSize(pageSize);
QuerySendStatisticsResponse querySendStatisticsResponse = client.querySendStatistics(query);
return querySendStatisticsResponse;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
package com.dpxdata.backend.sms.aliyun;
import com.aliyun.teaopenapi.models.*;
public class AliyunSmsBase {
/**
* 使用AK&SK初始化账号Client
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
public static com.aliyun.dysmsapi20170525.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
Config config = new Config()
// 您的AccessKey ID
.setAccessKeyId(accessKeyId)
// 您的AccessKey Secret
.setAccessKeySecret(accessKeySecret);
// 访问的域名
config.endpoint = "dysmsapi.aliyuncs.com";
return new com.aliyun.dysmsapi20170525.Client(config);
}
}