改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实现阿里短信发送并查询状态相关推荐

  1. [JAVA]阿里短信发送(测试)

    阿里短信发送 1.进入阿里云官网 https://www.aliyun.com/?utm_content=se_1008364713 2.登录后点击控制台 3.搜索短信服务 4.选中快速学习,绑定测试 ...

  2. SpringBoot实现阿里短信SDK发送短信,使用MQ监听器

    先 创建sms短信微服务工程,有可能很多工程要使用我们创建的短信服务. 项目环境: SpringBoot SpringClould 步骤: config SmsConfiguration: /*** ...

  3. thinkphp5+阿里短信发送验证码

    一.申请阿里短信接口,开通服务,申请AccessKey ID和Access Key Secret 二.申请短信发送模板 三.在thinkphp5中的config文件中添加一下配置 //短信配置'SMS ...

  4. 阿里短信发送(跟着宝哥学java)

    1 短信发送 1.1 注册阿里云 1.2 查找短信服务:创建签名 1.3 创建模板 1.4 获取accessKey和accesssKeySecret 1.5 项目中引入依赖 <!--短信发送的依 ...

  5. 【阿里短信发送DEMO】阿里短信发送获取验证码

    代码可以用,希望能帮到你 import io.seata.common.util.StringUtils; import io.swagger.annotations.Api; import io.s ...

  6. 阿里短信发送频率控制

    1.阿里云上找到短信控制平台,找到短信服务 2.找到短信服务->系统设置->国内消息设置 3.国内消息设置->发送频率设置->设置频率,设置  完事

  7. SpringBoot项目实现短信发送接口开发

    一. 短信接口实现 描述:请求第三方短信接口平台(而第三方短信平台的接口请求是webservice方式实现的),此时我们要测试接口是否通,要用的工具SoapUI测试工具, 不能用PostMan,即使用 ...

  8. 阿里大于短信发送调用

    阿里大于使用文档 Sdk 所需sdk文件:taobao-sdk-java-auto_1455552377940-20160607.jar 下载地址:https://www.alidayu.com/ce ...

  9. XX健康:移动端开发-体检预约设计和实现微信公众号注册阿里短信服务

    1. 移动端开发 1.1 移动端开发方式 随着移动互联网的兴起和手机的普及,目前移动端应用变得愈发重要,成为了各个商家的必争之地.例如,我们可以使用手机购物.支付.打车.玩游戏.订酒店.购票等,以前只 ...

最新文章

  1. C#截取屏幕保存图片
  2. php获取分辨率赋值,php如何获取客户端分辨率?实例教程
  3. javascript中not defined、undefined、null以及NaN的区别
  4. 红旗桌面版本最新运用要领和结果解答100例-3
  5. C语言log日志管理-支持文件与终端输出
  6. 分享微信朋友或朋友圈
  7. python安装pygame教程_pygame 安装教程
  8. 互联网数仓之:Lambda架构 vs Kappa架构
  9. 动态半透膜背景的热气球漂浮登陆界面 很赞
  10. 老版本 linux 浮点,Linux-浮点运算
  11. 开发一个App大概要多少钱?只讲干货
  12. oracle服务端下载(10g)
  13. hp微型计算机网线怎么安装,宽带师傅教你怎么安装网线插座 看完自己都会了!...
  14. 存款利息python题_c#入门之实现简易存款利息计算器示例
  15. 电脑W ndoWs在哪里,苹果电脑如何安装wndows系统.doc
  16. 用C++评选优秀教师和优秀学生
  17. 5G引爆IoT,阿里巴巴急行军
  18. 正点原子STM32F103精英版学习笔记(二)
  19. python处理gzip压缩的http数据 - XII - 博客大巴
  20. 基于WEB信息管理系统测试时应考虑的因素有哪些

热门文章

  1. 向下兼容性格什么意思_担心对方只是向下兼容,并不是从心底里接纳我怎么办?...
  2. 一套鼠标键盘控制多台电脑,无界鼠标 (Mouse without Borders)控制界面的功能翻译
  3. MATLAB的figure图像提取数据至excel中
  4. [解疑][TI]德州仪器Texas Instruments官网账号注册不了解决办法
  5. 【宝藏级】全网最全的Matplotlib详细教程-数据分析必备手册(4.5万字总结)
  6. Python语言在互联网企业应用上的十大谬误
  7. 【gitee代码图形化提交(小乌龟)】
  8. 拿不到大厂offer ?简历你就写错了!(另附面试官微信)
  9. 安装MSYS详细过程
  10. 机器学习(十):机器学习训练速度的提升技巧