短信验证码【java提高】

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
短信服务,100条 3个月
简介: 短信验证码【java提高】

前言

暑假持续学习ing

推荐

【【狂神说】通俗易懂的阿里云短信业务实战教程-哔哩哔哩】

短信验证码

需要有SpringBoot基础再来学习

1、了解阿里云用户权限操作


1.找到AccessKey功能



  1. 创建一个用户组,给他添加下短信权限,Sms



    然后用户也是差不多


    创建一个用户给它添加到刚才那个组里面,这样整个用户就只能使用短信服务了


值得注意的是那个创建用户的时候会告诉accessKeyId和accessKeySecret,记得把这两个保存下来,特别是accessKeySecret只在你创建用户的时候显示,忘了的话只能删除accessKeyId再新建一个了,这两个是等会需要填到代码里面的。


老哥们注意下了,上面这些操作都是为了保护你的账号,这个用户组只能使用短信服务的,其他服务是是使用不了的。

(这个授权码和密码有点类似快递小哥进你的小区,你给他发个授权码和密码,有一定的时效或者权限,总比直接告诉他你的账号和密码要安全多了)



把原来的禁用掉,就可以删除了,然后新建一个



总结:

1、开启子用户

2、新建一个用户组(设置添加权限sms)

3、创建一个用户(用来具体操作的账号)

4、得到AccessKey(id,密码)

注意将这个账号保存下来,不要泄露

泄露有及时禁用

2、开通阿里云短信服务

1、主页搜索短信服务,进入控制台


添加短信模板

1、短信的具体内容

2、等待审核通过



添加签名

1、名称

2、等待审核通过




使用阿里云专用短信测试

绑定测试手机号

使用测试专用签名,测试专用模板

3.编写测试代码

项目结构


1、新建springboot项目

2、导入依赖

pom.xml

     <!-- 阿里云短信依赖 -->
        <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>

application.properties

// 服务端口
server.port=8080
// redis 相关的配置
spring.redis.host=127.0.0.1
spring.redis.port=6379

SmsApplicationTests

测试类中测试

package com.kuang.sms;
import com.alibaba.fastjson.JSONObject;
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 org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.HashMap;
@SpringBootTest
class SmsApplicationTests {
    @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");//不要动
        // 自己的内容,此处 SendSms 为发送验证码
        request.setAction("SendSms");
        //自定义的参数(手机号,验证码,签名,模板! )
        //这是我的内容,请结合你的情况修改为你的东西!!!
        request.putQueryParameter("PhoneNumbers", 绑定的手机号);
        request.putQueryParameter("SignName", "阿里云短信测试");//阿里云专用短信测试签名
        request.putQueryParameter("TemplateCode", "SMS_154950909");//阿里云专用短信测试
模板
        //构建短信验证码
        HashMap<String,Object> map=new HashMap<>();
        map.put("code",2233);
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map));
        try {
            CommonResponse response = client.getCommonResponse(request);
            // 在控制台上打印出返回信息
            System.out.println(response.getData());
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }
}




service

package com.kuang.sms.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

package com.kuang.sms.service.impl;
import com.alibaba.fastjson.JSONObject;
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.kuang.sms.service.SendSms;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
@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", templateCode);
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code));
        try {
            CommonResponse response = client.getCommonResponse(request);
            // 在控制台上打印出返回信息
            System.out.println(response.getData());
            return response.getHttpResponse().isSuccess();
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return false;
    }
}

controller

package com.kuang.sms.controller;
import com.aliyuncs.utils.StringUtils;
import com.kuang.sms.service.SendSms;
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.HashMap;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
@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_154950909", param);//测试专用模版
        if (isSend) {
            redisTemplate.opsForValue().set(phone, code, 600, TimeUnit.SECONDS);
            return phone + ":" + code + "发送成功!";
        } else {
            return "发送失败!";
        }
    }
}

测试

保证redis打开,启动项目

访问http://localhost:8080/send/测试绑定手机号

结果:


封装微服务

最后

Markdown 7526 字数 339 行数

HTML 6011 字数 225 段落

相关文章
|
Java API 开发工具
Java程序如何通过阿里云OpenAPI调用短信接口
Java程序如何通过阿里云OpenAPI调用短信接口
948 1
|
2月前
|
运维 监控 搜索推荐
阿里大鱼进行发短信业务---使用详细步骤-Java操作
这篇文章详细介绍了如何在Java中使用阿里大鱼服务来发送短信,包括开通短信服务、签名和模板管理,以及具体的Java开发步骤和代码示例。
94 0
阿里大鱼进行发短信业务---使用详细步骤-Java操作
|
6月前
|
存储 NoSQL Java
Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
105 0
|
消息中间件 算法 Java
聊聊如何在Java应用中发送短信
很多业务场景里,我们都需要发送短信,比如登陆验证码、告警、营销通知、节日祝福等等。 这篇文章,我们聊聊 Java 应用中如何优雅的发送短信。
聊聊如何在Java应用中发送短信
|
7月前
|
安全 JavaScript 小程序
java 实现短信验证码
java 实现短信验证码
81 0
|
7月前
|
Java Maven
(短信服务)java SpringBoot 阿里云短信功能实现发送手机验证码
(短信服务)java SpringBoot 阿里云短信功能实现发送手机验证码
1453 0
|
缓存 前端开发 Java
Java场景面试题:短信验证码接口被狂刷,怎么办?
问:Tom老师,请问短信验证码接口被狂刷,搞得服务都快要崩溃了,我该怎么办? 答:我想都到云时代了,我想这个问题不应该出现吧?现在,都有非常多的短信服务提供商,应该自带防火墙功能的。
245 0
|
Java
JAVA采用手机号获取短信验证进行登录与注册
JAVA采用手机号获取短信验证进行登录与注册
175 0
|
安全 Java API
验证码短信 API 接入指南:Java 语言示例代码
验证码短信 API 接入指南:Java 语言示例代码
9406 0
|
自然语言处理 算法 安全
语音验证码短信原理和应用场景分析(附Java 接入代码)
语音验证码短信原理和应用场景分析(附Java 接入代码)
240 0