SpringBoot-短信验证码-快速入门Demo(含redis)(手把手教你开通阿里云短信服务到写出个最终代码来)

B站小狂神-此博客的内容就是看了这个视频的总结(博主自己写的哦~并非转载)
视频链接-【狂神说】通俗易懂的阿里云短信业务实战教程(露脸)


您是否还在为别人的项目有短信功能自己的却没有?
您是否还在为自己的项目没有短信功能逼格不够高而发愁?
您是否想要简单了解下短信功能但网上的只有代码没有其他相关知识的介绍而发愁?

dont 担心了!这篇博客是为了那些想简单入手下短信服务的老哥而准备的~~(大佬勿喷)
主要介绍下阿里云的一些用户操作(直接用最高权限的accessKeyId和key密码也不现实是不是,需要分不同的用户使用),简单介绍下阿里云短信开通,包括添加短信模板和签名(决定短信发送什么是不是

您也可以点击目录,跳转到您想看的部分去

1.了解阿里云用户权限操作(多图警告)

在这里插入图片描述
阿里云账号大家申请之后,就可以使用阿里云的服务了,我们一般都是通过授权码+id+密码的方式来使用阿里云服务的,这次我们就用短信服务来做个小Demo,先登录阿里云官网,按着下面的图步骤来走。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
创建一个用户组,给他添加下短信权限,Sms
在这里插入图片描述
然后用户也是差不多,
在这里插入图片描述
创建一个用户给它添加到刚才那个组里面,这样整个用户就只能使用短信服务了,值得注意的是那个创建用户的时候会告诉accessKeyId和accessKeySecret,记得把这两个保存下来,特别是accessKeySecret只在你创建用户的时候显示,忘了的话只能删除accessKeyId再新建一个了,这两个是等会需要填到代码里面的。老哥们注意下了,上面这些操作都是为了保护你的账号,这个用户组只能使用短信服务的,其他服务是是使用不了的。
(这个授权码和密码有点类似快递小哥进你的小区,你给他发个授权码和密码,有一定的时效或者权限,总比直接告诉他你的账号和密码要安全多了)

2.开通阿里云短信服务

在这里插入图片描述
我们先在搜索框中输入短信服务,背景就是我们点击回车之后的啦样子啦,注意那个国内服务,我们等下要设置的什么短信内容都是在这里设置的,看那个签名管理,模板管理。说一说为什么要设置这两个内容,这两个决定你的短信发送是什么内容!
在这里插入图片描述

添加短信模板

在这里插入图片描述
注意那个模板CODE,必须审核通过才能用在代码中!
在这里插入图片描述
再继续完成一些相关的内容补充,点击提交就好了。

添加签名

在这里插入图片描述
之后就是签名管理,也是一个类似的操作。这个签名就是说明你是哪个公司或者是什么项目的。我写学习之星是因为某个群里我的外号叫学习之星2333。注意,这个签名也是必须通过了才能在代码中写“学习之星”的!

这两个需要人工审核,不过感觉快很多的,大概20分钟左右吧。

3.编写测试代码(★★★)

项目结构

先大概看看项目结构吧,不复杂的,代码中我也会写一些注释方便大家理解。
在这里插入图片描述

相关的配置文件

pom.xml

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- 阿里云短信依赖 -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.1.0</version>
        </dependency>

        <!--fastjson,用来解析json-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.60</version>
        </dependency>

		<!-- 加入redis相关的依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>io.lettuce</groupId>
                    <artifactId>lettuce-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
    </dependencies>

application.properties

// 服务端口
server.port=8080

// redis 相关的配置
spring.redis.host=127.0.0.1
spring.redis.port=6379

controller,service层代码

service层
SendSms 接口

package com.example.sms.service;

import org.springframework.stereotype.Service;

import java.util.Map;

public interface SendSms {

    /**
     * 发送短信验证码
     * @param phoneNum  手机号
     * @param templateCode  模板号
     * @param code   验证码
     * @return
     */
    public boolean send (String phoneNum, String templateCode, Map<String, Object> code);
}

SendSmsImpl 实现类
注意替换accessKeyId,accessKeySecret,还有request.putQueryParameter方法中的一些内容!!

/**
     * 发送短信验证码
     * @param phoneNum  手机号
     * @param templateCode  模板号
     * @param code   验证码
     * @return
     */
@Service
public class SendSmsImpl implements SendSms {

    @Override
    public boolean send(String phoneNum, String templateCode, Map<String, Object> code) {
        // 连接阿里云
        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");

        // 自己的内容,此处 SendSms 为发送验证码
        request.setAction("SendSms");

        //自定义的参数(手机号,验证码,签名,模板! )
        //这是我的内容,请结合你的情况修改为你的东西!!!
        request.putQueryParameter( "PhoneNumbers",phoneNum);
        request.putQueryParameter( "SignName","学习之星");
        request.putQueryParameter( "TemplateCode","SMS_189620774");

        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code));

        try {
            CommonResponse response = client.getCommonResponse(request);
            // 在控制台上打印出返回信息
            System.out.println(response.getData());
            // 返回请求信息是否成功
            return response.getHttpResponse().isSuccess();
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }

        return false;
    }
}

controller层

PS:像这种注解@GetMapping("/send/{phone}") ,浏览器URL对应的就是http://localhost:8080/send/123456
不要写成了什么 http://localhost:8080/send/phone=15894621650 这样是接受不到的!!
该接口应该使用get方法访问,不是post方法!!(接口测试工具中要注意下)

@RestController
@CrossOrigin    //跨域支持
public class SmsApiController {

    @Autowired
    private SendSms sendSms;

    @Autowired
    private RedisTemplate<String, String> redisTemplate;


    @GetMapping("/send/{phone}")
    public String code(@PathVariable("phone") String phone) {

        //调用发送方法,模拟真实业务,redis
        String code = redisTemplate.opsForValue().get(phone);
        if (!StringUtils.isEmpty(code)) {
            return phone + ":" + code + "已存在,还没有过期";
        }

        // 生成验证码并且存储到 redis 中
        code = UUID.randomUUID().toString().substring(0, 4);
        HashMap<String, Object> param = new HashMap<>();
        param.put("code", code);

        boolean isSend = sendSms.send(phone, "SMS_189620774", param);

        if (isSend) {
            redisTemplate.opsForValue().set(phone, code, 600, TimeUnit.SECONDS);
            return phone + ":" + code + "发送成功!";
        } else {
            return "发送失败!";
        }
    }
}

结果展示

接口测试工具效果:
在这里插入图片描述
手机接收到的效果:
在这里插入图片描述

4.编写可复用的微服务接口(暂时空着,微服务还没学233)

结合你的具体业务吧233

谢谢您能看到结尾~
原人生的路上,你我共勉~

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值