SpringBoot整合阿里云短信服务的案例代码

 更新时间:2024年06月12日 09:55:46   作者:柚几哥哥  
这篇文章主要介绍了SpringBoot整合阿里云短信服务的案例代码,在Spring Boot项目的pom.xml文件中添加阿里云短信服务SDK的依赖,本文通过示例代码给大家介绍的非常详细,需要的朋友参考下吧

1. 准备工作

  • 注册阿里云账号:首先确保你有一个阿里云账号,并且已经开通了短信服务。
  • 获取AccessKey ID和AccessKey Secret:在阿里云控制台的安全管理页面创建AccessKey,这是访问阿里云API的凭证。
  • 申请短信签名和模板:在阿里云短信服务控制台申请短信签名和短信模板,签名用于标识发送者的身份,模板用于定义短信内容,需要审核通过才能使用。

2. 添加依赖

在Spring Boot项目的pom.xml文件中添加阿里云短信服务SDK的依赖。例如:

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.6.0</version>
</dependency>
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
    <version>2.1.0</version>
</dependency>

3. 配置阿里云短信服务

application.ymlapplication.properties中配置AccessKey ID、AccessKey Secret以及其他可能需要的参数,例如:

sms:
  aliyun:
    accessKeyId: your-access-key-id
    accessKeySecret:  your-access-key-secret
    signName: ####
    # 是否开启短信服务
    pushSms: true
    templateCode: SMS_#########

4. 创建配置类

package com.example.demo.config.sms;
import com.aliyun.teaopenapi.models.*;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
 * @author xueyaoxuan
 */
@Data
@Component
@ConfigurationProperties(prefix = "sms.aliyun")
public class AliYunSmsConfig {
    private String accessKeyId;
    private String accessKeySecret;
    private String signName;
    private boolean isPushSms;
    /**
     * 使用AK&SK初始化账号Client
     *
     * @return Client
     * @throws Exception
     */
    public com.aliyun.dysmsapi20170525.Client createClient() throws Exception {
        Config config = new Config()
                // AccessKey ID
                .setAccessKeyId(this.getAccessKeyId())
                // AccessKey Secret
                .setAccessKeySecret(this.getAccessKeySecret());
        // 访问的域名
        config.endpoint = "dysmsapi.aliyuncs.com";
        return new com.aliyun.dysmsapi20170525.Client(config);
    }
}

5. 创建服务类

创建一个服务类来封装发送短信的逻辑

package com.example.demo.sms;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.example.demo.config.sms.AliYunSmsConfig;
import com.example.demo.config.ResultCode;
import com.example.demo.exception.base.BaseException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.stream.Collectors;
/**
 * 阿里云短信服务实现
 * @author xueyaoxuan
 */
