pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.nieqiang</groupId>
<artifactId>TencentSMS</artifactId>
<version>20200430</version>
<name>TencentSMS</name>
<description>腾讯云手机短信验证码</description>
<properties>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.github.qcloudsms</groupId>
<artifactId>qcloudsms</artifactId>
<version>1.0.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties
#redis
spring.redis.port=6379
spring.redis.host= 127.0.0.1
spring.redis.password=password
spring.cache.cache-names=c1
#腾讯短信
tencent.message.appID=140xxxxxxxxxxxxxxx
tencent.message.appKEY=740xxxxxxxxxxxxxxxxxxxx
tencent.message.templateID=59xxx
获取手机验证码以及验证码校验的流程
Util(返回的对象)
public class HTTPResponse {
private Integer status;
private String message;
private Object data;
private Date date;
public static HTTPResponse ok(String message) {
return new HTTPResponse(200, message);
}
public static HTTPResponse ok(Object data) {
return new HTTPResponse(200, data);
}
public static HTTPResponse ok(String message,Object data) {
return new HTTPResponse(200, message, data);
}
public static HTTPResponse oks(String message, Object data, Date date) {
return new HTTPResponse(200, message, data, date);
}
public static HTTPResponse error(Integer status, String message) {
return new HTTPResponse(500, message, null);
}
public static HTTPResponse error(String message) {
return new HTTPResponse(500, message, null);
}
public static HTTPResponse error(String message,Object data) {
return new HTTPResponse(500, message, data);
}
public static HTTPResponse errors(String message,Object data) {
return new HTTPResponse(2000, message, data);
}
protected HTTPResponse() {super();}
private HTTPResponse(Integer status, String message) {
this.status = status;
this.message = message;
}
private HTTPResponse(Integer status, Object data) {
this.status = status;
this.data = data;
}
private HTTPResponse(Integer status, String message, Object data) {
this.status = status;
this.message = message;
this.data = data;
}
private HTTPResponse(Integer status, String message, Object data, Date date) {
this.status = status;
this.message = message;
this.data = data;
this.date = date;
}
public Integer getStatus() {return status;}
public String getMessage() {return message;}
public Object getData() {return data;}
public void setStatus(Integer status) {this.status = status;}
public void setMessage(String message) {this.message = message;}
public void setObject(Object data) {this.data = data;}
public Date getDate() {return date;}
public void setDate(Date date) {this.date = date;}
public void setData(Object data) {this.data = data;}
@Override
public String toString() {
return "HTTPResponse [status=" + status + ", message=" + message + ", data=" + data + ", date=" + date + "]";
}
}
Util(工具类)
public class RegisterUtil {
public static String verificationCode() {
String beginIndex = String.valueOf((int)(Math.random()*1000));
String endIndex = (String.valueOf(System.currentTimeMillis()))
.substring(String.valueOf(System.currentTimeMillis()).length()-3);
String verificationCode = beginIndex+endIndex;
return verificationCode;
}
}
Controller
public class AdminController {
@Autowired
private AdminService adminService;
@GetMapping("/getPhoneCode")
public HTTPResponse getPhoneCode(String phone) {
Integer result = adminService.getPhoneCode(phone);
switch (result) {
case 1:
return HTTPResponse.ok("验证码已成功发送,请注意查收!");
case 2:
return HTTPResponse.error("手机号格式错误!");
case 3:
return HTTPResponse.error("该手机号多次请求验证码,请30秒后再试!");
case 4:
return HTTPResponse.error("该手机号多次请求验证码,请1小时后再试!");
case 5:
return HTTPResponse.error("网络出现异常");
case 6:
return HTTPResponse.error("解析出现异常");
case 7:
return HTTPResponse.error("网络错误!");
case 8:
return HTTPResponse.error("未知错误!", "验证码发送失败!");
default:
return HTTPResponse.error("手机验证码发送失败,未知异常!");
}
}
}
Service
public interface AdminService {
Integer getPhoneCode(String phone);
}
ServiceImpl
@Service
public class AdminServiceImpl implements AdminService, UserDetailsService{
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Value("${tencent.message.appID}")
private int appid;
@Value("${tencent.message.appKEY}")
private String appkey;
@Value("${tencent.message.templateID}")
private int templateID;
@Override
public Integer getPhoneCode(String phone) {
String verificationCode = RegisterUtil.verificationCode();
try {
SmsSingleSender ssender = new SmsSingleSender(appid, appkey);
String[] params = {verificationCode};
SmsSingleSenderResult result = ssender.sendWithParam("86", phone,templateID, params, "", "", "");
JSONObject resultJSON = JSON.parseObject(result.toString());
Integer resultMessage = (Integer) resultJSON.get("result");
if(resultMessage == 0) {
redisTemplate.opsForValue().set(phone, verificationCode, 300, TimeUnit.SECONDS);
return 1;
}else if(resultMessage == 1016) {
return 2;
}else if(resultMessage == 1023) {
return 3;
}else if(resultMessage == 1024) {
return 4;
}
} catch (HTTPException e) {
return 5;
} catch (JSONException e) {
return 6;
} catch (IOException e) {
return 7;
} catch(Exception e) {
return 8;
}
return 1;
}
}
校验流程就是用用户输入的验证码和手机号进行匹配,两则都匹配上了就是验证通过,否则不通过!大概代码如下:
Controller
@RestController
public class AdminController
@Autowired
private AdminService adminService;
@PostMapping("/register")
public HTTPResponse register(String phone,String phoneCode){
Integer reslut = adminService.register(phone, phoneCode);
if(reslut == 1){
return HTTPResponse.ok("验证码与手机号匹配!");
}
return HTTPResponse.error("验证码与手机号不匹配!");
}
}
Service
Integer register(String phone, String phoneCode);
ServiceImpl
@Service
public class AdminServiceImpl implements AdminService, UserDetailsService{
@Override
public String register
try {
String redisCode = redisTemplate.opsForValue().get(username);
logger.info("redisCode==="+redisCode+"==========="+redisCode.equals(phoneCode));
redisCode.equals(phoneCode);
phoneCode.equals(redisCode);
if(!redisCode.equals(phoneCode) ||!phoneCode.equals(redisCode)) {
return 2;
}
return 1;
}catch(Exception e) {
return 2;
}
}
}