springboot整合手机验证码

由于大作业要求,需要发送手机短信验证码,看了很多文档,都不太齐全,要实现也都不太难,记录一些小坑,需要的可以参考,少走弯路。
准备:
登录阿里云,进入控制台,找到短信服务
在这里插入图片描述

找AccessKey,创建一个AccessKey,并记下AccessKey ID和Access Key Secret,因为在代码中需要认证已经开通短信服务的账号
在这里插入图片描述

在这里插入图片描述

回到短信服务控制台,找到国内消息,添加签名(发送信息的头,一般是项目名或者公司名称)和模板(发送到手机上验证码的模板),这里是我创建的签名和模板,可以自己按照格式自己来创建,记下签名名称和模板
在这里插入图片描述
在这里插入图片描述

不多说,直接来代码
代码中需要用到三个依赖包,这三个包maven仓库没有,需要到https://help.aliyun.com/document_detail/55359.html?spm=a2c4g.11186623.2.18.5fff3144dAgLmn下载,下载后项目中创建一个libs,然后粘贴进去,添加到项目依赖中
在这里插入图片描述

建立AliyunMessageUtil工具类
public class AliyunMessageUtil {
private static final String product = “Dysmsapi”;
//产品域名,开发者无需替换
private static final String domain = “dysmsapi.aliyuncs.com”;

// 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
private static final String accessKeyId = "LTAIAz6il3z7dyOR";
private static final String accessKeySecret = "OveOfwiVsvVzrEPltX60UdS6U1F6ao";

public static SendSmsResponse sendSms(Map<String, String> paramMap) throws com.aliyuncs.exceptions.ClientException {

    //可自助调整超时时间
    System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
    System.setProperty("sun.net.client.defaultReadTimeout", "10000");

    //初始化acsClient,暂不支持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();
    //必填:待发送手机号
    request.setPhoneNumbers(paramMap.get("phoneNumber"));
    //必填:短信签名-可在短信控制台中找到
    request.setSignName(paramMap.get("msgSign"));
    //必填:短信模板-可在短信控制台中找到
    request.setTemplateCode(paramMap.get("templateCode"));
    //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
    request.setTemplateParam(paramMap.get("jsonContent"));

    //选填-上行短信扩展码(无特殊需求用户请忽略此字段)

// request.setSmsUpExtendCode(paramMap.get(“extendCode”));

    //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者

// request.setOutId(paramMap.get(“outId”));

    //hint 此处可能会抛出异常,注意catch
    SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
    return sendSmsResponse;
}

}

sendSms(Map<String, String> paramMap)方法是我封装的方法。传入的参数是paramMap,其中包含以下属性:

accessKeyId 和accessKeySecret也要改为自己开通的号,进入控制台个人信息可以进入Accesskeys查看accessKeyId 和accessKeySecret
在这里插入图片描述

phoneNumber:接受者手机号

msgSign:短信签名名称。在控制台的短信签名里能找到。
在这里插入图片描述

templateCode:短信模版的code。见控制台中的模版code。
在这里插入图片描述

jsonContent:需要替换的变量的JSON字符串。对于验证码来说,String jsonContent = “{“code”:”" + randomNum + “”}";即可。其中randomNum是随机生成的6位验证码。

extendCode:上行短信模板的验证码,不需要的话可以忽略

outId:扩展字段,不需要则可以忽略

发送短信方法
public String sendMsg(String phoneNumber) throws ClientException {
String randomNum = createRandomNum(6);
String jsonContent = “{“code”:”" + randomNum + “”}";

Map<String, String> paramMap = new HashMap<>();
paramMap.put("phoneNumber", phoneNumber);
paramMap.put("msgSign", "电脑专卖电商");
paramMap.put("templateCode", "SMS_165106497");
paramMap.put("jsonContent", jsonContent);
SendSmsResponse sendSmsResponse = null;
try {
    sendSmsResponse = AliyunMessageUtil.sendSms(paramMap);
    if(!(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK"))) {
        if(sendSmsResponse.getCode() == null) {
            System.out.println("错误");
            //这里可以抛出自定义异常
        }
        if(!sendSmsResponse.getCode().equals("错误")) {
            System.out.println(paramMap);
            //这里可以抛出自定义异常
        }
    }
} catch (com.aliyuncs.exceptions.ClientException e) {
    e.printStackTrace();
}
return "发送成功";

}

/**

  • 生成随机数
  • @param num 位数
  • @return
    */
    public static String createRandomNum(int num){
    String randomNumStr = “”;
    for(int i = 0; i < num;i ++){
    int randomNum = (int)(Math.random() * 10);
    randomNumStr += randomNum;
    }
    return randomNumStr;
    }

结果:
在这里插入图片描述

喜欢的关注我,之后还会推出一些踩过的坑

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值