首页 > 其他分享 >Springboot集成阿里云短信

Springboot集成阿里云短信

时间:2022-10-08 14:16:01浏览次数:86  
标签:集成 短信 Springboot request sms import com 模板

目录

1 前言

​ 线上系统开发中,短信功能是经常要用到的,比如注册、修改手机号、修改密码时短信验证码等。我们这里是一个基于Springboot的微服务(SpringCloud Alibaba)项目,选择阿里云的短信接口。

2 准备工作

2.1 了解流程

​ 登录阿里云短信控制台,了解短信相关知识。我们这里需要短信发送功能,进一步了解相关API。

2.2 配置信息

  • 凭证:登录阿里云短信控制台,通过快速学习,我们知道,我们需要创建accessKey,accessKeySecret,即用户的访问凭证,具体如何创建,这里不赘述,自行查阅文档。
  • 域名endpoint:即我们通过那个地址访问阿里云的短信接口。

2.3 短信签名和模板

​ 签名和模板是阿里云短信功能所必须的,下面讲解下签名和模板的添加。

2.3.1 签名

  • 添加签名:一个账户只能添加一个验证码类型的签名,我已经添加了一个,你们根据需要自行选择,图示:

2.3.2 模板

  • 添加模板:

  • 审核不通过原因:

    • 场景连接:这里场景连接一定要填写公网可访问连接,比如你上线的App、网站网址,或者你的博客等待的。
    • 模板内容:如需自定义,仔细阅读变量规范、模板申请规范;或者直接说使用模板库中预定义模块,适当修改文字,可满足大部分应用场景。
  • 效果图示:

2.3.3 存入数据库

  • 与短信功能相关的签名、模板,这些信息保存在数据库的配置表中。
    • 签名:效果就是短信开头的【】中的信息,开发需要用到签名名称signName。
    • 模板:效果就是短信的内容,开发中需要用到模板名称templateCode,其他信息保存在数据库中。

3 SDK

​ 虽然是做了前面的准备工作,但是具体怎么应用还是很模糊,查阅相关技术文档,很多都是旧版本的内容。这里我们还是通过阿里云的OpenAPI来学习最新的应用技术,这里我们以短信发送为例,图示:

api参数,示例,依赖一目了然,而且是最新版本的内容,下面我们开始集成到项目中。

4 集成Springboot

4.1 集成

  • pom.xml:复制上面依赖信息

    <dependency>
                <groupId>com.aliyun</groupId>
                <artifactId>dysmsapi20170525</artifactId>
                <version>2.0.21</version>
            </dependency>
    
  • 分析:

    • 短信功能我们项目中多个模块需要用到,我们把短信发送功能封装到AliSms类中,AliSms配置为IOC容器中的bean,位置放置在公共模块中。
    • 需要用到的配置信息,比如accessKey,secretKey,endpoint,我们在nacos中配置,图示:2022-10-08_sendSms-nacos-config
  • 参考官网给出的SDK封装我们自己的AliSms类,源码:

    import com.aliyun.dysmsapi20170525.Client;
    import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
    import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
    import com.aliyun.teautil.models.RuntimeOptions;
    import cn.hutool.core.bean.BeanUtil;
    
    
    import java.util.Map;
    
    /**
     * @author Administrator
     * @version 1.0
     * @description ali sms
     * @date 2022-09-30 11:19
     * 阿里云短信类
     */
    public class AliSms {
    
        private final Client client;
        private final SendSmsRequest request;
    
        public AliSms(Client client, SendSmsRequest request) {
            this.client = client;
            this.request = request;
        }
    
        public  Map<String, Object> sendSms(String templateCode, String templateParam, String phoneNumbers) throws Exception {
    
            request.setTemplateCode(templateCode);
            request.setTemplateParam(templateParam);
            request.setPhoneNumbers(phoneNumbers);
    
            RuntimeOptions runtime = new RuntimeOptions();
            SendSmsResponse response = null;
            try {
                response = client.sendSmsWithOptions(request, runtime);
            } catch (Exception e) {
                e.printStackTrace();
                throw new Exception("短信发送失败");
            }
            return BeanUtil.beanToMap(response);
        }
    }
    
    
    
    import com.aliyun.dysmsapi20170525.Client;
    import com.aliyun.teaopenapi.models.Config;
    import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * @author Administrator
     * @version 1.0
     * @description sms短信发送
     * @date 2022-10-04 12:50
     */
    @Configuration
    public class SmsAutoConfiguration {
    
        /**
         * 阿里云短信服务账户accessKey
         */
        @Value("${spring.cloud.alicloud.access-key}")
        private String accessKey;
    
        /**
         * 阿里云短信服务账户accessKey
         */
        @Value("${spring.cloud.alicloud.secret-key}")
        private String secretKey;
    
        /**
         * 阿里云短信服务endpoint
         */
        @Value("${spring.cloud.alicloud.sms.endpoint}")
        private String endpoint;
    
        /**
         * 阿里云短信服务签名
         */
        @Value("${spring.cloud.alicloud.sms.signName}")
        private String signName;
    
    
        @Bean
        public AliSms aliSms() {
            return new AliSms(createClient(), sendSmsRequest());
        }
    
        private SendSmsRequest sendSmsRequest() {
            SendSmsRequest request = new SendSmsRequest();
            request.setSignName(signName);
            return request;
        }
    
        private Client createClient(){
            Config config = new Config()
                    // 您的 AccessKey ID
                    .setAccessKeyId(accessKey)
                    // 您的 AccessKey Secret
                    .setAccessKeySecret(secretKey);
            // 访问的域名
            config.endpoint = endpoint;
            Client client = null;
            try {
                client = new Client(config);
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException("创建阿里客户端失败!");
            }
    
            return client;
        }
    
    }
    
  • pom.xml添加依赖,全部相关依赖:

            <dependency>
                <groupId>com.aliyun</groupId>
                <artifactId>dysmsapi20170525</artifactId>
                <version>2.0.21</version>
            </dependency>
            <dependency>
                <groupId>com.aliyun</groupId>
                <artifactId>tea-util</artifactId>
                <version>0.2.14</version>
            </dependency>
    

