SpringBoot实现短信发送功能(基于阿里云)附源码

SpringBoot集成短信发送功能(基于阿里云)

前段时间教女朋友阿里云服务器的购买和配置,今天她发现阿里云控制台还有短信功能,非要学,只能再发一篇来教教她了。

创建RAM访问控制账户

首先我们要先创建一个可以在代码里面确认我们身份的账户。这是个什么账户呢,你想,你要在你的代码里发短信,用的是你的阿里云账户,你得告诉他是你吧,那只能创建一个让他认识你的标识咯。

image-20201012150342498

我们先创建一个用户组,名字随便你取

image-20201012150546805

image-20201012151531542

再在这个用户组中创建一个用户,

image-20201012150726828

给这个账户添加以下权限

image-20201012150910181

保存该账户的AccessKey

下面会用到

image-20201012153110021

如果第一次没有存密码,就再创建一个,把之前的删了,AccessKeyID和AccessKeySecret只会出现一次,关闭弹窗前先保存下来

image-20201012153826945

授权完毕后我们要来开通短信服务

开通短信服务

image-20201012145933401

然后我们要在阿里云的控制台里开通短信模块的服务,开通该功能

image-20201012151923255

创建短信模板

image-20201012152233103

模板可以参考这个,验证码${code} 部分为后端随机提供,先这么写

image-20201012152410465

提交后等待审核,写合理需求一般都可以通过

image-20201012152514028

创建短信签名

有了模板我们还需要签名,就是一条验证码的署名,是什么公司发的呀

image-20201012152608371

这个也是要审核的,注意到签名底下的规范需求

image-20201012152708271

申请说明可以多写一点

image-20201012152915134

等待审核即可

image-20201012152939228

申请通过后我们就可以来编写代码了
在这里插入图片描述

代码

测试类

创建一个SpringBoot项目(方便导入依赖)

添加依赖

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

 <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.68</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>

SpringbootTest类先测试一下发短信的功能正常使用

短信模板号在这里

在这里插入图片描述

	@Test
    void contextLoads() {

        // 连接阿里云
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "这里写刚才的AccessKeyID", "这里写刚才的AccessKeySecret");
        IAcsClient client = new DefaultAcsClient(profile);

        //构建请求
        CommonRequest request = new CommonRequest();

        request.setMethod(MethodType.POST);
        request.setDomain("dysmsapi.aliyuncs.com");//不动
        request.setVersion("2017-05-25");//不动

        request.setAction("SendSms");

        //自定义的参数(手机号,验证码,签名,模板)

        //request.putQueryParameter("RegionId", "cn-hangzhou");
        request.putQueryParameter("PhoneNumber", "这里写接受验证码的手机号");
        request.putQueryParameter("SignName", "这里写刚才申请的签名");
        request.putQueryParameter("TemplateCode", "写你的短信模板(SMS_*****)");
        //构建一个短信的验证码,先写死,后面可以随机生成并存入redis
        HashMap<Object, Object> map = new HashMap<>();
        map.put("code",998877);
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map));


        try {
            CommonResponse response = client.getCommonResponse(request);
            System.out.println(response.getData());
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }

运行后发现手机收到短信~如果没有成功运行的,检查一下手机号、验证码、签名、模板等。里面的方法基本都是导入了阿里云的包
在这里插入图片描述

(记得给阿里云账户冲个一两块钱,可以发很多条,一条也就几分钱)

关于充值

建议手机下载一个阿里云app,在app中直接充值余额,充两块钱绝对够用
在这里插入图片描述
跳转支付宝直接充值
在这里插入图片描述

或者在阿里云控制台的右上角,点击费用
在这里插入图片描述
充值即可
在这里插入图片描述

实际业务模拟

在SpringBoot中配置redis,我们把验证码存到redis中,设置5分钟过期时间

application.properties
spring.redis.host=127.0.0.1
spring.redis.port=6379

封装验证码生成工具

RandomUtil.java
package com.feng.testaliyunsmsdemo.Util;

import java.util.Random;

public class RandomUtil {

    public static String getRandom() {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < 6; i++) {
            String str = "0123456789";
            char ch= str.charAt(new Random().nextInt(str.length()));
            builder.append(ch);
        }
        return builder.toString();
    }
}

直接创建controller视图层

SmsController.java
package com.feng.testaliyunsmsdemo.controller;

import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.utils.StringUtils;
import com.feng.testaliyunsmsdemo.Util.RandomUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;


import java.util.concurrent.TimeUnit;

@RestController
@CrossOrigin  //跨域
public class SmsApiController {
    
    @Autowired
    private RedisTemplate<String, String> redisTemplate;


    //短信验证码实现区域
    @GetMapping("/send1/{phone}")
    public String phoneCode(@PathVariable("phone") String phone) {

        String code = redisTemplate.opsForValue().get(phone);
        if(!StringUtils.isEmpty(code)){
            return phone + ":" + code + "已存在,还没有过期";
        }

        code = RandomUtil.getRandom();
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou",
                "你的accesskey", "你的accesskey secret");
        IAcsClient client = new DefaultAcsClient(profile);
        CommonRequest request = new CommonRequest();
        request.setMethod(MethodType.POST);
        request.setDomain("dysmsapi.aliyuncs.com");
        request.setVersion("2017-05-25");
        request.setAction("SendSms");
        request.putQueryParameter("PhoneNumbers", phone);
        request.putQueryParameter("SignName", "你的签名");
        request.putQueryParameter("TemplateCode", "你的模板号(SMS_******)");
        request.putQueryParameter("TemplateParam", "{'code':"+code+"}");
        try {
            CommonResponse response = client.getCommonResponse(request);
            redisTemplate.opsForValue().set(phone,code,300, TimeUnit.SECONDS);
            System.out.println(response.getData());
            return phone + ":" + code + "发送成功!";
        } catch (ClientException e) {
            return "发送失败!";
        }

        //return "OK";
    }
    
    
}

这里面的redisTemplate.opsForValue().set(phone,code,300, TimeUnit.SECONDS);中,源码见下方图,四个参数分别是,键、值、过期时长、过期时间的单位,键值不用说就是存入redis的key-value,过期时长的单位设置为TimeUnit.SECONDS表示秒,则300意思是300s即五分钟的意思。

image-20201012162039063

运行

运行代码前确认Redis程序已经开启哦!

image-20201012161514541

访问 http://localhost:8080/send1/136***7846 发现手机收到了验证码,

img

并且控制台打印出来了阿里云返回的短信发送成功的信息

image-20201012160953584

我们打开RedisDesktopManager发现验证码在五分钟内保存在Redis中

image-20201012161116274

如果我们在验证码过期之前再次请求发送,会发现浏览器返回一个,是因为我们在发送验证码的逻辑内加入了时效判断,如果缓存中验证码未过期,不得再次发送

image-20201012161249665

在实际业务中,短信验证码的功能不言而喻,几乎是每个站点必备的功能,再结合一下前端传值,和实际业务的实现逻辑基本无异。

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物业管理系统源码(高分毕设).zip 基于springboot实现的智能物
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip 基于springboot实现的图书借阅系统源码.zip

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

上上签i

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

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

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

打赏作者

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

抵扣说明:

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

余额充值