SpringBoot整合阿里云短信

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 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
目录
相关文章
|
6月前
|
云安全 安全 API
阿里云——OpenAPI使用——短信服务
阿里云——OpenAPI使用——短信服务
312 0
|
2月前
|
数据采集 监控 安全
阿里云短信服务+图形认证,有效降低验证码盗刷概率
阿里云短信服务+图形认证服务,有效降低验证码盗刷概率。
244 3
阿里云短信服务+图形认证,有效降低验证码盗刷概率
|
5月前
|
存储 小程序 前端开发
【微信小程序 - 工作实战分享】1.微信小程序发送手机短信验证码(阿里云)
【微信小程序 - 工作实战分享】1.微信小程序发送手机短信验证码(阿里云)
475 0
|
2月前
|
存储 NoSQL Java
|
3月前
|
数据采集 存储 监控
99%成功率背后:阿里云短信服务有何优势?
为什么短信会发送失败,如何提高短信发送成功率,本文将为您介绍短信发送成功率和阿里云短信服务如何保障企业短信稳定送达等相关知识。
187 1
99%成功率背后:阿里云短信服务有何优势?
|
3月前
|
存储 安全 网络安全
|
4月前
|
开发框架 前端开发 JavaScript
ABP框架中短信发送处理,包括阿里云短信和普通短信商的短信发送集成
ABP框架中短信发送处理,包括阿里云短信和普通短信商的短信发送集成
ABP框架中短信发送处理,包括阿里云短信和普通短信商的短信发送集成
|
3月前
|
小程序
阿里云短信签名申请流程,有图,短信接入新手教程
阿里云短信签名是短信中的标识信息,如【阿里云】,用于表明发送方身份。申请流程简便:登录阿里云短信服务控制台,选择签名管理并添加签名,填写相关信息。审核通常2小时内完成。个人用户每日限申请一个通用签名,企业用户数量不限。已通过审核的签名不可更改名称,仅能调整其他信息并重新提交审核。更多详情及FAQ
|
3月前
|
小程序
阿里云短信签名申请流程,手动整理(附短信签名问题解答)
阿里云短信签名是短信中的标识信息,如【阿里云】,用于表明发送方身份。申请流程简便:登录阿里云短信服务控制台,选择国内消息下的签名管理并添加签名,按指引填写表单。审核通常2小时内完成。个人用户每日限申请一个通用签名,企业用户数量不限。签名审核需确保业务主体一致,已通过审核的签名不可改名,仅能调整其它信息并重新审核。特定情况下需上传授权委托书,且签名需关联已备案网站。
356 1
|
5月前
|
PHP 开发工具
tp5调用阿里云短信接口
tp5调用阿里云短信接口
223 0