今天在项目中遇到了一个需要手机验证登录的需求,在这里简单的记录一下。聚合短信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 blocke.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,就可以发送了验证了