阿里云短信服务实现
文章目录
准备工作
文档链接:短信开通链接
1、文档链接
文档链接:操作链接
文档链接:短信开通链接
1、开通短信服务,并购买相应的短信套餐
2、获取AccessKey用于调用阿里云资源的密钥
3、调用API发送短信
2、获取账号相应配置
获取Accesskey
在调用阿里云API时您需要使用AccessKey完成身份验证。AccessKey包括AccessKey ID和AccessKey Secret,需要一起使用。具体如下:
AccessKey ID:用于标识用户。
AccessKey Secret:用于验证用户的密钥。AccessKey Secret必须保密。
处于安全的考虑,创建RAM用户,并为RAM用户授予不同的权限,提供给您企业的员工用来管理短信服务资源,从而让您避免与其他用户共享云账号密钥,降低您企业的信息安全风险。
3、申请相应签名
4、添加短信模板
整体流程图
代码实现
说明
前提是公司已经注册了阿里云账号和进行了企业认证,并且也开通了短信服务和购买套餐
所以只需要进行第三步获取Accesskey和调用API发送短信。
1、配置信息
1.1 、短信平台秘钥配置
{
"regionId": "cn-hangzhou",
"accessKeyId": "LTAI5tH2DwTmpLv7wekRZVAd",
"accessKeySecret": "MLmboOd2Qf3p1idwnsAdacK40vZvtWs"
}
1.2 、短信平台模板配置
{
"templateId": "SMS_462035749",
"templateSignName": "可乐加糖",
"message": "您的验证码为 {code} ,该验证码5分钟内有效,请勿泄露于他人。"
}
2、依赖文件
<!--阿里云发送短信-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.16</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
</dependency>
3、java代码
SendSmsSController.java
import cn.hutool.json.JSONUtil;
import com.aliyuncs.dysmsapi.model.v20170525.SendBatchSmsResponse;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.kele.aio.cloud.sms.api.dto.BatchSmsRequestDTO;
import com.kele.aio.cloud.sms.api.dto.SmsRequestDTO;
import com.kele.aio.cloud.sms.api.dto.SmsSendResultDTO;
import com.kele.sms.service.PhoneService;
import com.pig4cloud.pig.common.core.util.R;
import com.pig4cloud.pig.common.security.annotation.Inner;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.HttpHeaders;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @Author: 可乐加糖
* @createTime: 2023年04月06日 15:37:19
* @Description: 短信发送服务
*/
@Tag(name = "短信发送")
@RestController
@RequestMapping("sendSms")
@RequiredArgsConstructor
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class SendSmsSController {
@Autowired
@Qualifier("aliPhoneServiceImpl")
private PhoneService phoneService;
/**
* 发送短信接口
*
* @param smsRequest 参数信息
* @return 返回结果
*/
@Inner
@PostMapping("sendMessage")
public R<SmsSendResultDTO> sendMessage(@RequestBody @Validated SmsRequestDTO smsRequest) {
String params = smsRequest.getParams();
Map map = JSONUtil.toBean(params, Map.class, true);
smsRequest.setParmasMap(map);
R<SendSmsResponse> result = phoneService.sendMessage(smsRequest);
SendSmsResponse sendSmsResponse = result.getData();
List<SmsSendResultDTO> listSmsSendResult = null;
BatchSmsRequestDTO batchSmsRequest = new BatchSmsRequestDTO();
if (sendSmsResponse != null){
List<String> phoneNumbers = new ArrayList<>();
phoneNumbers.add(smsRequest.getPhoneNumber());
batchSmsRequest.setPhoneNumbers(phoneNumbers);
batchSmsRequest.setAccessKeyId(smsRequest.getAccessKeyId());
batchSmsRequest.setAccessKeySecret(smsRequest.getAccessKeySecret());
listSmsSendResult = phoneService.querySendDetails(batchSmsRequest, sendSmsResponse.getBizId());
if (listSmsSendResult != null && listSmsSendResult.size() > 0){
SmsSendResultDTO smsSendResultDTO = listSmsSendResult.get(0);
return R.ok(smsSendResultDTO);
}
}
return R.ok();
}
/**
* 批量短信接口
*
* @param batchSmsRequest 参数信息
* @return 返回结果
*/
@Inner
@PostMapping("sendBatchMessage")
public R<List<SmsSendResultDTO>> sendBatchMessage(@RequestBody @Validated BatchSmsRequestDTO batchSmsRequest) {
Map params = JSONUtil.toBean(batchSmsRequest.getParams(), Map.class, true);
List<String> signNames = new ArrayList<>();
List<Map<String,String>> mapContents = new ArrayList<>();
batchSmsRequest.getPhoneNumbers().forEach(phone ->{
signNames.add(batchSmsRequest.getSignName());
mapContents.add(params);
});
batchSmsRequest.setSignNames(signNames);
batchSmsRequest.setParmasMap(mapContents);
R<SendBatchSmsResponse> result = phoneService.sendBatchMessage(batchSmsRequest);
SendBatchSmsResponse sendSmsResponse = result.getData();
List<SmsSendResultDTO> listSmsSendResult = null;
if (sendSmsResponse != null){
listSmsSendResult = phoneService.querySendDetails(batchSmsRequest, sendSmsResponse.getBizId());
return R.ok(listSmsSendResult);
}
return R.ok();
}
}
PhoneService.java
import com.aliyuncs.dysmsapi.model.v20170525.SendBatchSmsResponse;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.kele.aio.cloud.sms.api.dto.BatchSmsRequestDTO;
import com.kele.aio.cloud.sms.api.dto.SmsRequestDTO;
import com.kele.aio.cloud.sms.api.dto.SmsSendResultDTO;
import com.pig4cloud.pig.common.core.util.R;
import java.util.List;
/**
* @Author: 可乐加糖
* @createTime: 2023年04月14日 10:37:13
* @Description: 手机短信发送服务
*/
public interface PhoneService{
R<SendSmsResponse> sendMessage(SmsRequestDTO smsRequest);
R<SendBatchSmsResponse> sendBatchMessage(BatchSmsRequestDTO batchSmsRequest);
List<SmsSendResultDTO> querySendDetails(BatchSmsRequestDTO batchSmsRequest, String bizId);
}
AliPhoneServiceImpl.java
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONUtil;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.*;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.kele.aio.cloud.sms.api.dto.BatchSmsRequestDTO;
import com.kele.aio.cloud.sms.api.dto.SmsRequestDTO;
import com.kele.aio.cloud.sms.api.dto.SmsSendResultDTO;
import com.kele.aio.cloud.sms.api.enums.SmsErrorEnum;
import com.kele.sms.service.PhoneService;
import com.pig4cloud.pig.common.core.exception.AioException;
import com.pig4cloud.pig.common.core.util.R;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @Author: 可乐加糖
* @createTime: 2023年04月14日 11:05:58
* @Description: 阿里云短信处理实现
*/
@Slf4j
@Service("aliPhoneServiceImpl")
@RequiredArgsConstructor
public class AliPhoneServiceImpl implements PhoneService {
// 产品名称:云通信短信API产品,开发者无需替换
static final String PRODUCT = "Dysmsapi";
// 产品域名,开发者无需替换
static final String DOMAIN = "dysmsapi.aliyuncs.com";
private IAcsClient acsClient = null;
/**
* 阿里云发送单条消息
* @param smsRequest
* @return
*/
@Override
public R<SendSmsResponse> sendMessage(SmsRequestDTO smsRequest) {
// 可自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
// 初始化acsClient,暂不支持region化
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", smsRequest.getAccessKeyId(), smsRequest.getAccessKeySecret());
try {
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", PRODUCT, DOMAIN);
} catch (ClientException e) {
log.error("阿里云发送短信服务异常,错误信息:", e);
throw new AioException(SmsErrorEnum.ALI_YUN_ERROR);
}
if (acsClient == null){
acsClient = new DefaultAcsClient(profile);
}
// 组装请求对象-具体描述见控制台-文档部分内容
SendSmsRequest request = new SendSmsRequest();
// 必填:待发送手机号
request.setPhoneNumbers(smsRequest.getPhoneNumber());
// 必填:短信签名-可在短信控制台中找到
request.setSignName(smsRequest.getSignName());
// 必填:短信模板-可在短信控制台中找到
request.setTemplateCode(smsRequest.getTemplateCode());
// 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
request.putQueryParameter("TemplateParam", parsingKeyValue(smsRequest.getParmasMap()));
// 选填-上行短信扩展码(无特殊需求用户请忽略此字段)
// request.setSmsUpExtendCode("90997");
// 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
//request.setOutId("yourOutId");
SendSmsResponse sendSmsResponse;
String resultCode = "";
try {
sendSmsResponse = acsClient.getAcsResponse(request);
if (sendSmsResponse != null){
resultCode = sendSmsResponse.getCode();
}
log.info("send sms:m={},msg={},result={}",smsRequest.getPhoneNumber(),JSONUtil.toJsonStr(smsRequest.getParmasMap()),sendSmsResponse);
} catch (ClientException e) {
log.error("阿里云发送短信服务异常,错误信息:", e);
throw new AioException(SmsErrorEnum.ALI_YUN_ERROR);
}
if(!resultCode.equals("OK")){
log.error("阿里云发送短信验证码失败错误码 :{}", sendSmsResponse.getMessage());
return R.failed(sendSmsResponse.getMessage());
}
return R.ok(sendSmsResponse);
}
/**
* 阿里云批量发送多条消息
* @param batchSmsRequest
* @return
*/
@Override
public R<SendBatchSmsResponse> sendBatchMessage(BatchSmsRequestDTO batchSmsRequest) {
// 可自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
// 初始化acsClient,暂不支持region化
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", batchSmsRequest.getAccessKeyId(), batchSmsRequest.getAccessKeySecret());
try {
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", PRODUCT, DOMAIN);
} catch (ClientException e) {
log.error("阿里云发送短信服务异常,错误信息:", e);
throw new AioException(SmsErrorEnum.ALI_YUN_ERROR);
}
if (acsClient == null){
acsClient = new DefaultAcsClient(profile);
}
// 组装请求对象-具体描述见控制台-文档部分内容
SendBatchSmsRequest request = new SendBatchSmsRequest ();
request.setMethod(MethodType.POST);
//必填:待发送手机号。支持JSON格式的批量调用,批量上限为100个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
request.setPhoneNumberJson(JSONUtil.toJsonStr(batchSmsRequest.getPhoneNumbers()));
//必填:短信签名-支持不同的号码发送不同的短信签名
request.setSignNameJson(JSONUtil.toJsonStr(batchSmsRequest.getSignNames()));
//必填:短信模板-可在短信控制台中找到
request.setTemplateCode(batchSmsRequest.getTemplateCode());
//必填:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
request.setTemplateParamJson(JSONUtil.parseArray(batchSmsRequest.getParmasMap()).toString());
// 选填-上行短信扩展码(无特殊需求用户请忽略此字段)
// request.setSmsUpExtendCode("90997");
// 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
//request.setOutId("yourOutId");
SendBatchSmsResponse sendSmsResponse;
String resultCode = "";
try {
sendSmsResponse = acsClient.getAcsResponse(request);
if (sendSmsResponse != null){
resultCode = sendSmsResponse.getCode();
}
log.info("send sms:size={},msg={},result={}",batchSmsRequest.getSignNames().size(),JSONUtil.parseArray(batchSmsRequest.getParmasMap()),sendSmsResponse);
} catch (ClientException e) {
log.error("阿里云发送短信服务异常,错误信息:", e);
throw new AioException(SmsErrorEnum.ALI_YUN_ERROR);
}
if(!resultCode.equals("OK")){
return R.failed(sendSmsResponse);
}
return R.ok(sendSmsResponse);
}
@Override
public List<SmsSendResultDTO> querySendDetails(BatchSmsRequestDTO batchSmsRequest, String bizId){
// 可自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
// 初始化acsClient,暂不支持region化
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", batchSmsRequest.getAccessKeyId(), batchSmsRequest.getAccessKeySecret());
try {
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", PRODUCT, DOMAIN);
} catch (ClientException e) {
log.error("阿里云发送短信服务异常,错误信息:", e);
throw new AioException(SmsErrorEnum.ALI_YUN_ERROR);
}
List<String> phoneNumbers = batchSmsRequest.getPhoneNumbers();
List<SmsSendResultDTO> listSmsSendResult = new ArrayList<>();
phoneNumbers.forEach(phoneNumber ->{
if (acsClient == null){
acsClient = new DefaultAcsClient(profile);
}
// 组装请求对象
QuerySendDetailsRequest request = new QuerySendDetailsRequest();
// 必填-号码
request.setPhoneNumber(phoneNumber);
// 可选-流水号
request.setBizId(bizId);
// 必填-发送日期 支持30天内记录查询,格式yyyyMMdd
SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd");
request.setSendDate(ft.format(new Date()));
// 必填-页大小
request.setPageSize(1L);
// 必填-当前页码从1开始计数
request.setCurrentPage(1L);
// hint 此处可能会抛出异常,注意catch
try {
QuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);
for (QuerySendDetailsResponse.SmsSendDetailDTO smsSendDetailDTO : querySendDetailsResponse .getSmsSendDetailDTOs()) {
SmsSendResultDTO smsSendResult = new SmsSendResultDTO();
BeanUtil.copyProperties(smsSendDetailDTO,smsSendResult);
listSmsSendResult.add(smsSendResult);
}
} catch (ClientException e) {
log.error("阿里云发送短信服务异常,错误信息:", e);
throw new AioException(SmsErrorEnum.ALI_YUN_ERROR);
}
});
return listSmsSendResult;
}
/**
* 把短信内容进行排版,排成阿里云要求的格式
* @param mapContent
* @return
*/
private static String parsingKeyValue(Map<String, String> mapContent) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("{");
for (String key : mapContent.keySet()) {
stringBuilder.append("'" + key + "':'" + mapContent.get(key) + "',");
}
return stringBuilder.substring(0, stringBuilder.length() - 1) + "}";
}
}
4、测试类
TestSendSmsAction.java
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.aliyuncs.dysmsapi.model.v20170525.SendBatchSmsResponse;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.kele.aio.cloud.sms.api.dto.BatchSmsRequestDTO;
import com.kele.aio.cloud.sms.api.dto.SmsRequestDTO;
import com.kele.aio.cloud.sms.api.dto.SmsSendResultDTO;
import com.kele.sms.service.impl.AliPhoneServiceImpl;
import com.pig4cloud.pig.common.core.util.R;
import org.junit.jupiter.api.Test;
import org.springframework.beans.BeanUtils;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @Author: 可乐加糖
* @createTime: 2023年04月10日 08:50:15
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.aliyuncs.dysmsapi.model.v20170525.SendBatchSmsResponse;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.kele.aio.cloud.sms.api.dto.BatchSmsRequestDTO;
import com.kele.aio.cloud.sms.api.dto.SmsRequestDTO;
import com.kele.aio.cloud.sms.api.dto.SmsSendResultDTO;
import com.kele.sms.service.impl.AliPhoneServiceImpl;
import com.pig4cloud.pig.common.core.util.R;
import org.junit.jupiter.api.Test;
import org.springframework.beans.BeanUtils;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @Author: 可乐加糖
* @createTime: 2023年04月10日 08:50:15
* @Description: 测试用一下而已
*/
public class TestSendSmsAction {
private static final SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
private static final SimpleDateFormat sdfDateYmd = new SimpleDateFormat("yyyy年MM月dd日");
private static final SimpleDateFormat sdfDateYm = new SimpleDateFormat("yyyy年MM月");
private static final SimpleDateFormat sdfDateY = new SimpleDateFormat("yyyy年");
@Test
public void sendMessage(){
// 拼接参数
SmsRequestDTO smsRequest = new SmsRequestDTO();
smsRequest.setRegionId("cn-hangzhou");
smsRequest.setAccessKeyId("LTAI5tH2DwTmpLv7531kRZVIP");
smsRequest.setAccessKeySecret("MLmboOd2Qf3p1idwnsqQcK4ad2ZvtWs");
smsRequest.setSignName("可乐加糖");
smsRequest.setTemplateCode("SMS_462025771");
// 动态参数
Map<String,String> params = new HashMap<>();
params.put("username","kele");
params.put("password","kelecloud123");
smsRequest.setParmasMap(params);
smsRequest.setParams(JSONUtil.toJsonStr(params));
smsRequest.setPhoneNumber("15010081116");
// 发送
AliPhoneServiceImpl phoneServiceImpl = new AliPhoneServiceImpl();
R<SendSmsResponse> sendSmsResponseR = phoneServiceImpl.sendMessage(smsRequest);
SendSmsResponse sendSmsResponse = sendSmsResponseR.getData();
System.out.println("=====================SendBatchSmsResponse=====================");
System.out.println("调用阿里云短信发送结果");
System.out.println(JSONUtil.toJsonStr(sendSmsResponse));
if (!R.isOk(sendSmsResponseR)){
System.out.println("调用阿里云短信发送结果失败!!!");
return;
}
BatchSmsRequestDTO batchSmsRequest = new BatchSmsRequestDTO();
BeanUtils.copyProperties(smsRequest, batchSmsRequest);
List<String> phoneNumbers = new ArrayList<>();
phoneNumbers.add(smsRequest.getPhoneNumber());
batchSmsRequest.setPhoneNumbers(phoneNumbers);
List<SmsSendResultDTO> listSmsSendResult = null;
if (sendSmsResponse != null && sendSmsResponse.getBizId() != null){
listSmsSendResult = phoneServiceImpl.querySendDetails(batchSmsRequest, sendSmsResponse.getBizId());
System.out.println("=====================SendBatchSmsResponse=====================");
System.out.println("调用阿里云短信发送结果详情");
System.out.println(JSONUtil.toJsonStr(listSmsSendResult));
}
}
@Test
public void sendBatchMessage(){
// 拼接参数
BatchSmsRequestDTO batchSmsRequest = new BatchSmsRequestDTO();
batchSmsRequest.setRegionId("cn-hangzhou");
batchSmsRequest.setAccessKeyId("LTAI5tH2DwTmpLv7531kRZVIP");
batchSmsRequest.setAccessKeySecret("MLmboOd2Qf3p1idwnsqQcK40vZvtWs");
batchSmsRequest.setTemplateCode("SMS_462030771");
Map<String,String> params = new HashMap<>();
params.put("key","Va91K30s");
//params.put("time","2023年07月05日");
params.put("time","2023年07月");
List<String> signNames = new ArrayList<>();
List<Map<String,String>> mapContents = new ArrayList<>();
List<String> phoneNumbers = new ArrayList<>();
phoneNumbers.add("15010081116");
phoneNumbers.forEach(phoneNumber ->{
signNames.add("可乐加糖");
mapContents.add(params);
});
batchSmsRequest.setPhoneNumbers(phoneNumbers);
batchSmsRequest.setSignNames(signNames);
batchSmsRequest.setParmasMap(mapContents);
// 发送
AliPhoneServiceImpl phoneServiceImpl = new AliPhoneServiceImpl();
R<SendBatchSmsResponse> result = phoneServiceImpl.sendBatchMessage(batchSmsRequest);
SendBatchSmsResponse sendSmsResponse = result.getData();
System.out.println("=====================SendBatchSmsResponse=====================");
System.out.println("调用阿里云短信发送结果");
System.out.println(JSONUtil.toJsonStr(sendSmsResponse));
if (!R.isOk(result)){
System.out.println("调用阿里云短信发送结果失败!!!");
return;
}
List<SmsSendResultDTO> listSmsSendResult = null;
if (sendSmsResponse != null && sendSmsResponse.getBizId() != null){
listSmsSendResult = phoneServiceImpl.querySendDetails(batchSmsRequest, sendSmsResponse.getBizId());
System.out.println("=====================SendBatchSmsResponse=====================");
System.out.println("调用阿里云短信发送结果详情");
System.out.println(JSONUtil.toJsonStr(listSmsSendResult));
}
}
/***
* Description: 发送值守报告
* @Author: wb_fb132
* @Date: 2023/5/25 10:08
*/
@Test
public static void sendOndutyReportMessage() {
// 拼接参数
SmsRequestDTO smsRequestDTO = new SmsRequestDTO();
smsRequestDTO.setRegionId("cn-hangzhou");
smsRequestDTO.setAccessKeyId("LTAI5tH2DwTmpLv7531kRZVIP");
smsRequestDTO.setAccessKeySecret("MLmboOd2Qf3p1idwnsqQcK40vZvtWs");
smsRequestDTO.setTemplateCode("SMS_461035247");
smsRequestDTO.setSignName("浙江大华智慧物联运营服务");
// 变量参数
// 时间工具:https://blog.youkuaiyun.com/qq_27327261/article/details/125006394
String dateStr = sdfDateYmd.format(new Date());
Date endDate = DateUtil.parse(dateStr);
DateTime startDate = DateUtil.offsetDay(endDate, -1);
String timeStr = sdfDateYmd.format(startDate) + "至" + sdfDateYmd.format(endDate);
Map<String,String> parmasMap = new HashMap<>();
//parmasMap.put("time",timeStr);
//parmasMap.put("time",sdfDateYmd.format(startDate));
parmasMap.put("time",sdfDateYm.format(startDate));
parmasMap.put("key","1234567890");
parmasMap.put("expire","4");
smsRequestDTO.setParmasMap(parmasMap);
smsRequestDTO.setPhoneNumber("15010081116");
// 发送
AliPhoneServiceImpl phoneServiceImpl = new AliPhoneServiceImpl();
R<SendSmsResponse> sendSmsResponseR = phoneServiceImpl.sendMessage(smsRequestDTO);
SendSmsResponse sendSmsResponse = sendSmsResponseR.getData();
System.out.println("=====================SendBatchSmsResponse=====================");
System.out.println("调用阿里云短信发送结果");
System.out.println(JSONUtil.toJsonStr(sendSmsResponse));
if (!R.isOk(sendSmsResponseR)){
System.out.println("调用阿里云短信发送结果失败!!!");
return;
}
//查询详情参数
BatchSmsRequestDTO batchSmsRequest = new BatchSmsRequestDTO();
List<String> phoneNumbers = new ArrayList<>();
phoneNumbers.add(smsRequestDTO.getPhoneNumber());
batchSmsRequest.setPhoneNumbers(phoneNumbers);
batchSmsRequest.setAccessKeyId(smsRequestDTO.getAccessKeyId());
batchSmsRequest.setAccessKeySecret(smsRequestDTO.getAccessKeySecret());
List<SmsSendResultDTO> listSmsSendResult = null;
System.out.println("=====================SendBatchSmsResponse=====================");
System.out.println("调用阿里云短信发送结果详情");
if (sendSmsResponse != null && sendSmsResponse.getBizId() != null){
listSmsSendResult = phoneServiceImpl.querySendDetails(batchSmsRequest, sendSmsResponse.getBizId());
System.out.println(JSONUtil.toJsonStr(listSmsSendResult));
}
System.out.println(JSONUtil.toJsonStr(listSmsSendResult));
}
/***
* Description: 发送值守报告
* @Author: wb_fb132
* @Date: 2023/5/25 10:08
*/
@Test
public static void testDateUtils() {
//昨天
DateTime yesterday = DateUtil.yesterday();
String format = sdfDateYmd.format(yesterday);
System.out.printf(format);
Date startTimeOfCurrentDay = getStartTimeOfCurrentDay(yesterday);
Date endTimeOfCurrentDay = getEndTimeOfCurrentDay(yesterday);
//明天
DateTime tomorrow = DateUtil.tomorrow();
//上周
DateTime dateTime = DateUtil.lastWeek();
String formatDateTime = sdfDateYmd.format(yesterday);
//下周
DateTime dateTime1 = DateUtil.nextWeek();
//上个月
DateTime dateTime2 = DateUtil.lastMonth();
//下个月
DateTime dateTime3 = DateUtil.nextMonth();
Date date = DateUtil.parse("2021-06-30 11:22:33.100");
//年
int year = DateUtil.year(date);//2021
//年和季度
String yearAndQuarter = DateUtil.yearAndQuarter(date);//20212
//季度
int quarter = DateUtil.quarter(date);//2
//月,从0开始
int month = DateUtil.month(date);//5 六月
//获得指定日期是所在年份的第几周
// 此方法返回值与一周的第一天有关,比如: 2016年1月3日为周日,如果一周的第一天为周日,那这天是第二周(返回2)
// 如果一周的第一天为周一,那这天是第一周(返回1) 跨年的那个星期得到的结果总是1
//一周的第一天为周一
int weekOfYear = DateUtil.weekOfYear(date);//27
//一月的第几周,一周的第一天为周一
int weekOfMonth = DateUtil.weekOfMonth(date);//5
//一周的第几天,从星期天开始,从1开始
int dayOfWeek = DateUtil.dayOfWeek(date);//4 星期三
//一月的第几天
int dayOfMonth = DateUtil.dayOfMonth(date);//30
//一年的第几天
int dayOfYear = DateUtil.dayOfYear(date);//181
//小时
int hour = DateUtil.hour(date, true);//11
//分钟
int minute = DateUtil.minute(date);//22
//秒
int second = DateUtil.second(date);//33
//毫秒
int millisecond = DateUtil.millisecond(date);//100
}
/***
* Description: 发送值守报告
* @Author: wb_fb132
* @Date: 2023/5/25 10:08
*/
@Test
public static void testDateUtils2() {
//=============================
// 9 开始时间和结束时间
Date date = DateUtil.parse("2021-06-30 11:22:33.100");
//当前秒的开始时间
Date beginOfSecond = DateUtil.beginOfSecond(date);//2021-06-30 11:22:33.000
//当前秒的结束时间
Date endOfSecond = DateUtil.endOfSecond(date);//2021-06-30 11:22:33.999
//当前分钟的开始时间
Date beginOfMinute = DateUtil.beginOfMinute(date);//2021-06-30 11:22:00
//当前分钟的结束时间
Date endOfMinute = DateUtil.endOfMinute(date);//2021-06-30 11:22:59
//当前小时的开始时间
Date beginOfHour = DateUtil.beginOfHour(date);//2021-06-30 11:00:00
//当前小时的结束时间
Date endOfHour = DateUtil.endOfHour(date);//2021-06-30 11:59:59
//当前天的开始时间
Date beginOfDay = DateUtil.beginOfDay(date);//2021-06-30 00:00:00
//当前天的结束时间
Date endOfDay = DateUtil.endOfDay(date);//2021-06-30 23:59:59
//当前周的开始时间,
Date beginOfWeek = DateUtil.beginOfWeek(date);//2021-06-28 00:00:00 周一
//当前周的结束时间
Date endOfWeek = DateUtil.endOfWeek(date);//2021-07-04 23:59:59
//当前月的开始时间
Date beginOfMonth = DateUtil.beginOfMonth(date);//2021-06-01 00:00:00
//当前月的结束时间
Date endOfMonth = DateUtil.endOfMonth(date);//2021-06-30 23:59:59
//当前季度的开始时间
Date beginOfQuarter = DateUtil.beginOfQuarter(date);//2021-04-01 00:00:00
//当前季度的结束时间
Date endOfQuarter = DateUtil.endOfQuarter(date);//2021-06-30 23:59:59
//当前年的开始时间
Date beginOfYear = DateUtil.beginOfYear(date);//2021-01-01 00:00:00
//当前年的结束时间
Date endOfYear = DateUtil.endOfYear(date);//2021-12-31 23:59:59
}
/***
* Description: 发送值守报告
* @Author: wb_fb132
* @Date: 2023/5/25 10:08
*/
@Test
public static void testDateUtils666() {
DateTime dateTimeWeek = DateUtil.lastWeek();
//当前周的开始时间,
Date beginOfWeek = DateUtil.beginOfWeek(dateTimeWeek);//2021-06-28 00:00:00 周一
//当前周的结束时间
Date endOfWeek = DateUtil.endOfWeek(dateTimeWeek);//2021-07-04 23:59:59
System.out.println("Date转换字符串:" + DateUtil.formatDateTime(endOfWeek));
String beginOfWeekStr = sdfDateYmd.format(beginOfWeek);
String endOfWeekStr = sdfDateYmd.format(endOfWeek);
System.out.println("上周的开始时间:" + beginOfWeekStr);
System.out.println("上周的结束时间:" + endOfWeekStr);
int weekOfYear = DateUtil.weekOfYear(beginOfWeek);
System.out.println("本周为当年的第几周:" + weekOfYear);
String lastWeekStr = sdfDateY.format(beginOfWeek) +" 第"+ weekOfYear + "周" ;
System.out.println("本周为当年的第几周:" + lastWeekStr);
//上个月
DateTime dateTimeMonth = DateUtil.lastMonth();
//当前月的开始时间
Date beginOfMonth = DateUtil.beginOfMonth(dateTimeMonth);//2021-06-01 00:00:00
//当前月的结束时间
Date endOfMonth = DateUtil.endOfMonth(dateTimeMonth);//2021-06-30 23:59:59
String beginOfMonthStr = sdfDateYmd.format(beginOfMonth);
String endOfMonthStr = sdfDateYmd.format(endOfMonth);
System.out.println("年月:" + sdfDateYm.format(beginOfMonth));
System.out.println("上月的开始时间:" + beginOfMonthStr);
System.out.println("上月的结束时间:" + endOfMonthStr);
}
/**
* 获取指定天的开始时间
* @return
*/
public static Date getStartTimeOfCurrentDay(Date date){
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.setTime(date);
setMinTimeOfDay(calendar);
return calendar.getTime();
}
/**
* 设置当天的开始时间
* @param calendar
*/
private static void setMinTimeOfDay(Calendar calendar) {
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.MILLISECOND, 0);
}
/**
* 获取指定天的结束时间
* @return
*/
public static Date getEndTimeOfCurrentDay(Date date){
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.setTime(date);
setMaxTimeOfDay(calendar);
return calendar.getTime();
}
/**
* 设置当天的结束时间
* @param calendar
*/
private static void setMaxTimeOfDay(Calendar calendar) {
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.MILLISECOND, 999);
}
}