2024-05-08 10:27

SpringBoot用java程序发送手机验证码(2024.5.8为止最新)

张涛

JavaEE

(477)

(0)

收藏

一、创建阿里云账号

注册阿里云https://www.aliyun.com/

找到并短信服务,并且新用户有可以拿到免费100条使用3个月

开启服务后如果是需要生成AccessKeyID和AccessKey Secret


微信图片_20240508094814.png

生成后点击访问控制再点击用户,创建用户,并勾选OpenAPI

image.png

创建登录名称和显示名称(不要带中文),点击确定

创建好之后下载csv文件方便保存,

image.png


然后点击添加权限,


image.png

在输入框中输入SMS,两个后勾选,点击确认。

可能会有同学疑问为什们不用AccessKey管理选项中的主AccessKeyID,在这里我的认为是用主AccessKeyID不安全所以不用,个人建议在程序中最好使用子用户的AccessKeyID

确认无误后测试发送短信,重新进入短信服务页面,点击快速学习和测试,如图

image.png

调用API发送短信进入控制台,如图填写就可以

image.png


然后发起调用,稍等一会儿,如果收到短信验证码就是成功,,如没有收到从头在重新过一遍,快速学习那里申请模板要花¥,手头不宽裕建议不要整

二、导入依赖

<!--阿里云短信服务-->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.5.16</version>
</dependency>
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
    <version>2.1.0</version>
</dependency>

三、编写工具类

//发送短信的工具类

public class SMSUtils {
    /**
     * 发送短信
     * @param signName 签名
     * @param templateCode 模板
     * @param phoneNumbers 手机号
     * @param param 随机生成的四位或六位验证码数字
     */
    public static void sendMessage(String signName, String templateCode,String phoneNumbers,String param){
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "AccessKeyID", "AccessKeySecret");
        IAcsClient client = new DefaultAcsClient(profile);

        SendSmsRequest request = new SendSmsRequest();
        request.setSysRegionId("cn-hangzhou");
        request.setPhoneNumbers(phoneNumbers);
        request.setSignName(signName);
        request.setTemplateCode(templateCode);
        request.setTemplateParam("{\"code\":\""+param+"\"}");
        try {
            SendSmsResponse response = client.getAcsResponse(request);
            System.out.println(response.getMessage());
        }catch (ClientException e) {
            e.printStackTrace();
        }
    }
}

生成随机数的工具类

public class ValidateCodeUtils {
    //参数指定是四位还是六位
    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;
    }
}

四、测试

@Test
public void sendCode(){
    SMSUtils.sendMessage("阿里云短信测试","SMS_154950909",
            "手机号",ValidateCodeUtils.generateValidateCode4String(6));
}

测试通过后自行编写。

(小贴士:登录访问发送验证码controller方法的时候拦截器要放行哦~)

0条评论

点击登录参与评论