SpringBoot集成阿里云短信服务

  • 1、准备工作
  • 2、项目集成
    • 2.1 添加依赖
    • 2.2 配置文件
    • 2.3 业务逻辑实现

在实际项目中经常有发送短信的功能,今天进说一下对接阿里云短信服务实现短信发送、查询功能。

1、准备工作

阿里云链接:https://www.aliyun.com/
点击控制台-产品与服务-云通信-短信服务
需要创建AccessKey(云账号AccessKey是您访问阿里云API的密钥)如果有则不用创建
如下图所示:

然后需要创建短信签名与短信模板,可以根据阿里云短信服务介绍自己创建,这里不再描述。创建成功需要工作人员进行审核,时间大约在两个小时,请耐心等待

2、项目集成

2.1 添加依赖

创建SpringBoot项目,在pom.xml文件中添加以下依赖:

         <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><!--阿里云的短信服务SDK start--><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.0.6</version></dependency><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-dysmsapi</artifactId><version>1.1.0</version></dependency><!--阿里云的短信服务SDK end--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.31</version></dependency>

2.2 配置文件

需要在application.properties配置文件中添加阿里云短信服务的参数信息

#--------阿里云短信配置参数 start--------------#
#阿里云 accessKeyId(安全信息管理下面)
aliyun.sms.accessKeyId=*******
#阿里云 accessKeySecret(安全信息管理下面)
aliyun.sms.accessKeySecret=********
#产品名称:云通信短信API产品,开发者无需替换
aliyun.sms.product=Dysmsapi
#产品域名,开发者无需替换
aliyun.sms.domain=dysmsapi.aliyuncs.com
aliyun.sms.regionId=cn-hangzhou
#短信签名名称(国内/国际/港澳台消息-签名管理下面)
aliyun.sms.signName=****
#发送日期 支持30天内记录查询,格式yyyyMMdd
aliyun.sms.dateFormat=yyyyMMdd
#服务结点
aliyun.sms.endpointName=cn-hangzhou
#--------阿里云短信配置参数 end--------------#

创建阿里云短信服务配置类AliyunSMSConfig,代码如下:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;/*** @Author: LX 17839193044@162.com* @Description: 阿里短信服务配置类* @Date: 2019/4/18 15:26* @Version: V1.0*/
@Component
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties(prefix = "aliyun.sms")
public class AliyunSMSConfig {/*** 阿里云 accessKeyId(安全信息管理下面)*/private String accessKeyId;/*** 阿里云 accessKeySecret(安全信息管理下面)*/private String accessKeySecret;/*** 产品名称:云通信短信API产品,开发者无需替换*/private String product;/*** 产品域名,开发者无需替换*/private String domain;private String regionId;/*** 短信签名名称(国内/国际/港澳台消息-签名管理下面)*/private String signName;/*** 发送日期 支持30天内记录查询,格式yyyyMMdd*/private String dateFormat;/*** 服务结点*/private String endpointName;}

2.3 业务逻辑实现

创建发送短信实体Sms

import lombok.Data;
import lombok.ToString;/*** @Author: LX 17839193044@162.com* @Description: 发送短信实体* @Date: 15:42 2019/4/18* @Version: V1.0*/
@Data
@ToString
public class Sms {/*** 手机号*/private String phoneNumbers;/*** 模板参数 格式:"{\"code\":\"123456\"}"*/private String templateParam;private String outId;/*** 阿里云模板管理code*/private String templateCode;
}

创建短信查询实体SmsQuery

import lombok.Data;
import lombok.ToString;import java.util.Date;/*** @Author: LX 17839193044@162.com* @Description: 短信查询实体* @Date: 15:51 2019/4/18* @Version: V1.0*/
@Data
@ToString
public class SmsQuery {private String bizId;private String phoneNumber;private Date sendDate;private Long pageSize;private Long currentPage;
}

发送短信service接口代码AliyunSmsSenderService如下:

