阿里云短信服务实现

阿里云短信服务实现

准备工作

文档链接:短信开通链接

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);
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值