700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Springboot发送手机短信验证码并且校验

Springboot发送手机短信验证码并且校验

时间:2019-01-08 20:05:51

相关推荐

Springboot发送手机短信验证码并且校验

pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /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/> <!-- lookup parent from repository --></parent><groupId>com.nieqiang</groupId><artifactId>TencentSMS</artifactId><version>2030</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><piler.encoding>UTF-8</piler.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><!-- Redis --><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

#redisspring.redis.port=6379spring.redis.host= 127.0.0.1spring.redis.password=passwordspring.cache.cache-names=c1#腾讯短信tencent.message.appID=140xxxxxxxxxxxxxxxtencent.message.appKEY=740xxxxxxxxxxxxxxxxxxxxtencent.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;}@Overridepublic String toString() {return "HTTPResponse [status=" + status + ", message=" + message + ", data=" + data + ", date=" + date + "]";}}

Util(工具类)

public class RegisterUtil {/*** 手机号验证码生成* @CreationDate:10月10日上午10:16:14;* @Author:NieQiang;* @ComputerName:Administrator;* @param phone* @return String;*/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;//生成验证码 前三位随机数+后三位毫秒值组成5到6位的验证码return verificationCode;}}

Controller

public class AdminController {@Autowiredprivate AdminService adminService;/*** 获取手机验证码* @param phone·······用户输入的手机号* @return*/@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("网络出现异常");// HTTP 响应码错误e.printStackTrace();case 6:return HTTPResponse.error("解析出现异常");// JSON 解析错误e.printStackTrace();case 7:return HTTPResponse.error("网络错误!");// 网络 IO 错误e.printStackTrace();case 8:return HTTPResponse.error("未知错误!", "验证码发送失败!");default:return HTTPResponse.error("手机验证码发送失败,未知异常!");}}}

Service

public interface AdminService {Integer getPhoneCode(String phone);}

ServiceImpl

@Servicepublic class AdminServiceImpl implements AdminService, UserDetailsService{@Autowiredprivate 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;@Overridepublic 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) {/***验证码存入redis中300秒*这里之所以用手机号作为健是防止同一个手机号在300秒内获取第二次验证码时出现资源多余的占用*在有效期内再次获取验证码直接将前一次获取的验证码替换即可**/redisTemplate.opsForValue().set(phone, verificationCode, 300, TimeUnit.SECONDS);return 1;//已成功发送验证码到:"+phone+",请注意查收!}else if(resultMessage == 1016) {return 2;//手机号格式错误}else if(resultMessage == 1023) {return 3;//该手机号多次请求验证码,请30秒后再试!}else if(resultMessage == 1024) {return 4;//该手机号多次请求验证码,请1小时后再试!}} catch (HTTPException e) {return 5;// HTTP 响应码错误e.printStackTrace();} catch (JSONException e) {return 6;// JSON 解析错误e.printStackTrace();} catch (IOException e) {return 7;// 网络 IO 错误e.printStackTrace();} catch(Exception e) {return 8;//未知错误!, 验证码发送失败!}return 1;}}

校验流程就是用用户输入的验证码和手机号进行匹配,两则都匹配上了就是验证通过,否则不通过!大概代码如下:

Controller

@RestControllerpublic class AdminController @Autowiredprivate 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

@Servicepublic class AdminServiceImpl implements AdminService, UserDetailsService{@Overridepublic String registertry {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;//接受的验证码与redis中的验证码或手机号不匹配}return 1;}catch(Exception e) {return 2;//接受的验证码与redis中的验证码或手机号不匹配 或者 为空抛出异常时进行捕获}}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。