import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;/*** @Author: LX 17839193044@162.com* @Description: 阿里云短信发送service* @Date: 17:31 2019/4/18* @Version: V1.0*/
public interface AliyunSmsSenderService {/*** @param phoneNumbers:      手机号* @param templateParamJson: 模板参数json {"sellerName":"123456","orderSn":"123456"}* @param templateCode:      阿里云短信模板code* @Author: LX 17839193044@162.com* @Description: 对接阿里云短信服务实现短信发送* 发送验证码类的短信时,每个号码每分钟最多发送一次,每个小时最多发送5次。其它类短信频控请参考阿里云* @Date: 2019/4/18 16:35* @Version: V1.0*/SendSmsResponse sendSms(String phoneNumbers, String templateParamJson, String templateCode);/*** @param bizId:       短信对象的对应的bizId* @param phoneNumber: 手机号* @param pageSize:    分页大小* @param currentPage: 当前页码* @Author: LX 17839193044@162.com* @Description: 查询发送短信的内容* @Date: 2019/4/18 16:52* @Version: V1.0*/QuerySendDetailsResponse querySendDetails(String bizId, String phoneNumber, Long pageSize, Long currentPage);
}

发送短信service实现类代码AliyunSmsSenderServiceImpl如下:

import cn.thislx.aliyunsms.config.AliyunSMSConfig;
import cn.thislx.aliyunsms.entry.Sms;
import cn.thislx.aliyunsms.entry.SmsQuery;
import cn.thislx.aliyunsms.service.AliyunSmsSenderService;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;/*** @Author: LX 17839193044@162.com* @Description: 发送短信封装服务实现类* @Date: 2019/4/18 15:36* @Version: V1.0*/
@Slf4j
@Service
public class AliyunSmsSenderServiceImpl implements AliyunSmsSenderService {@Resourceprivate AliyunSMSConfig smsConfig;/*** @param phoneNumbers:      手机号* @param templateParamJson: 模板参数json {"sellerName":"123456","orderSn":"123456"}* @param templateCode:      阿里云短信模板code* @Author: LX 17839193044@162.com* @Description: 对接阿里云短信服务实现短信发送* 发送验证码类的短信时,每个号码每分钟最多发送一次,每个小时最多发送5次。其它类短信频控请参考阿里云* @Date: 2019/4/18 16:35* @Version: V1.0*/@Overridepublic SendSmsResponse  sendSms(String phoneNumbers, String templateParamJson, String templateCode) {// 封装短信发送对象Sms sms = new Sms();sms.setPhoneNumbers(phoneNumbers);sms.setTemplateParam(templateParamJson);sms.setTemplateCode(templateCode);// 获取短信发送服务机IAcsClient acsClient = getClient();//获取短信请求SendSmsRequest request = getSmsRequest(sms);SendSmsResponse sendSmsResponse = new SendSmsResponse();try {sendSmsResponse = acsClient.getAcsResponse(request);} catch (ClientException e) {log.error("发送短信发生错误。错误代码是 [{}],错误消息是 [{}],错误请求ID是 [{}],错误Msg是 [{}],错误类型是 [{}]",e.getErrCode(),e.getMessage(),e.getRequestId(),e.getErrMsg(),e.getErrorType());}return sendSmsResponse;}/*** @param bizId:       短信对象的对应的bizId* @param phoneNumber: 手机号* @param pageSize:    分页大小* @param currentPage: 当前页码* @Author: LX 17839193044@162.com* @Description: 查询发送短信的内容* @Date: 2019/4/18 16:52* @Version: V1.0*/@Overridepublic QuerySendDetailsResponse querySendDetails(String bizId, String phoneNumber, Long pageSize, Long currentPage) {// 查询实体封装SmsQuery smsQuery = new SmsQuery();smsQuery.setBizId(bizId);smsQuery.setPhoneNumber(phoneNumber);smsQuery.setCurrentPage(currentPage);smsQuery.setPageSize(pageSize);smsQuery.setSendDate(new Date());// 获取短信发送服务机IAcsClient acsClient = getClient();QuerySendDetailsRequest request = getSmsQueryRequest(smsQuery);QuerySendDetailsResponse querySendDetailsResponse = null;try {querySendDetailsResponse = acsClient.getAcsResponse(request);} catch (ClientException e) {log.error("查询发送短信发生错误。错误代码是 [{}],错误消息是 [{}],错误请求ID是 [{}],错误Msg是 [{}],错误类型是 [{}]",e.getErrCode(),e.getMessage(),e.getRequestId(),e.getErrMsg(),e.getErrorType());}return querySendDetailsResponse;}/*** @param smsQuery:* @Author: LX 17839193044@162.com* @Description: 封装查询阿里云短信请求对象* @Date: 2019/4/18 16:51* @Version: V1.0*/private QuerySendDetailsRequest getSmsQueryRequest(SmsQuery smsQuery) {QuerySendDetailsRequest request = new QuerySendDetailsRequest();request.setPhoneNumber(smsQuery.getPhoneNumber());request.setBizId(smsQuery.getBizId());SimpleDateFormat ft = new SimpleDateFormat(smsConfig.getDateFormat());request.setSendDate(ft.format(smsQuery.getSendDate()));request.setPageSize(smsQuery.getPageSize());request.setCurrentPage(smsQuery.getCurrentPage());return request;}/*** @param sms: 短信发送实体* @Author: LX 17839193044@162.com* @Description: 获取短信请求* @Date: 2019/4/18 16:40* @Version: V1.0*/private SendSmsRequest getSmsRequest(Sms sms) {SendSmsRequest request = new SendSmsRequest();request.setPhoneNumbers(sms.getPhoneNumbers());request.setSignName(smsConfig.getSignName());request.setTemplateCode(sms.getTemplateCode());request.setTemplateParam(sms.getTemplateParam());request.setOutId(sms.getOutId());return request;}/*** @Author: LX 17839193044@162.com* @Description: 获取短信发送服务机* @Date: 2019/4/18 16:38* @Version: V1.0*/private IAcsClient getClient() {IClientProfile profile = DefaultProfile.getProfile(smsConfig.getRegionId(),smsConfig.getAccessKeyId(),smsConfig.getAccessKeySecret());try {DefaultProfile.addEndpoint(smsConfig.getEndpointName(),smsConfig.getRegionId(),smsConfig.getProduct(),smsConfig.getDomain());} catch (ClientException e) {log.error("获取短信发送服务机发生错误。错误代码是 [{}],错误消息是 [{}],错误请求ID是 [{}],错误Msg是 [{}],错误类型是 [{}]",e.getErrCode(),e.getMessage(),e.getRequestId(),e.getErrMsg(),e.getErrorType());}return new DefaultAcsClient(profile);}
}

测试controller代码如下:

import cn.thislx.aliyunsms.service.impl.AliyunSmsSenderServiceImpl;
import com.alibaba.fastjson.JSON;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;/*** @Author: LX 17839193044@162.com* @Description: 测试发送短信controller* @Date: 14:00 2019/4/18* @Version: V1.0*/
@RestController
public class TestController {@Autowiredprivate AliyunSmsSenderServiceImpl aliyunSmsSenderServiceImpl;/*** @Author: LX 17839193044@162.com* @Description: 短信发送* @Date: 2019/4/18 16:08* @Version: V1.0*/@GetMapping("/sms")@ResponseBodypublic String sms() {Map<String, String> map = new HashMap<>();map.put("sellerName", "平台自营");map.put("orderSn", "P2019041895451");SendSmsResponse sendSmsResponse = aliyunSmsSenderServiceImpl.sendSms("此处填写手机号",JSON.toJSONString(map),"此处填写短信模板code");return JSON.toJSONString(sendSmsResponse);}/*** @Author: LX 17839193044@162.com* @Description: 短信查询* @Date: 2019/4/18 16:08* @Version: V1.0*/@GetMapping("/query")@ResponseBodypublic String query() {QuerySendDetailsResponse querySendDetailsResponse = aliyunSmsSenderServiceImpl.querySendDetails("此处填写发送短信返回的bizId","此处填写手机号", 10L, 1L);return JSON.toJSONString(querySendDetailsResponse);}
}

启动项目访问 http://ip:端口/sms 即刻进行短信发送测试。

上述是使用配置文件配置的服务类,还可以封装为工具类,(推荐使用上面的方法)代码如下:

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;import java.text.SimpleDateFormat;
import java.util.Date;/*** @Author: LX 17839193044@162.com* @Description: 短信发送工具类* @Date: 2019/4/18 17:35* @Version: V1.0*/
public class SmsUtils {//产品名称:云通信短信API产品,开发者无需替换static final String product = "Dysmsapi";//产品域名,开发者无需替换static final String domain = "dysmsapi.aliyuncs.com";static final String accessKeyId = "*****";static final String accessKeySecret = "*****";public static SendSmsResponse sendSms() throws ClientException {//可自助调整超时时间System.setProperty("sun.net.client.defaultConnectTimeout", "10000");System.setProperty("sun.net.client.defaultReadTimeout", "10000");//初始化acsClient,暂不支持region化IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);IAcsClient acsClient = new DefaultAcsClient(profile);//组装请求对象-具体描述见控制台-文档部分内容SendSmsRequest request = new SendSmsRequest();//必填:待发送手机号request.setPhoneNumbers("*****");//必填:短信签名-可在短信控制台中找到request.setSignName("******");//必填:短信模板-可在短信控制台中找到request.setTemplateCode("*****");//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"request.setTemplateParam("{\"code\":\"123456\"}");//选填-上行短信扩展码(无特殊需求用户请忽略此字段)//request.setSmsUpExtendCode("90997");//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者// request.setOutId("yourOutId");//hint 此处可能会抛出异常,注意catchSendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);return sendSmsResponse;}/*** @param bizId: 短信对应的bizId* @Author: LX 17839193044@162.com* @Description: 查询短信详情* @Date: 2019/4/18 17:35* @Version: V1.0*/public static QuerySendDetailsResponse querySendDetails(String bizId) throws ClientException {//可自助调整超时时间System.setProperty("sun.net.client.defaultConnectTimeout", "10000");System.setProperty("sun.net.client.defaultReadTimeout", "10000");//初始化acsClient,暂不支持region化IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);IAcsClient acsClient = new DefaultAcsClient(profile);//组装请求对象QuerySendDetailsRequest request = new QuerySendDetailsRequest();//必填-号码request.setPhoneNumber("15197447018");//可选-流水号request.setBizId(bizId);//必填-发送日期 支持30天内记录查询,格式yyyyMMddSimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd");request.setSendDate(ft.format(new Date()));//必填-页大小request.setPageSize(10L);//必填-当前页码从1开始计数request.setCurrentPage(1L);//hint 此处可能会抛出异常,注意catchQuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);return querySendDetailsResponse;}public static void main(String[] args) throws ClientException, InterruptedException {//发短信SendSmsResponse response = sendSms();System.out.println("短信接口返回的数据----------------");System.out.println("Code=" + response.getCode());System.out.println("Message=" + response.getMessage());System.out.println("RequestId=" + response.getRequestId());System.out.println("BizId=" + response.getBizId());// 对接上面的,如果这里不等待,直接查询,会查到一个空的结果Thread.sleep(3000L);//查明细if (response.getCode() != null && response.getCode().equals("OK")) {QuerySendDetailsResponse querySendDetailsResponse = querySendDetails(response.getBizId());System.out.println("短信明细查询接口返回数据----------------");System.out.println("Code=" + querySendDetailsResponse.getCode());System.out.println("Message=" + querySendDetailsResponse.getMessage());int i = 0;for (QuerySendDetailsResponse.SmsSendDetailDTO smsSendDetailDTO : querySendDetailsResponse.getSmsSendDetailDTOs()) {System.out.println("SmsSendDetailDTO[" + i + "]:");System.out.println("Content=" + smsSendDetailDTO.getContent());System.out.println("ErrCode=" + smsSendDetailDTO.getErrCode());System.out.println("OutId=" + smsSendDetailDTO.getOutId());System.out.println("PhoneNum=" + smsSendDetailDTO.getPhoneNum());System.out.println("ReceiveDate=" + smsSendDetailDTO.getReceiveDate());System.out.println("SendDate=" + smsSendDetailDTO.getSendDate());System.out.println("SendStatus=" + smsSendDetailDTO.getSendStatus());System.out.println("Template=" + smsSendDetailDTO.getTemplateCode());}System.out.println("TotalCount=" + querySendDetailsResponse.getTotalCount());System.out.println("RequestId=" + querySendDetailsResponse.getRequestId());}}
}

到此项目已经完成集成阿里云短信服务,大家有什么问题可以在下方留言,感谢阅读

SpringBoot集成阿里云短信服务相关推荐

