SpringBoot整合阿里云短信

本文涉及的产品
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 2GB
简介: SpringBoot整合阿里云短信

前置条件

1.创建SpringBoot应用

2.创建短信服务


引入依赖

引入阿里云服务

<!-- aliyun 短信 --><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>

application.yml 配置文件

# 短信配置
ly:
  sms:
    accessKeyId: xxxx
    accessKeySecret: xxxxx
    signName: xx商城
    verifyTemplateCode: SMS_1xxxx # 短信模板名称


编写短信工具

@Slf4j@Component@EnableConfigurationProperties(SmsConfig.class)
publicclassSmsUtils {
@AutowiredprivateSmsConfigsmsConfig;
@AutowiredprivateStringRedisTemplateredisTemplate;
//短信API产品名称(短信产品名固定,无需修改)privatefinalStringproduct="Dysmsapi";
//短信API产品域名(接口地址固定,无需修改)privatefinalStringdomain="dysmsapi.aliyuncs.com";
//发送短信最小间隔(分钟)privatestaticfinalLongSMS_MIN_INTERVAL_MINUTE=60000L;
//短信手机号保存到 Redis 中的前缀privatestaticfinalStringSMS_PER="sms:phone:";
/*** 发送短信* @param phoneNumber       手机号码* @param signName          短信签名* @param templateCode      短信模板code* @param templateParam     短信模板参数* @return  SendSmsResponse 响应体* @throws ClientException*/publicSendSmsResponsesendSms(StringphoneNumber, StringsignName, StringtemplateCode, StringtemplateParam) {
// 限流,限制1分钟内不能重复发送短信StringverifyTimeStr=redisTemplate.opsForValue().get(phoneNumber);
if (StringUtils.isNotBlank(verifyTimeStr)){
LongverifyTime=Long.valueOf(verifyTimeStr);
if (System.currentTimeMillis() -verifyTime<SMS_MIN_INTERVAL_MINUTE){
returnnull;
            }
        }
try{
//设置超时时间-可自行调整System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//初始化ascClient,暂时不支持多region(请勿修改)IClientProfileprofile=DefaultProfile.getProfile("cn-hangzhou",
smsConfig.getAccessKeyId(), smsConfig.getAccessKeySecret());
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClientacsClient=newDefaultAcsClient(profile);
//组装请求对象SendSmsRequestrequest=newSendSmsRequest();
//使用post提交request.setMethod(MethodType.POST);
//必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式;发送国际/港澳台消息时,接收号码格式为国际区号+号码,如“85200000000”request.setPhoneNumbers(phoneNumber);
//必填:短信签名-可在短信控制台中找到request.setSignName(signName);
//必填:短信模板-可在短信控制台中找到,发送国际/港澳台消息时,请使用国际/港澳台短信模版request.setTemplateCode(templateCode);
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为//友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败request.setTemplateParam(templateParam);
//请求失败这里会抛ClientException异常SendSmsResponseresponse=acsClient.getAcsResponse(request);
if (!StringUtils.equals("OK", response.getCode())){
log.info("[短信服务] 发送短息失败,手机号码:{} ,原因:{}", phoneNumber, response.getMessage());
            }
// 发送短信成功,写入redis,设置生存时间为1分钟redisTemplate.opsForValue().set(SMS_PER+phoneNumber, String.valueOf(System.currentTimeMillis()), 1, TimeUnit.MINUTES);
returnresponse;
        }catch (Exceptione){
log.error("[短信服务] 发送短息异常,手机号码:{}", phoneNumber, e);
returnnull;
        }
    }
}


编写消息监听器

