springboot实现阿里短信发送并查询状态
改pom
<!-- 阿里云短信服务依赖 --><dependency><groupId>com.aliyun</groupId><artifactId>dysmsapi20170525</artifactId>
</dependency>
写yml
aliyun:sms:access-key-id: access-key-secret: endpoint: sign-name-json: template-code-map:#这儿涉及到多个模板,正常只需要一个mainLand: international: traditional:
配置类
@Data
@ConfigurationProperties(prefix = "aliyun.sms")
@Configuration
public class SmsProperties {private String accessKeyId;private String accessKeySecret;private String endpoint;private String signNameJson;private String regionId;private Map<String, String> templateCodeMap;
}
Bean注入
@Configuration
@AllArgsConstructor
@Data
@Slf4j
public class SmsConfig {private final SmsProperties smsProperties;@Bean("smsClient")public Client smsClient() {Config config = new Config().setAccessKeyId(smsProperties.getAccessKeyId()).setAccessKeySecret(smsProperties.getAccessKeySecret()).setEndpoint(smsProperties.getEndpoint());Client client = null;try {client = new Client(config);} catch (Exception e) {log.error("阿里云sms加载失败");}return client;}@Bean("smsRequest")SendSmsRequest sendSmsRequest() {return new SendSmsRequest().setSignName(smsProperties.getSignNameJson());}}
业务类
public ResultEnum sendSms(HttpServletRequest request,String mobile, String code) {// 设置手机号sendSmsRequest.setPhoneNumbers(mobile);// 验证是否为大陆手机号Integer languageIndex = LanguageUtil.getLanguageIndex();// 根据当前语言设置短信模板Code(业务需要,涉及到了多语言)if (Objects.equals(languageIndex, LanguageType.CN.getIndex())) {sendSmsRequest.setTemplateCode(smsProperties.getTemplateCodeMap().get("mainLand"));} else if (Objects.equals(languageIndex, LanguageType.EN.getIndex())) {sendSmsRequest.setTemplateCode(smsProperties.getTemplateCodeMap().get("international"));} else {sendSmsRequest.setTemplateCode(smsProperties.getTemplateCodeMap().get("traditional"));}// 设置验证码sendSmsRequest.setTemplateParam("{\"code\": \"" + code + "\"}");SendSmsResponse sendSmsResponse;try {sendSmsResponse = client.sendSms(sendSmsRequest);} catch (Exception e) {throw new BadRequestException(ResultEnum.SMS_NOT_SEND);}CodeLog codeLog = new CodeLog();codeLog.setSendTo(mobile);codeLog.setMessageContent(code);codeLog.setIp(StringUtils.getIp(request));codeLogService.save(codeLog);String bizId = sendSmsResponse.getBody().bizId;if (StringUtils.isBlank(bizId)) {// 阿里云中可以配置发送频率,取不到bizId就默认发送频繁// 配置的全局拦截,错误直接抛出枚举throw new BadRequestException(ResultEnum.REQUEST_FREQUENT);}// 查询短信发送状态com.aliyun.teautil.Common.sleep(10000);QuerySendDetailsRequest queryReq = new QuerySendDetailsRequest().setPhoneNumber(mobile).setBizId(bizId).setSendDate(DateUtil.today().replaceAll("-","")).setPageSize(10L).setCurrentPage(1L);try {QuerySendDetailsResponse queryResp = client.querySendDetails(queryReq);List<QuerySendDetailsResponseBody.QuerySendDetailsResponseBodySmsSendDetailDTOsSmsSendDetailDTO> smsSendDetailDTO = queryResp.getBody().getSmsSendDetailDTOs().getSmsSendDetailDTO();for (QuerySendDetailsResponseBody.QuerySendDetailsResponseBodySmsSendDetailDTOsSmsSendDetailDTO sendDetailDTO : smsSendDetailDTO) {if (sendDetailDTO.getSendStatus().equals(2L)) {throw new BadRequestException(ResultEnum.SMS_NOT_SEND);}}} catch (Exception e) {log.error("手机号发送状态查询失败");}return "OK".equals(sendSmsResponse.getBody().code) ? ResultEnum.SUCCESS : ResultEnum.SMS_NOT_SEND;}
结语
注:这儿的查询策略是:发送完成之后延迟十秒钟查询该短信的发送状态。若是前端一直需要等待才能响应的话,效果也不太好。
可以发送短信返回bizId,然后再提供一个根据bizId查询发送状态的接口供前端调用。
参考:
SendSms - 发送短信
https://next.api.aliyun.com/document/Dysmsapi/2017-05-25/SendSms
QuerySendDetails - 查看短信发送记录和发送状态
https://next.api.aliyun.com/document/Dysmsapi/2017-05-25/QuerySendDetails
springboot实现阿里短信发送并查询状态相关推荐
- [JAVA]阿里短信发送(测试)
阿里短信发送 1.进入阿里云官网 https://www.aliyun.com/?utm_content=se_1008364713 2.登录后点击控制台 3.搜索短信服务 4.选中快速学习,绑定测试 ...
- SpringBoot实现阿里短信SDK发送短信,使用MQ监听器
先 创建sms短信微服务工程,有可能很多工程要使用我们创建的短信服务. 项目环境: SpringBoot SpringClould 步骤: config SmsConfiguration: /*** ...
- thinkphp5+阿里短信发送验证码
一.申请阿里短信接口,开通服务,申请AccessKey ID和Access Key Secret 二.申请短信发送模板 三.在thinkphp5中的config文件中添加一下配置 //短信配置'SMS ...
- 阿里短信发送(跟着宝哥学java)
1 短信发送 1.1 注册阿里云 1.2 查找短信服务:创建签名 1.3 创建模板 1.4 获取accessKey和accesssKeySecret 1.5 项目中引入依赖 <!--短信发送的依 ...
- 【阿里短信发送DEMO】阿里短信发送获取验证码
代码可以用,希望能帮到你 import io.seata.common.util.StringUtils; import io.swagger.annotations.Api; import io.s ...
- 阿里短信发送频率控制
1.阿里云上找到短信控制平台,找到短信服务 2.找到短信服务->系统设置->国内消息设置 3.国内消息设置->发送频率设置->设置频率,设置 完事
- SpringBoot项目实现短信发送接口开发
一. 短信接口实现 描述:请求第三方短信接口平台(而第三方短信平台的接口请求是webservice方式实现的),此时我们要测试接口是否通,要用的工具SoapUI测试工具, 不能用PostMan,即使用 ...
- 阿里大于短信发送调用
阿里大于使用文档 Sdk 所需sdk文件:taobao-sdk-java-auto_1455552377940-20160607.jar 下载地址:https://www.alidayu.com/ce ...
- XX健康:移动端开发-体检预约设计和实现微信公众号注册阿里短信服务
1. 移动端开发 1.1 移动端开发方式 随着移动互联网的兴起和手机的普及,目前移动端应用变得愈发重要,成为了各个商家的必争之地.例如,我们可以使用手机购物.支付.打车.玩游戏.订酒店.购票等,以前只 ...
最新文章
- C#截取屏幕保存图片
- php获取分辨率赋值,php如何获取客户端分辨率?实例教程
- javascript中not defined、undefined、null以及NaN的区别
- 红旗桌面版本最新运用要领和结果解答100例-3
- C语言log日志管理-支持文件与终端输出
- 分享微信朋友或朋友圈
- python安装pygame教程_pygame 安装教程
- 互联网数仓之:Lambda架构 vs Kappa架构
- 动态半透膜背景的热气球漂浮登陆界面 很赞
- 老版本 linux 浮点,Linux-浮点运算
- 开发一个App大概要多少钱?只讲干货
- oracle服务端下载(10g)
- hp微型计算机网线怎么安装,宽带师傅教你怎么安装网线插座 看完自己都会了!...
- 存款利息python题_c#入门之实现简易存款利息计算器示例
- 电脑W ndoWs在哪里,苹果电脑如何安装wndows系统.doc
- 用C++评选优秀教师和优秀学生
- 5G引爆IoT,阿里巴巴急行军
- 正点原子STM32F103精英版学习笔记(二)
- python处理gzip压缩的http数据 - XII - 博客大巴
- 基于WEB信息管理系统测试时应考虑的因素有哪些
热门文章
- 向下兼容性格什么意思_担心对方只是向下兼容,并不是从心底里接纳我怎么办?...
- 一套鼠标键盘控制多台电脑,无界鼠标 (Mouse without Borders)控制界面的功能翻译
- MATLAB的figure图像提取数据至excel中
- [解疑][TI]德州仪器Texas Instruments官网账号注册不了解决办法
- 【宝藏级】全网最全的Matplotlib详细教程-数据分析必备手册(4.5万字总结)
- Python语言在互联网企业应用上的十大谬误
- 【gitee代码图形化提交(小乌龟)】
- 拿不到大厂offer ?简历你就写错了!(另附面试官微信)
- 安装MSYS详细过程
- 机器学习(十):机器学习训练速度的提升技巧