  1. springboot集成阿里云短信服务,实现发送短信功能

    springboot集成阿里云短信服务,实现发送短信功能 准备工作: 1.登陆阿里云->进入控制台->开通短信服务(进入后根据提示开通) 2.充值(借人家平台发短信你以为不要钱的?我充了3 ...

  2. SpringBoot集成阿里云短信服务实现登录注册(超详细)

    本篇博客采用得技术为:springboot + redis + aliyun短信验证 redis我用来做短信校验,首先我们先刨除redis部分做一个发送功能 登录你得阿里云账号 1 -> 控制台 ...

  3. SpringBoot整合阿里云短信服务详细过程(保证初学者也能实现)

    前言 网上关于实操性的文章普遍大部分都记录不全,要么只记录重点部分,对于刚学习的小伙伴来说看起来是比较困难的 所以,基于这一点. 该文章会详细介绍使用SpringBoot整合阿里云短信服务的每一步过程 ...

  4. Springboot整合阿里云短信服务

    目录 一.阿里云短信配置 1.开通短信服务​ 2. 申请模板 3.申请签名 二.springboot中集成阿里云短信服务 0.pom中引入依赖 1.配置application.properties 2 ...

  5. Java常用工具类-发短信(集成阿里云短信服务)

    1.注册阿里账号并开通短信服务 注册阿里账号后,并进行个人或企业实名认证,实名认证后,才能开通短信服务. 界面如下: 2.获取AccessKey 参考获取AccessKey方法 创建成功后,如下图: ...

  6. SpringBoot实现阿里云短信服务

    阿里云短信服务 了解阿里云用户权限 准备工作 开启子用户 新建一个用户组 创建用户并添加进用户组 开启阿里云短信服务 添加模板 添加签名 编写代码测试 新建项目 导入依赖 编写测试代码 开启redis ...

  7. springboot+springsecurity+阿里云短信服务验证实现注册登录

    使用springboot+security+Aliyun短信服务实现注册登录 为了实现个人博客部分的登录注册,我采用了阿里云短信服务发送验证码,后端比对验证码的方式完成注册,现在功能还不完全,以后这个 ...

  8. Java 集成阿里云短信服务实现通过手机号码找回密码功能

    A. 概述 首先明确一下目标:做一个通过手机验证找回(修改)账户密码的功能,例如: 流程大致如下: 1)用户输入手机号码 2)点击获取验证码(这时候前端有一些任务,如验证手机号格式,时间倒计时,按钮状 ...

  9. Java SpringBoot集成阿里云短信与邮件服务

    1.pom.xml导入jar包 <!--阿里云短信 --><dependency><groupId>com.aliyun</groupId><ar ...

最新文章

  1. 第十六届全国大学生智能车竞赛华南赛区竞赛事宜的通知
  2. 一个非常超级可爱的滚动到顶端(Back to top)的jQuery插件- jQuery Back to Top
  3. 大量执行OSS PutObject时卡住的问题排查
  4. 使用log4j2免费分配日志记录
  5. jdk w7环境变量配置
  6. linux下双击sh文件夹,Linux系统下如何运行.sh文件的实现
  7. markdown语法中的空格_Markdown实用技巧-基础语法
  8. vscode中终端字体设置
  9. IDEA放大和缩小代码字体的快捷键设置
  10. 用Dezender解密zend加密后的php代码
  11. 如何获取瘦人肠道菌群_瘦人想要长胖,调节肠道菌群很重要
  12. c++ 控制台游戏打砖块
  13. 云控系统搭建需要那个运行商网线
  14. jQuery API .append()
  15. 企查查接口php版本~
  16. 42岁,王兴的兄弟退休了
  17. ChatGPT:开启智能对话的未来
  18. [CDLinux]制作U盘CDLinux系统启动盘
  19. 【详细!!】计算机类书籍整理
  20. composer 安装配置下载时出现 [InvalidArgumentException] Could not find package等等问题解决方案

热门文章

  1. Python学习--Machine-Learning 吴恩达机器学习编程作业 (第六周)
  2. 在Ubuntu下安装Samba文件服务器(译)
  3. 黑泽明 之 生之欲;
  4. c语言程序设计 长春大学,“C语言程序设计”双语教学改革研究.pdf
  5. macbook修改mac地址
  6. iphone扫描文档jpg_如何将名片扫描到iPhone的联系人列表中
  7. 源码方式安装 netconf 开源工具 ncclient 及其基本使用步骤
  8. 计算机房的英语怎么拼读,RGS是什么意思
  9. MT8788 android 9.0 gsensor导致预览与拍出来的照片方向不一致
  10. uniapp实现自适应手机状态栏高度的顶部导航栏