@Slf4j
@Component
public class AliYunSmsServiceImpl implements SmsService {
    @Autowired
    AliYunSmsServiceImpl (AliYunSmsConfig aliYunSmsConfig) {
        this.aliYunSmsConfig = aliYunSmsConfig;
    }
    private AliYunSmsConfig aliYunSmsConfig;
    @Override
    public void sendSms(List<String> mobiles, String message, String code) {
        SendSmsResponse sendSmsResponse = null;
        try{
            //调用阿里云api手机号上限1000
            if (mobiles.size()>1000){
                throw new BaseException(ResultCode.EM_SMS_MAX_LIMIT);
            }
            //检验手机号格式
            mobiles.forEach(mobile->{
                if (StrUtil.isAllEmpty(mobile)){
                    throw new BaseException(ResultCode.EM_SMS_INVALID_MOBILE);
                }
            });
            sendSmsResponse = sendALiYunSms(mobiles.stream().collect(Collectors.joining(",")),
                    message, code);
            log.info("阿里云短信服务响应:[{}]",JSON.toJSONString(sendSmsResponse));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 发送阿里云短信
     *
     * @param mobiles 手机号列表
     * @param message json格式的模板参数
     * @param code 阿里云短信模板code
     * @return
     * @throws Exception
     */
    private SendSmsResponse sendALiYunSms(String mobiles,String message,String code) throws Exception {
        //初始化Client对象
        Client client = aliYunSmsConfig.createClient();
        //构建请求参数
        SendSmsRequest sendSmsRequest = new SendSmsRequest()
                .setPhoneNumbers(mobiles)
                .setSignName(aliYunSmsConfig.getSignName())
                .setTemplateCode(code)
                .setTemplateParam(message);
        //发送短信
        return client.sendSms(sendSmsRequest);
    }
}

6.自定义异常

package com.example.demo.config;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
 * ResultCode : 响应封装实现类
 *
 * @author zyw
 * @create 2023/6/15
 */
@AllArgsConstructor
@NoArgsConstructor
public enum ResultCode implements IResultCode, Serializable {
    //短信发送次数超过限制
    EM_SMS_MAX_LIMIT("10001","短信发送次数超过限制"),
    //无效的手机号码
    EM_SMS_INVALID_MOBILE("10002","无效的手机号码");
    @Override
    public String getCode() {
        return code;
    }
    @Override
    public String getMsg() {
        return msg;
    }
    private String code;
    private String msg;
    @Override
    public String toString() {
        return "{" +
                "\"code\":\"" + code + '\"' +
                ", \"msg\":\"" + msg + '\"' +
                '}';
    }
    // 默认系统执行错误
    public static ResultCode getValue(String code) {
        for (ResultCode value : values()) {
            if (value.getCode().equals(code)) {
                return value;
            }
        }
        return ECEPTION;
    }
}

7.使用服务类发送短信

在需要发送短信的地方注入SmsService并调用其方法发送短信。

package com.example.demo.controller;
import com.alibaba.fastjson.JSON;
import com.example.demo.sms.SmsService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * SmsController : 短信控制器
 *
 * @author zyw
 * @create 2024-06-11  15:56
 */
@RestController
@Tag(name = "短信控制器")
@RequestMapping("sms")
public class SmsController {
    @Resource
    private SmsService smsService;
    @Value("${sms.aliyun.templateCode}")
    private String templateCode;
    //发送短信
    @Operation(summary = "单个手机号发送短信验证码")
    @PostMapping("/SendATextMessageByhone")
    public String SendATextMessageByhone(String mobile, String message) {
        Map<String, String> tempContentMap = new HashMap<>();
        tempContentMap.put("code", String.valueOf(message));
        smsService.sendSms(List.of(mobile), JSON.toJSONString(tempContentMap), templateCode);
        return "短信发送成功";
    }
}

请确保替换成你自己的AccessKey信息、签名、模板CODE等,以及根据实际情况调整参数。此外,考虑到安全性,不要直接在版本控制系统中提交敏感信息,如AccessKey ID和AccessKey Secret,应使用环境变量或外部配置管理服务来管理这些信息。

8.测试短信

到此这篇关于SpringBoot整合阿里云短信服务的文章就介绍到这了,更多相关SpringBoot阿里云短信服务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring如何基于xml实现声明式事务控制

    Spring如何基于xml实现声明式事务控制

    这篇文章主要介绍了Spring如何基于xml实现声明式事务控制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • web.xml SpringBoot打包可执行Jar运行SpringMVC加载流程

    web.xml SpringBoot打包可执行Jar运行SpringMVC加载流程

    这篇文章主要为大家介绍了web.xml SpringBoot打包可执行Jar运行SpringMVC加载流程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • IDEA配置静态资源热加载操作(Springboot修改静态资源不重启)

    IDEA配置静态资源热加载操作(Springboot修改静态资源不重启)

    这篇文章主要介绍了IDEA配置静态资源热加载操作(Springboot修改静态资源不重启),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • nacos在liunx系统中启动成功浏览器却访问不了的解决方法

    nacos在liunx系统中启动成功浏览器却访问不了的解决方法

    在linux下搭建nacos,现在想要启动,访问nacos页面,访问不了,所以本文小编将给大家介绍nacos在liunx系统中启动成功,浏览器却访问不了?全面的解决办法,需要的朋友可以参考下
    2023-09-09
  • Java Enum和String及int的相互转化示例

    Java Enum和String及int的相互转化示例

    这篇文章主要介绍了Java Enum和String及int的相互转化示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Spring Boot日志的打印与持久化详细解析

    Spring Boot日志的打印与持久化详细解析

    Spring Boot默认使用SLF4J+Logback 记录日志,并提供了默认配置,即使我们不进行任何额外配,也可以使用SLF4J+Logback进行日志输出
    2022-07-07
  • Java实现导出ZIP压缩包的方法

    Java实现导出ZIP压缩包的方法

    这篇文章主要介绍了Java实现导出ZIP压缩包的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • ZIP4j 压缩与解压的实例详解

    ZIP4j 压缩与解压的实例详解

    这篇文章主要介绍了ZIP4j 压缩与解压的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-10-10
  • 使用阿里云OSS的服务端签名后直传功能的流程分析

    使用阿里云OSS的服务端签名后直传功能的流程分析

    这篇文章主要介绍了使用阿里云OSS的服务端签名后直传功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • java中全排列的生成算法汇总

    java中全排列的生成算法汇总

    本文给大家汇总介绍了常见的6种全排列的生成算法,包括字典序法、递增进位数制法、递减进位数制法、邻位交换法、递归类算法、元素增值法,有需要的小伙伴可以参考下
    2015-07-07

最新评论