/*** 短信MQ监听器*/@Component@EnableConfigurationProperties(SmsConfig.class)
publicclassSmsListener {
@AutowiredprivateSmsUtilssmsUtils;
@AutowiredprivateSmsConfigsmsConfig;
@RabbitListener(bindings=@QueueBinding(
value=@Queue(value="sms.verify.code.queue", durable="true"),
exchange=@Exchange(value="ly.sms.exchange", type=ExchangeTypes.TOPIC),
key="sms.verify.code"    ))
publicvoidlistenerVerifyCode(Map<String, Object>map) {
System.out.println("listenerVerifyCode");
StringphoneNumber= (String) map.remove("phoneNumber");
if (StringUtils.isBlank(phoneNumber)){
return;
        }
smsUtils.sendSms(phoneNumber, smsConfig.getSignName(),
smsConfig.getVerifyTemplateCode(),
JsonUtils.serialize(map));
    }
}


单元测试

@RunWith(SpringRunner.class)
@SpringBootTestpublicclassSmsListenerTest {
@ResourceprivateAmqpTemplateamqpTemplate;
/*** 测试短信验证码*/@TestpublicvoidlistenerVerifyCode() throwsInterruptedException {
Map<String, Object>msg=newHashMap<>();
msg.put("phoneNumber", "13542898491");
msg.put("code", "0754");
amqpTemplate.convertAndSend("ly.sms.exchange", "sms.verify.code", msg);
Thread.sleep(10000);
    }
}
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
3月前
|
Java
dockerfile打包阿里云镜像 springboot实战项目(阿里云镜像仓失败 处理)
dockerfile打包阿里云镜像 springboot实战项目(阿里云镜像仓失败 处理)
|
9月前
|
Java
阿里云镜像快速构建springboot
阿里云镜像快速构建springboot
813 0
|
3月前
|
存储 Java 对象存储
springboot配置阿里云OSS存储实现文件上传下载功能
【1月更文挑战第1天】springboot配置阿里云OSS存储实现文件上传下载功能
1495 2
|
弹性计算 Java Linux
手把手教你把Springboot项目部署到阿里云教程
手把手教你把Springboot项目部署到阿里云教程成功连接远程云服务器和配置阿里云安全组
1343 1
|
3月前
|
Cloud Native Java 关系型数据库
【阿里云云原生专栏】构建云原生应用:基于Spring Boot与阿里云服务的全栈指南
【5月更文挑战第21天】构建云原生应用是企业数字化转型的关键,本文提供了一份基于Spring Boot和阿里云的全栈指南。涵盖从阿里云账号注册、ECS与Docker搭建,到Spring Boot项目创建、业务代码编写和部署。此外,还介绍了如何集成阿里云OSS存储、RDS数据库服务以及ACK容器服务,助力打造高效、可扩展和易管理的云原生应用。
218 3
|
3月前
|
Java 开发工具 对象存储
SpringBoot项目中使用阿里云Oss上传文件
SpringBoot项目中使用阿里云Oss上传文件
565 1
|
3月前
|
Java 关系型数据库 MySQL
保姆级教程——将springboot项目部署到阿里云服务器包含环境配置(小白包会)
本文档详细介绍了将SpringBoot项目部署到阿里云服务器的步骤。首先,通过Xshell连接服务器,使用公网IP地址。接着,下载JDK的Linux版本,使用XFTP上传并解压,配置环境变量。然后,安装MySQL 5.7,包括下载YUM源、安装、启动服务以及修改root密码和开启远程访问。最后,将SpringBoot项目打包成jar,上传至服务器,使用`java -jar`命令运行,通过`nohup`确保服务持续运行。配置安全组以允许远程访问。
489 0
|
3月前
|
算法 Java 开发工具
使用阿里云KMS产品针对 Springboot 接口参数加密解密功能
针对Springboot里面使用开源工具使用加解密,替换成阿里云KMS产品进行加解密;
656 2
|
3月前
|
对象存储
阿里云oss-cloud-sdk-springboot3兼容问题
阿里云oss-cloud-sdk-springboot3兼容问题
157 0
|
3月前
|
Java Maven
(短信服务)java SpringBoot 阿里云短信功能实现发送手机验证码
(短信服务)java SpringBoot 阿里云短信功能实现发送手机验证码
1076 0