4.2 测试

  • 测试代码:前端代码及后端接口根据业务需求自己设计,这里只展示业务实现层的短信发送方法的简单测试实现:
@Autowired
    private AliSms aliSms;

    @Override
    public void sendSms(Sms sms) {
        try {
            log.info("发送短信{}", JSON.toJSONString(sms, true));
            String templateParam = "{\"code\":\"" + "123456" + "\"}";
            Map<String, Object> info = aliSms.sendSms(sms.getTemplateCode(), templateParam, sms.getMobile());
            log.info("发送结果:{}", JSON.toJSONString(info, true));
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("发送短信失败");
        }
    }
  • 测试结果:

    • 控制台:

      {
          "basePath":"http://192.168.10.1:8090",
      	"description":"发送短信",
      	"ip":"192.168.10.1",
      	"method":"com.gaogzhen.controller.SmsController.sendSms",
      	"parameter":{
      		"sms":{
      			"countryCode":"+86",
      			"mobile":"自己填写的手机号",
      			"templateCode":"自己的模板CODE"
      		}
      	},
      	"result":{
      		"code":200
      	},
      	"spendTime":0,
      	"uri":"/sms/sendTo",
      	"url":"http://192.168.10.1:8090/sms/sendTo",
      	"username":"1014066909280374785"
      }
      
      
    • 手机截图:

5 后记

​ 欢迎交流学习,下面为联系方式和仓库源代码地址

❓QQ:806797785

⭐源代码仓库地址:https://gitee.com/gaogzhen/coin-exchange

标签:集成,短信,Springboot,request,sms,import,com,模板
From: https://www.cnblogs.com/gaogzhen/p/16768735.html

相关文章

  • SpringBootServletInitializer的作用
    https://blog.csdn.net/luckyzsion/article/details/81135438?spm=1001.2101.3001.6650.7&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendF......
  • spring boot集成redis基础入门
    redis支持持久化数据,不仅支持key-value类型的数据,还拥有list,set,zset,hash等数据结构的存储。可以进行master-slave模式的数据备份更多redis相关文档请查看redis官方文......
  • 从SpringBoot启动,阅读源码设计
    目录一、背景说明二、SpringBoot工程三、应用上下文四、资源加载五、应用环境六、Bean对象七、Tomcat服务八、事件模型九、配置加载十、数据库集成十一、参考源码服务启......
  • SpringBoot加载自动配置类的流程
    自定义过starter的同学应该都知道,自动配置类需要用EnableAutoConfiguration注解修饰,并且需要将自动配置类配置在spring.factories中。但自动配置类是如何被SpringBoot加......
  • 整合springboot
    案例1@RestControllerpublicclassUserInfoHandler{/***编程式校验*@paramuserInfo*@return*/@GetMapping("/addUser")......
  • 阿里巴巴开源限流组件Sentinel初探之集成Gateway
    1Sentinel主页​​github.com/alibaba/Sen…​​1.1Sentinel介绍随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel是面向分布式服务架构的流量控制组件,......
  • kubesphere集群ldap集成
    kubesphere集群版本v3.1.1kubectleditconfigmaps-nkubesphere-systemkubesphere-configapiVersion:v1data:kubesphere.yaml:|authentication:au......
  • k8s中kibana集成ldap和安装饼图插件
    集成ldap和添加饼图插件都需要重启容器1、创建configmapapiVersion:v1kind:ConfigMapmetadata:name:ldap-confignamespace:monitoringdata:ldap.toml:|......
  • 第十三节 Shiro集成Redis实现分布式集群Session共享
    一、使用Redis共享Session原理所有服务器的session信息都存储到了同一个Redis集群中,即所有的服务都将Session的信息存储到Redis集群中,无论是对Session的注销、更新都......
  • springboot~Money类型在序列化时遇到的问题与解决
    在java扩展包里,有这样一个包,它可以描述货币类型,它说币种和金额组成,可以应用在任何复杂的场合里,这个对象结构如下:{"price":{"amount":1799.99,"curren......