springboot 如何实现发送短信

在 Spring Boot 中实现发送短信通常借助第三方短信服务提供商,如阿里云短信服务、腾讯云短信服务、华为云短信服务等。下面以阿里云短信服务为例,详细介绍在 Spring Boot 项目中实现发送短信的步骤。

1. 开通阿里云短信服务并获取相关信息

  • 注册阿里云账号:如果还没有阿里云账号,需要先进行注册。
  • 开通短信服务:登录阿里云控制台,开通短信服务,并完成相关的配置,如签名、模板的申请和审核。
  • 获取 AccessKey:在阿里云控制台的 AccessKey 管理页面创建并获取 AccessKey ID 和 AccessKey Secret,这两个信息用于身份验证。

2. 添加依赖

在 pom.xml 中添加阿里云短信服务的 Java SDK 依赖:

收起

xml

<dependencies>
    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- 阿里云短信服务 SDK -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>dysmsapi20170525</artifactId>
        <version>2.0.22</version>
    </dependency>
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>tea-openapi</artifactId>
        <version>0.2.1</version>
    </dependency>
</dependencies>

3. 配置阿里云短信服务信息

在 application.properties 或 application.yml 中配置阿里云短信服务的相关信息:

收起

properties

aliyun.sms.access-key-id=your-access-key-id
aliyun.sms.access-key-secret=your-access-key-secret
aliyun.sms.sign-name=your-sign-name
aliyun.sms.template-code=your-template-code

将 your-access-key-idyour-access-key-secret 替换为你在阿里云获取的 AccessKey ID 和 AccessKey Secretyour-sign-name 替换为申请通过的短信签名,your-template-code 替换为申请通过的短信模板代码。

4. 创建短信发送工具类

创建一个工具类来封装短信发送的逻辑:

收起

java

import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.teaopenapi.models.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

@Component
public class SmsSender {

    @Value("${aliyun.sms.access-key-id}")
    private String accessKeyId;

    @Value("${aliyun.sms.access-key-secret}")
    private String accessKeySecret;

    @Value("${aliyun.sms.sign-name}")
    private String signName;

    @Value("${aliyun.sms.template-code}")
    private String templateCode;

    public boolean sendSms(String phoneNumber, Map<String, String> templateParams) {
        try {
            // 创建 Config 对象并设置 AccessKey ID 和 AccessKey Secret
            Config config = new Config()
                   .setAccessKeyId(accessKeyId)
                   .setAccessKeySecret(accessKeySecret);
            // 访问的域名
            config.endpoint = "dysmsapi.aliyuncs.com";
            // 创建短信服务客户端
            Client client = new Client(config);

            // 创建短信发送请求对象
            SendSmsRequest sendSmsRequest = new SendSmsRequest()
                   .setPhoneNumbers(phoneNumber)
                   .setSignName(signName)
                   .setTemplateCode(templateCode)
                   .setTemplateParam(com.alibaba.fastjson.JSON.toJSONString(templateParams));

            // 发送短信
            SendSmsResponse sendSmsResponse = client.sendSms(sendSmsRequest);

            // 判断短信是否发送成功
            return "OK".equals(sendSmsResponse.getBody().getCode());
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}

5. 创建控制器进行测试

创建一个控制器类,在其中调用短信发送工具类来发送短信:

收起

java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
public class SmsController {

    @Autowired
    private SmsSender smsSender;

    @GetMapping("/sendSms")
    public String sendSms(@RequestParam String phoneNumber) {
        // 假设短信模板中有一个参数 code 用于传递验证码
        Map<String, String> templateParams = new HashMap<>();
        templateParams.put("code", "123456");

        boolean result = smsSender.sendSms(phoneNumber, templateParams);
        if (result) {
            return "短信发送成功";
        } else {
            return "短信发送失败";
        }
    }
}

6. 测试短信发送功能

启动 Spring Boot 应用程序,访问 http://localhost:8080/sendSms?phoneNumber=your-phone-number,将 your-phone-number 替换为实际要接收短信的手机号码。如果一切配置正确,该手机号码将收到一条包含验证码的短信。

注意事项

  • 确保申请的短信签名和模板已通过审核,否则短信无法发送成功。
  • 不同的短信模板可能有不同的参数要求,需要根据实际情况修改 templateParams 中的参数。
  • 阿里云短信服务有一定的使用限制和费用,需要关注相关的使用规则和计费标准。
### Spring Boot 实现发送短信验证码 #### 创建发送短信的服务类 为了实现发送短信验证码,在Spring Boot项目中可以创建一个新的Java类用于处理发送逻辑。此服务类负责生成随机验证码并调用第三方API完成实际的消息传递操作[^1]。 ```java @Service public class SmsService { @Value("${aliyun.sms.templateCode}") private String templateCode; public void sendSms(String phoneNumber) { // Generate a random verification code (e.g., 6 digits) Random r = new Random(); StringBuilder sb = new StringBuilder(6); while(sb.length() < 6){ sb.append(r.nextInt(10)); } String verifyCode = sb.toString(); // Store the generated code into Redis with expiration time set to two minutes. redisTemplate.opsForValue().set(phoneNumber, verifyCode, 2, TimeUnit.MINUTES); // Call AliCloud SMS API here using the provided phone number and template code... System.out.println("Sending SMS: " + phoneNumber + ", Code:" + verifyCode); // For demonstration purposes only // Actual implementation would involve calling an external service like Alibaba Cloud's SDK or RESTful APIs. } } ``` 该`sendSms()`方法接受电话号码作为输入参数,生成六位数长度的随机字符串作为验证代码,并将其存储在Redis缓存中设置过期时间为两分钟。之后通过调用外部SMS网关(此处假设为阿里云),将消息发送给指定用户[^4]。 #### 注册 Bean 和配置文件 为了让上述组件能够被自动装配进应用程序上下文中,需确保其标记了适当注解(如上面例子中的 `@Service`)。另外还需要定义相应的属性值来填充这些bean实例所需的变量,比如阿里云短信模板ID等信息: ```yaml aliyun: sms: accessKeyId: YOUR_ACCESS_KEY_ID secretAccessKey: YOUR_SECRET_ACCESS_KEY signName: YourSignName templateCode: TEMPLATE_CODE ``` 以上YAML片段展示了部分可能需要配置的关键项;具体取决于所使用的SDK版本以及个人账户详情。 #### 构建控制器暴露HTTP端点 最后一步是在Web层面上构建REST Controller以公开对外接口供前端或其他微服务调用。这里展示了一个简单的GET请求处理器样例,它会触发一次新的验证码发送过程[^3]。 ```java @RestController @RequestMapping("/api/v1/sms") public class SmsController { @Autowired private SmsService smsService; @GetMapping("/{phoneNumber}") public ResponseEntity<?> sendVerificationCode(@PathVariable String phoneNumber) throws Exception{ try { Pattern pattern = Pattern.compile("^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\d{8}$"); Matcher matcher = pattern.matcher(phoneNumber); if (!matcher.matches()) throw new IllegalArgumentException("Invalid Phone Number"); smsService.sendSms(phoneNumber); return ResponseEntity.ok(Map.of("message", "Verification code sent successfully")); } catch(IllegalArgumentException e){ return ResponseEntity.badRequest().body(e.getMessage()); } } } ``` 这段代码实现了基本的身份验证流程控制——首先检查传入手机号是否合法,接着委托给之前提到过的业务逻辑去执行具体的动作。如果一切顺利,则返回成功响应;反之则给出相应提示说明失败原因。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lozhyf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值