阿里云短信验证码实战

2023-10-27

一、创建阿里云短信权限用户

1、登陆阿里云之后我们点击头像,接着点击AccessKey:
在这里插入图片描述

2、选择开始使用子用户 :
在这里插入图片描述

3、我们先要创建一个用户组:
在这里插入图片描述

4、依次点击新建的用户组——授权管理,给用户组授权,开通短信验证码服务:
在这里插入图片描述
5、接着我们新建一个用户(具体用来操作的账号),一定要勾选OpenAPI调用访问,这样我们才能通过代码访问:
在这里插入图片描述
记得把AccessKey保存下来,以为后面会看不到:
在这里插入图片描述

6、接着将这个用户添加到刚刚的用户组即可:
在这里插入图片描述

二、开通阿里云短信服务

1、在搜索框搜索短信服务,点击加载之后,选择免费开通,即可开通短信服务。

2、我们开通短信服务之后,还要设置签名和模板:
在这里插入图片描述

签名就相当于公司名称,模板就是短信的模板,验证码短信分为几部分:
在这里插入图片描述

默认会给我们设置一个模板,我们可以直接用这个模板(注意:模板一定要和某个签名绑定,否则发送不了验证码):
在这里插入图片描述

但是没有默认的签名,我们需要自己添加,申请里有一定要有理有据,比较正当,等待审核通过即可:
在这里插入图片描述

可以在快速学习和测试模块,体验一下短信验证码的使用:
在这里插入图片描述

这一块也会有实现短信验证码功能的代码:
在这里插入图片描述

三、编写测试代码

我们可以在帮助文档中查看具体的使用步骤:帮助文档

1、首先在项目中导入Java SDK的依赖:

<!--阿里云短信验证码sdk-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.5.16</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
        </dependency>
			
			<!--springboot集成redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

然后编写一个测试类来测试是否能正常发送验证码:

//连接阿里云
        DefaultProfile profile = DefaultProfile.getProfile("cn-beijing", "Your AccessKey ID", "Your AccessKey Secret");
        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","xxxx"); //手机号
        request.putQueryParameter("SignName","xxxx"); //申请阿里云 签名名称
        request.putQueryParameter("TemplateCode","xxxxx"); //申请阿里云 模板code

        HashMap<String, Object> map = new HashMap<>();
        map.put("code", 123456);
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map));//验证码数据,转换json数据传递

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

测试代码写完之后我们就可以执行这段代码进行测试了,结果成功!

四、封装发送短信接口

1、编写Service接口:

public interface SendSms {
    //手机号、模板代码、验证码
    public boolean send(String phoneNum, String templateCode, Map<String, Object> code);
}

2、编写接口实现类:

@Service
public class SendSmsImpl implements SendSms {
    @Override
    public boolean send(String phoneNum, String templateCode, Map<String, Object> code) {
        //连接阿里云
        DefaultProfile profile = DefaultProfile.getProfile("cn-beijing", "LTAI5tMk6A312KwNVnxNuTno", "1MyEwE0uqfHYTFyFAcydutAFBZgGBj");
        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",phoneNum); //手机号
        request.putQueryParameter("SignName","唐世华个人签名"); //申请阿里云 签名名称
        request.putQueryParameter("TemplateCode",templateCode); //申请阿里云 模板code


        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code));//验证码数据,转换json数据传递,这里要用map

        try{
            CommonResponse response = client.getCommonResponse(request);
            System.out.println(response.getData());
            return response.getHttpResponse().isSuccess();  //判断发送是否成功
        } catch (ClientException e){
            e.printStackTrace();
        }
        return false;
    }
}

3、编写Controller测试类:

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

    @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);
        System.out.println(code);
        if(!StringUtils.isEmpty(code)){
            return phone + ":" + code + "已存在,还没有过期,可继续使用!";
        }

        //生成验证码并存储到redis中
        //生成验证码(包含数字和字母)
        //code = UUID.randomUUID().toString().substring(0, 4);

        //生成纯数字
        int uuid = UUID.randomUUID().toString().replaceAll("-","").hashCode();
        uuid = uuid < 0 ? -uuid : uuid;//String.hashCode() 值会为空
        code = String.valueOf(uuid).substring(0, 4);

        HashMap<String, Object> param = new HashMap<>();
        param.put("code", code);

        boolean isSend = sendSms.send(phone, "SMS_274310067", param);  //发送验证码

        if(isSend){ //发送成功
            redisTemplate.opsForValue().set(phone, code, 5, TimeUnit.SECONDS);  //将验证码存到redis,设置5分钟过期
            return phone + ":" + code + "发送成功!";
        }else {
            return "发送失败";
        }

    }

}

完结撒花!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

阿里云短信验证码实战 的相关文章

