阿里云短信验证解决方案(java版)(redis存储)

最近搞了一个互联网项目的注册,需要写一个手机号验证(由于之前没有轮子,只能自己摸索了);

 

1:基本思路:

1>购买了阿里云短信服务->下载阿里云短信发送demo(java版);

2>后端随机产生二维码,通过阿里云短信服务${code}进行发送

3>同时记录发送的code和客户端的手机号,存储在redis中,redis过期时间60秒;

4>用户注册提交将客户端手机号和验证码与redis中的key和value对比,存在则注册成功(同时删除redis对应缓存数据),不存在则返回;

如需询问 可加我QQ820688215

========================================================================================================

代码如下:

redis工具代码

maven:

<!--阿里云短信服务-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.0.6</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
</dependency>
<!--redis服务-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>


redis 服务类

 随机code生成工具

 

阿里云短信服务配置

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/**
 * SmsDemo 是官方demo
 * 对其进行了修改,
 * 1:sendMsg 发送短信消息给客户端,需要客户端传入手机号
 */
public class MessageUtils {
 
    /**
     * 发送短信消息方法,返回验证码
     * @param phone 用户手机号
     * @return true 发送成功 ;false 发送失败
     */
    public static Boolean sendMsg(String phone) throws Exception {
 
        //设置超时时间-可自行调整
        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
        System.setProperty("sun.net.client.defaultReadTimeout", "10000");
        //初始化ascClient需要的几个参数
        final String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)
        final String domain = "dysmsapi.aliyuncs.com";//短信API产品域名(接口地址固定,无需修改)
        //替换成你的AK
        final String accessKeyId = "";//你的accessKeyId,参考本文档步骤2
        final String accessKeySecret = "";//你的accessKeySecret,参考本文档步骤2
 
        //初始化ascClient,暂时不支持多region(请勿修改)
        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId,
                accessKeySecret);
        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
        IAcsClient acsClient = new DefaultAcsClient(profile);
        //组装请求对象
        SendSmsRequest request = new SendSmsRequest();
        //使用post提交
        request.setMethod(MethodType.POST);
        //必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
        request.setPhoneNumbers(phone);
        //必填:短信签名-可在短信控制台中找到
        request.setSignName("你的短信签名");
        //必填:短信模板-可在短信控制台中找到
        request.setTemplateCode("SMS_0930219321");
        String checkCode = CoreUtils.randomString(6, true);//此处是生成6位数验证码工具类
        //request.setTemplateParam("{\"code\":\"123\"}");//测试用,此处json一定要严格按照json格式书写
        request.setTemplateParam("{\"code\":\""+checkCode+"\"}");
        //可选-上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段)
        //request.setSmsUpExtendCode("90997");
        //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
        request.setOutId("yourOutId");
        //请求失败这里会抛ClientException异常
        SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
        if (sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")){
            //请求成功,短信已发送
            //将手机号和生成的随机数存入redis 并设置redis的过期时间
            RedisClientServer.set(phone,checkCode,60);
        }
        return sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK");
    }
    //测试发送短信
    public static void main (String[] args) throws Exception {
 
        Boolean s = MessageUtils.sendMsg("13279879821");//手机号
        System.out.println("=========="+s);
    }

 

 

//客户端请求处理

 

1
2
3
4
5
6
7
8
//获取redis缓存中的手机号(key)和验证码(value):///////////////////////////
     if ("".equals((RedisClientServer.get(dto.getMobile())).toString())||
             null==(RedisClientServer.get(dto.getMobile())).toString()){
         return Results.json().render("验证码已过期");
     }else {
         //删除缓存数据
         RedisClientServer.del(dto.getMobile());
     }

 

 

 

 

 



posted @   ldp.im  阅读(1740)  评论(1编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示