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

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/> <!-- lookup parent from repository -->
	</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>
		
		<!-- 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

#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 {
	/**
	 * 手机号验证码生成
	 * @CreationDate:2020年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 {
	@Autowired
	private 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

@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) {
				/**
				 *验证码存入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

@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;//接受的验证码与redis中的验证码或手机号不匹配
			}
			return 1;
		}catch(Exception e) {
			return 2;//接受的验证码与redis中的验证码或手机号不匹配       或者    为空抛出异常时进行捕获
		}
	}
}
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值