随机推荐

  • element组件:点击侧边栏,切换右侧内容

    侧边栏 远程加载了页面的头部
  • pip工具使用之版本变更及恢复

    1 版本变更 降低版本 pycharm安装第三方库 Try to run this command from the system terminal Make sure that you use the问题 亲测已解决 爱编程的小新的博客
  • STL-String容器

    string本质上是一个类 string 类内部封装了很多成员方法 例如 查找find 拷贝copy 删除delete 替换replace 插入insert string管理char 所分配的内存 不用担心复制越界和取值越界等 由类内部进行
  • Android通用的筛选栏实现

    最近事情比较多 不管是生活还是工作 感觉节奏都在赶着走 对于之前相对比较喜欢自由的我 也要慢慢适应之后的节奏了 不管怎样 生活还在继续 加油 今天来写一个通用的筛选栏的实现 也是因为之前项目中要好多地方用到筛选栏这么个东西 所以为了之后用起
  • C++基础知识 - 类模板函数写在类的外部

    1 所有的类模板函数写在类的外部 在一个cpp中 include
  • Could not initialize class sun.awt.X11GraphicsEnvironment

    当你的代码出现这一段你不慌吗 其实解决方法很简单 这一段代码很重要 用了它就能在linux环境下没有桌面的情况下运行验证码 在静态代码块中添加这一段表示启用headless模式就不用下载桌面环境了 static System setProp
  • 2014年2月21日星期五(DEMO7-6战区漫步)

    这是本章最后一个例子 与上个例子不同的是 1 加载的物体是2个 2 用了欧拉相机 视野120度 这个DEMO是个综合 应该没有新的函数了 稍微简单些 首先设定个宇宙空间 以及 各物体参数 define UNIVERSE RADIUS 400
  • 集成 Redis & 异步任务-SpringBoot 2.7 .2实战基础

    学SpringBoot 2 7 2实战基础 09 集成 Redis 异步任务 1 集成Redis docker 安装 MySQL 和 Redis 一文已介绍如何在 Docker 中安装 Redis 本文就看看 SpringBoot 如何整合
  • warning: #1295-D: Deprecated declaration lcd_init - give arg types

    将void lcd init 改为void lcd init void 即可
  • FFMPEG视音频编解码学习笔记

    文章转载自 http www jianshu com p 5c7bec29fdbd 一直对音视频这块比较感兴趣 但是一直不知道从何下手 终于找到了比较好的资料 希望通过接下来的时间好好研究一下FFMPEG相关的知识 这里感谢一下雷霄骅大神
  • 2022年软件测试面试题分享

    一 上来必然是自我介绍 自我介绍是任何一个面试过程中必不可少的环节 并且可以说是最重要的环节 因为每个面试官都需要用最短的时间去了解你这个人 以前干过什么 有过几年经验 做过哪些项目 可以说 通过一个简短的自我介绍 面试官心里已经有50 的
  • UE4状态机

    1 准备一套带动作的模型 并导入UE4 2 新建一个动画蓝图 右键 gt Animation gt AnimationBlueprint 选择继承AnimationInstance 并选择相应的骨骼 命名HeroAnimation 3 双击
  • 【网络编程】【UDP】UDP协议介绍

    一 UDP介绍 UDP和TCP相比是截然不同的 是一个简单的传输协议 全称是用户数据包协议 User Datagram Protocol 是一个无连接协议 UDP不保证UDP数据报会到达其最终目的地 不保证各个数据报的先后顺序跨网络后保持不
  • 操作复杂对象结构——访问者模式(四)

    26 4 访问者模式与组合模式联用 在访问者模式中 包含一个用于存储元素对象集合的对象结构 我们通常可以使用迭代器来遍历对象结构 同时具体元素之间可以存在整体与部分关系 有些元素作为容器对象 有些元素作为成员对象 可以使用组合模式来组织元素
  • Fortify自定义规则笔记(一)

    一 Fortify SCA 自定义规则介绍 Fortify是一款强大的静态代码扫描分析工具 其发现代码漏洞缺陷的能力十分强悍 主要是将代码经过编译 依托于其强大的内置规则库来发现漏洞的 其次fortify SCA 团队在开发此商业工具时 也
  • 使用el-dialog组件嵌套,导致页面整体出现遮罩层无法操作,页面多出<div class=‘v-modal‘ tabindex=‘0‘ style=‘z-index:2001‘></div>标签

    样例 解决 方法一 给嵌套dialog添加属性 append to body值为 true 方法二 如果不需要遮罩层可以采用此方法
  • PackageNotFoundError: Package not found at ‘*.doc’

    我通过python docx读取一个docx文件 路径确认无误的情况下 还是报错了 上代码 from docx import Document path E Python project pro1 fafa docx doc Documen
  • SprigBoot--Redis之 @Cacheable总结

    Cacheable总结 Redis的作用很多 缓存是其中之一 作为内存数据库 效率不言而喻 热点 高频搜索词汇基本都要进行缓存 Java使用redis是一件麻烦的事情 需要使用客户端API去操作 如Jedis lettuce Spring对
  • Java实现redis缓存效果变量过期

    目录 1 实现 2 测试 3 接口 1 实现 redis中的Expire命令用于设置 key 的过期时间 key 过期后将不再可用 不过有些变量我们不需要设置到redis中 只要存到本地就可以了 也需要过期时间 也可以同样方法定义一个全局变
  • 阿里云短信验证码实战

    一 创建阿里云短信权限用户 1 登陆阿里云之后我们点击头像 接着点击AccessKey 2 选择开始使用子用户 3 我们先要创建一个用户组 4 依次点击新建的用户组 授权管理 给用户组授权 开通短信验证码服务 5 接着我们新建一个用户 具体