集成SpringCloudAlibaba短信服务 短信验证码

1.1 SpringCloudAlibaba短信服务简介

短信服务(Short Message Service)是阿里云为用户提供的一种通信服务的能力。

  • 产品优势:覆盖全面、高并发处理、消息堆积处理、开发管理简单、智能监控调度

  • 产品功能:短信通知、短信验证码、推广短信、异步通知、数据统计

  • 应用场景:短信验证码、系统信息推送、推广短信等

SpringCloudAlibaba提供的短信服务,集成更加方便,代码更加简洁。

1.2 代码解析

1.2.1 基本配置与工具类封装

(1)我们这里使用了SpringCloudAlibaba中提供的短信服务

工程引入依赖

复制代码
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alicloud-sms</artifactId>
    <version>2.2.0.RELEASE</version>
</dependency>

(2)配置文件添加短信相关的配置,密钥的配置

复制代码
spring:
  cloud:
    alicloud:
      access-key: XXX
      secret-key: XXX

以及签名和模板号的配置(自定义)

复制代码
sms:
  operator:
    signName: xxx
    templateCode: xxx

(3)SmsConfig用于读取配置文件中的签名和模板编号

java 复制代码
package com.lkd.sms;
​
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
​
@Configuration
public class SmsConfig {
    @Value("${sms.operator.signName}")
    private String signName;
    @Value("${sms.operator.templateCode}")
    private String templateCode;
​
    public String getSignName() {
        return signName;
    }
​
    public String getTemplateCode() {
        return templateCode;
    }
}

(4)SmsSender用于封装发送短信的方法

java 复制代码
package com.lkd.sms;
​
import com.alibaba.alicloud.sms.ISmsService;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
​
@Component
@Slf4j
public class SmsSender {
    @Autowired
    private SmsConfig smsConfig;
    @Autowired
    private ISmsService smsService;
​
    /**
     *  发送验证码短信
     * @param telphone 手机号
     * @param code 手机验证码
     */
    public void sendMsg(String telphone,String code){
        // 组装请求对象-具体描述见控制台-文档部分内容
        SendSmsRequest request = new SendSmsRequest();
​
        // 必填:待发送手机号
        request.setPhoneNumbers(telphone);
        // 必填:短信签名-可在短信控制台中找到
        request.setSignName(smsConfig.getSignName());
        // 必填:短信模板-可在短信控制台中找到
        request.setTemplateCode(smsConfig.getTemplateCode());
        // 可选:模板中的变量替换JSON串,如模板内容为"【企业级分布式应用服务】,您的验证码为${code}"时,此处的值为
        ObjectMapper mapper = new ObjectMapper();
        JsonNode rootNode = mapper.createObjectNode();
        ((ObjectNode)rootNode).put("code",code);
        try {
 request.setTemplateParam(mapper.writeValueAsString(rootNode));//{"code":code}
            smsService.sendSmsRequest(request);
        }
        catch (Exception e) {
            log.error("send sms error.",e);
        }
    }
}

在需要发送短信的地方,直接引入SmsSender即可

1.2.2 发送短信验证码

(1)发送短信验证码, UserService定义方法

java 复制代码
/**
 * 发送验证码
 * @param mobile
 */
void sendCode(String mobile);

UserServiceImpl实现方法

java 复制代码
@Autowired
private SmsSender smsSender;
​
@Override
public void sendCode(String mobile){
    if(Strings.isNullOrEmpty(mobile)) return;
    LambdaQueryWrapper<UserEntity> wrapper = new LambdaQueryWrapper<>();
    wrapper
            .eq(UserEntity::getMobile,mobile);
    if(this.count(wrapper)<=0) return;
    
    if(redisTemplate.opsForValue().get(mobile) != null) return;
    //生成5位验证码
    StringBuilder sbCode = new StringBuilder();
    Stream
            .generate( ()-> new Random().nextInt(10))
            .limit(5)
            .forEach(x-> sbCode.append(x));
    redisTemplate.opsForValue().set(mobile,sbCode.toString(), Duration.ofMinutes(5));
    smsSender.sendMsg(mobile,sbCode.toString());
}

(2)UserController新增方法

java 复制代码
/**
 * 生成登录手机验证码
 * @param mobile
 */
@GetMapping("/code/{mobile}")
public void generateCode(@PathVariable String mobile){
    userService.sendCode(mobile);
}
相关推荐
柯南二号1 小时前
【Java后端】Spring Boot 集成 MyBatis-Plus 全攻略
java·spring boot·mybatis
桦说编程8 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
lifallen8 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研8 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
没有bug.的程序员9 小时前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
甄超锋9 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
阿华的代码王国10 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Zyy~10 小时前
《设计模式》装饰模式
java·设计模式
A尘埃10 小时前
企业级Java项目和大模型结合场景(智能客服系统:电商、金融、政务、企业)
java·金融·政务·智能客服系统
青云交10 小时前
Java 大视界 -- 基于 Java 的大数据可视化在城市交通拥堵治理与出行效率提升中的应用(398)
java·大数据·flink·大数据可视化·拥堵预测·城市交通治理·实时热力图