今天在项目中遇到了一个需要手机验证登录的需求,在这里简单的记录一下。聚合短信API,手机验证登录
首先需要在聚合平台里面进行公司资质认真 飞机票:https://www.juhe.cn/docs/api/id/54
认证成功后 点击我的接口
继续
进行短信模板审核
通过后,就可以还是写代码了
写一个类,连接聚合API
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
public class SMSCode {
//把手机号码和随机验证码传递过来
public static boolean sendCode(String phoneNumber, String code) throws Exception {
String str_code = URLEncoder.encode("#code#=" + code, "UTF-8");
//包装好URL对象,将接口地址包装在此对象中
URL url = new URL("http://v.juhe.cn/sms/send?mobile=" + phoneNumber +
"&tpl_id=这里写短信模板id&tpl_value=" + str_code + "&key=这里写前面的key}");
/* 短信模板id */ /* 短信应用接口的key */
//打开连接,得到连接对象
URLConnection connection = url.openConnection();
//向服务器发送连接请求
connection.connect();
//获得服务器响应的数据
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
StringBuffer buffer = new StringBuffer();
String lineDate = null;
while((lineDate = bufferedReader.readLine()) != null) {
buffer.append(lineDate);
}
bufferedReader.close();
if(buffer.toString().indexOf("\"error_code\":0")>=0 ) {
return true;
}
return false;
}
}
下面发送验证码的controller和登录的controller
import com.example.demo.test.SMSCode;
import com.example.demo.test.removeAttrbute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Random;
import java.util.regex.Pattern;
@RestController
public class SMSCodeController {
@RequestMapping("/sendCode")
public String sendCode(HttpServletRequest req) {
String phoneNumber=req.getParameter("phoneNumber");
if (phoneNumber.trim().equals("") || phoneNumber == null) {
System.out.println("手机号码为空!");
} // 手机号码格式判断
if (!Pattern.matches("^1[3|4|5|7|8][9]\\d{9}$", phoneNumber)) {
System.out.println("手机格式错误!");
}
StringBuffer buffer = new StringBuffer();
Random random = new Random();
for (int i = 0; i < 6; i++) {
buffer.append(random.nextInt(10));
}
try {
if (!SMSCode.sendCode(phoneNumber, buffer.toString())) {
return "发送失败";
} else {
// 将验证码、手机号码和当前的系统时间存储到session中
req.getSession().setAttribute("code", buffer.toString());
req.getSession().setAttribute("number", phoneNumber);
req.getSession().setAttribute("time", System.currentTimeMillis());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "ok";
}
@RequestMapping("/logn")
public String Logn(HttpServletRequest req) {
String phoneNumber=req.getParameter("phoneNumber");
String code=req.getParameter("code");
//从session中拿出数据
HttpSession session = req.getSession();
String code_session = (String)session.getAttribute("code");
String number = (String)session.getAttribute("number");
Long time = (Long)session.getAttribute("time");
//清除session中的数据
session.removeAttribute("code");
session.removeAttribute("number");
session.removeAttribute("time");
if(code_session == null || code_session.trim().equals("")) {
System.out.println("验证码为空!");
return "验证码为空" ;
}
//验证码登录时效10分钟
if((System.currentTimeMillis() - time) / 1000 / 60 >= 0) {
System.out.println("验证码已过期!");
return "验证码已过期!" ;
}
//发送验证码的手机号码和登录时得到手机号码必须一致
if(!number.trim().equalsIgnoreCase(phoneNumber)) {
System.out.println("手机号码不一致!");
return "手机号码不一致!";
}
return "ok";
}
}
至此,调用这个controller,就可以发送了验证了