阿里云短信服务与springboot实现短信

最近因为有需求用到短信验证码来控制一个用户注册,简单用了一下阿里云的短信服务来实现这个功能,废话不说,上代码!

我引入的依赖,这个是官方的什么升级版SDK依赖,我现在用着暂时没问题,它那个文档难看懂

<!--阿里云短信服务-->
<dependency>
	<groupId>com.aliyun</groupId>
	<artifactId>dysmsapi20170525</artifactId>
	<version>2.0.18</version>
</dependency>

创建一个Utils类,在controller调用,用于发送验证码

package com.szxy.mybatis.util;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
import lombok.SneakyThrows;

/**
 * @author ljm
 * @date 2022/9/6 9:39
 */
public class SMSUtils {
    /**
     * 发送短信
     * @param signName 签名
     * @param templateCode 模板
     * @param phoneNumbers 手机号
     * @param code 验证码
     */
    @SneakyThrows
    public static SendSmsResponse sendMessage(String signName, String templateCode, String phoneNumbers, String code){
        // 初始化ascClient需要的几个参数
        final String product = "Dysmsapi";// 短信API产品名称(短信产品名固定,无需修改)
        final String domain = "dysmsapi.aliyuncs.com";// 短信API产品域名(接口地址固定,无需修改)
        //初始化
        DefaultProfile.addEndpoint("cn-hangzhou","cn-hangzhou",product,domain);
        // 地域节点 阿里云的 accessKeyId和秘钥
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou(默认这个也可以)", "自己的accessKeyId", "自己的密钥");
        IAcsClient client = new DefaultAcsClient(profile);

        SendSmsRequest request = new SendSmsRequest();
        request.setSignName(signName);
        //短信模板
        request.setTemplateCode(templateCode);
        //电话号码
        request.setPhoneNumbers(phoneNumbers);
        //验证码格式
        request.setTemplateParam("{\"code\":\""+code+"\"}");
        SendSmsResponse response = client.getAcsResponse(request);//发送至客户端
        System.out.println(new Gson().toJson(response));
        if (response.getCode() != null && response.getCode().equals("OK")){
            return response;
        }else {
            return response;
        }
    }
}

创建一个生成4位随机数字验证码的类,当然这里也可以调用第二个方法生成指定多少位的验证码

package com.szxy.mybatis.util;

import java.util.Random;

/**
 * @author ljm
 * @date 2022/9/6 9:43
 */
public class ValidateCodeUtils {
    /**
     * 随机生成验证码
     * @param length 长度为4位或者6位
     * @return
     */
    public static Integer generateValidateCode(int length){
        Integer code =null;
        if(length == 4){
            code = new Random().nextInt(9999);//生成随机数,最大为9999
            if(code < 1000){
                code = code + 1000;//保证随机数为4位数字
            }
        }else if(length == 6){
            code = new Random().nextInt(999999);//生成随机数,最大为999999
            if(code < 100000){
                code = code + 100000;//保证随机数为6位数字
            }
        }else{
            throw new RuntimeException("只能生成4位或6位数字验证码");
        }
        return code;
    }

    /**
     * 随机生成指定长度字符串验证码
     * @param length 长度
     * @return
     */
    public static String generateValidateCode4String(int length){
        Random rdm = new Random();
        String hash1 = Integer.toHexString(rdm.nextInt());
        String capstr = hash1.substring(0, length);
        return capstr;
    }
}

controller里面的使用

    /**
     * 获取短信验证码
     */
    @GetMapping("getCode/{phone}")
    @ResponseBody
    public Result getCode(@PathVariable("phone")String phone){
        log.info("手机号:"+phone);
        if (StringUtils.isNotEmpty(phone)){
            //生成4位随机数验证码
            String rcode = ValidateCodeUtils.generateValidateCode(4).toString();
            log.info("随机生成的code={}",rcode);
            //调用API完成短信发送
            SendSmsResponse smsResponse = SMSUtils.sendMessage("自己的应用名称", "短信模板编号", phone, rcode);
            //下面可以将生成的验证码保存到Redis中用于注册或登录时的校验
            ******已省略
            if (smsResponse.getCode() != null && smsResponse.getCode().equals("OK")){
                log.info("发送状态:"+smsResponse.getCode());
                return Result.ok("发送成功");
            }
        }else {
            return Result.error("请输入验证码");
        }
        return Result.error("发送失败");
    }

简单的短信验证差不多就这样,有写得不对的地方请各位多多指正,多多包涵!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值