最近因为有需求用到短信验证码来控制一个用户注册,简单用了一下阿里云的短信服务来实现这个功能,废话不说,上代码!
我引入的依赖,这个是官方的什么升级版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("发送失败");
}
简单的短信验证差不多就这样,有写得不对的地方请各位多多指正,多多包涵!