conroller层
package com.xiaogui.msm.controller;
import com.xiaogui.msm.service.MsmService;
import com.xiaogui.msm.utils.RandomUtil;
import com.xiaogui.security.common.results.ResultEnum;
import com.xiaogui.security.common.results.ResultResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* @author 廾匸
* @version 1.0.0
* @ClassName MsmController
* @createTime 2021年12月19日
*/
@RestController
@RequestMapping("/msm")
@CrossOrigin
@Api(value = "短信验证码", tags = "短信验证码")
public class MsmController {
@Autowired
private MsmService msmService;
@Autowired
private RedisTemplate<String,String> redisTemplate;
//发送短信的方法
@ApiOperation(value = "发送短信", notes = "发送短信")
@PostMapping("send/{phone}")
public ResultResponse sendMsm(@PathVariable("phone") String phone) {
//1 从redis获取验证码,如果获取到直接返回
String code = redisTemplate.opsForValue().get(phone);
if(StringUtils.hasText(code)) {
return ResultResponse.of(null,ResultEnum.SUCCESS,true);
}
//2 如果redis获取不到,进行阿里云发送
//生成随机值,传递阿里云进行发送
code = RandomUtil.getFourBitRandom();
Map<String,Object> param = new HashMap<>();
param.put("code",code);
//调用service发送短信的方法
boolean isSend = msmService.send(param,phone);
if(isSend) {
//发送成功,把发送成功验证码放到redis里面
//设置有效时间
redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
return ResultResponse.of(true,ResultEnum.SUCCESS,true);
} else {
return ResultResponse.of(false,102,"短信发送失败");
}
}
}
service层
package com.xiaogui.msm.service;
import com.aliyun.tea.*;
import com.aliyun.dysmsapi20170525.*;
import com.aliyun.dysmsapi20170525.models.*;
import com.aliyun.teaopenapi.*;
import com.aliyun.teaopenapi.models.*;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.teaopenapi.models.Config;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.DefaultProfile;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.Map;
/**
* @author 廾匸
* @version 1.0.0
* @ClassName MsmService
* @Description
* @createTime 2021年12月19日
*/
@Service
public class MsmService {
//发送短信的方法
public boolean send(Map<String, Object> param, String phone) {
if(!StringUtils.hasText(phone)) {
return false;
}
// 阿里原版更新后的
/*Client client = null;
try {
client = new Client(new Config()
// 您的AccessKey ID
.setAccessKeyId("")
// 您的AccessKey Secret
.setAccessKeySecret("")
.setEndpoint("dysmsapi.aliyuncs.com"));
SendSmsRequest sendSmsRequest = new SendSmsRequest()
.setPhoneNumbers(phone)
.setSignName("")
.setTemplateCode("")
.setTemplateParam(JSONObject.toJSONString(param));
SendSmsResponse response = client.sendSms(sendSmsRequest);
System.out.println(sendSmsRequest);
System.out.println(response.getBody().message);
System.out.println(response.getBody().code);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}*/
// 阿里原版
DefaultProfile profile =
DefaultProfile.getProfile("default", "", "");
IAcsClient client = new DefaultAcsClient(profile);
//设置相关固定的参数
CommonRequest request = new CommonRequest();
// 设置协议
//request.setProtocol(ProtocolType.HTTPS);
request.setSysMethod(MethodType.POST);
request.setSysDomain("dysmsapi.aliyuncs.com");
request.setSysVersion("2017-05-25");
request.setSysAction("SendSms");
//设置发送相关的参数
//手机号
request.putQueryParameter("PhoneNumbers",phone);
//申请阿里云 签名名称
request.putQueryParameter("SignName","");
//申请阿里云 模板code
request.putQueryParameter("TemplateCode","");
//验证码数据,转换json数据传递
request.putQueryParameter("TemplateParam", JSONObject.toJSONString(param));
try {
//最终发送
CommonResponse response = client.getCommonResponse(request);
return response.getHttpResponse().isSuccess();
}catch(Exception e) {
e.printStackTrace();
return false;
}
}
}
工具类
package com.xiaogui.msm.utils;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
/**
* 获取随机数
*/
public class RandomUtil {
private static final Random random = new Random();
private static final DecimalFormat fourdf = new DecimalFormat("0000");
private static final DecimalFormat sixdf = new DecimalFormat("000000");
public static String getFourBitRandom() {
return fourdf.format(random.nextInt(10000));
}
public static String getSixBitRandom() {
return sixdf.format(random.nextInt(1000000));
}
/**
* 给定数组,抽取n个数据
* @param list
* @param n
* @return
*/
public static ArrayList getRandom(List list, int n) {
Random random = new Random();
HashMap<Object, Object> hashMap = new HashMap<Object, Object>();
// 生成随机数字并存入HashMap
for (int i = 0; i < list.size(); i++) {
int number = random.nextInt(100) + 1;
hashMap.put(number, i);
}
// 从HashMap导入数组
Object[] robjs = hashMap.values().toArray();
ArrayList r = new ArrayList();
// 遍历数组并打印数据
for (int i = 0; i < n; i++) {
r.add(list.get((int) robjs[i]));
System.out.print(list.get((int) robjs[i]) + "\t");
}
System.out.print("\n");
return r;
}
}
短信验证需导入的依赖
<!--阿里云短信验证-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.30</version>
</dependency>
<!--或以下依赖-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<version>2.0.8</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-openapi</artifactId>
<version>0.2.0</version>
</dependency>