编程知识 cdmana.com

SpringBoot实现短信发送功能(阿里云短信服务)

SpringBoot短信发送功能

这里我采用的是阿里云提供的短信服务,且无需我们写几行代码,阿里云自动帮我们写好了代码,只需要拿来用即可

一、购买短信套餐

因为做测试用所以我是直接在官网上领的免费试用100条,公司有大需求的话也可以搜索短信服务购买短信套餐即可,一条短信也就几分钱。

在这里插入图片描述

二、创建用户组

创建用户组后会得到一个组,随后可以添加权限
在这里插入图片描述
点进用户组后我们进去权限管理搜索sms就会出现短信服务的权限,添加即可。

在这里插入图片描述

三、添加用户

添加了用户组之后我们还需添加用户,填写好名称(自定义),我们重点是需要勾选上编程访问,
这是我们能够通过编写代码发送短信的前提。
随后我们就会生成一个AccessKey的账号密码,这个一定到记住(拿小本本记下来,关闭后就不会再显示密码了),程序中需要用到。

在这里插入图片描述
随后我们可以将用户添加到用户组里,他会继承用户组的权限,我们也可以自己添加权限。

在这里插入图片描述
在这里插入图片描述

四、开通短信服务

用户测试完后我们就进入到短信模板阶段了,需要添加好签名(短信开头的名称部分)和模板(短信模板),这两个都是需要阿里云审核的所以理由要正当,一般几分钟就审核好了。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

五、查看帮助文档生成代码

短信设置好后我们就可以开始编码环节了,首先我们需要查看一下帮组文档如何使用阿里云的短信服务。点进帮助文档选择SDK参考

在这里插入图片描述
里面就有每门编程语言的使用方法,我们选择java查看一下
在这里插入图片描述

这里面告诉我们需要有java环境并导入依赖就可使用了,如何使用的代码,阿里云也帮我们写好了我们只需要点进OpenAPI Explorer查看代码即可

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>aliyun-java-sdk-core</artifactId>
  <version>4.5.3</version>
</dependency>

OpenAPI Explorer是一个在线调试工具,可以真实测试发送短信功能,我们可以复制代码到idea中进行开发
在这里插入图片描述

六、编写发送短信的代码

我们在SpringBoot项目的测试方法中进行测试
首先我们需要导入阿里云的发送短信服务的依赖和json转换的依赖
(代码中密码和手机号涉及带个人隐私就没展示,可用你自己的)

   <!--依赖安装阿里云Java SDK核心库。发送短信用-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.5.3</version>
        </dependency>
        <!--阿里云提供的json转换依赖 转换为json字符串-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.74</version>
        </dependency>
#开启redis服务
spring.redis.host=39.99.247.62
spring.redis.port=6379
 //阿里云发送短信服务 代码由阿里云短信服务平台生成,拿来用即可 配置相关个人信息
    @Test
    void smsMessage(){
      //AccessKey ID 账号 AccessKey secret密码
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAI4G16F251gw8zRaePUPQo", "你自己的密码");
        IAcsClient client = new DefaultAcsClient(profile);
		//阿里云原有的配置信息我们不需要改动
        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain("dysmsapi.aliyuncs.com");
        request.setSysVersion("2017-05-25");
        request.setSysAction("SendSms");

        //自定义短信信息
        request.putQueryParameter("PhoneNumbers", "156161123XX"); //发送给哪个手机号
        request.putQueryParameter("SignName", "清峰小栈");  //自己配置的短信签名
        request.putQueryParameter("TemplateCode", "SMS_205128031"); //自己配置的模板 模版CODE

        //构建一个短信验证码
        HashMap<String, Object> map = new HashMap<>();
        map.put("code",8456);
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map));   //转换成json字符串
        try {
    
            CommonResponse response = client.getCommonResponse(request); //发送至客户端
            System.out.println(response.getData());
        } catch (ClientException e) {
    
            e.printStackTrace();
        }
    }

运行代码即可收到验证码信息
在这里插入图片描述

七,真实业务开发

在真实业务开发中,我们的验证码是随机生成(可使用UUID生成),并且验证码需要保存并且过一会就要过期(存储到redis中设置过期时间)
1、导入依赖

<!--依赖安装阿里云Java SDK核心库。发送短信用-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.5.3</version>
        </dependency>
        <!--阿里云提供的json转换依赖 转换为json字符串-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.74</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-redis</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>

2、编写业务层代码

//接口 传入参数为电话号码,模板编号,验证码
public interface SendSms {
    

    boolean addSendSms(String PhoneNumbers, String TemplateCode, Map code);

}
@Service
public class SendSmsImpl implements SendSms {
    

    @Override
    public boolean addSendSms(String PhoneNumbers, String TemplateCode, Map code) {
    
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAI4G16F251gw8zRaePUPQo", "你自己的密码");
        IAcsClient client = new DefaultAcsClient(profile);

        CommonRequest request = new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain("dysmsapi.aliyuncs.com");
        request.setSysVersion("2017-05-25");
        request.setSysAction("SendSms");

        //自定义信息
        request.putQueryParameter("PhoneNumbers", PhoneNumbers); //发送至手机号
        request.putQueryParameter("SignName", "清峰小栈");  //自己配置的短信签名
        request.putQueryParameter("TemplateCode", TemplateCode); //自己配置的模板 模版CODE

        //构建一个短信验证码

        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code));   //转换成json字符串
        try {
    
            CommonResponse response = client.getCommonResponse(request); //发送至客户端
            System.out.println(response.getData());
            return response.getHttpResponse().isSuccess();//返回是否发送成功
        } catch (ClientException e) {
    
            e.printStackTrace();
        }

        return false;
    }
}

3、编写控制器代码

@RestController
@CrossOrigin    //跨域请求
public class SendSmsController {
    

    @Autowired
    SendSms sendSms;

    @Autowired
    RedisTemplate<String,String> redisTemplate;

    @GetMapping("/sms/{phone}")
    public String sendSms(@PathVariable("phone") String phone){
    
        System.out.println(phone);
        //得到电话,先看查一下redis中有无存放验证码
        String code = redisTemplate.opsForValue().get(phone);
        //有则返回已存在
        if (!StringUtils.isEmpty(code)){
    
            return phone+":"+code+"已存在,还没有过期!";
        }else {
    
            //没有则生成验证码,uuid随机生成四位数验证码
            code = UUID.randomUUID().toString().substring(0,4);   //随机生成四个数形成验证码
            HashMap<String, Object> map = new HashMap<>();
            map.put("code",code);
            //调用方法发送信息 传入电话,模板,验证码
            boolean send = sendSms.addSendSms(phone, "SMS_205128031", map);


            //返回ture则发送成功
            if (send){
    
                //存入redis中并设置过期时间
                redisTemplate.opsForValue().set("phone",code,5, TimeUnit.SECONDS);
                return phone+":"+code+"发送成功!";
            }else {
    
                //返回false则发送失败
                return "发送失败";
            }
        }
    }
}

代码编写完成,接收前端传来的电话号码即可实现发送验证码到指定电话用户。

版权声明
本文为[〆清峰ㄟ]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_45019350/article/details/109320090

Scroll to Top