在注册用户的时候,我们可能根据需求会需要进行手机短信的验证,本篇博客便是介绍如何实现该功能。(代码后端是基于java,框架用的是SSH)
要发向手机发短信当然就要用到第三方接口,我用的融合通信的接口。(到网站去注册后,会有客服联系你,给你相关语言的发开包,一开始会送你20条免费测试短信。客服挺好的不够用你可以再向她申请点。)
1.首先显示JSP界面代码(核心代码我已经标注蓝色):
短信验证测试2.0
用户注册
手机号码:
2.用javaScript来控制界面数据的获取和传送,以及用JQuery来实现数据的会显。
//短信验证码
var InterValObj; //timer变量,控制时间
var count = 60; //间隔函数,1秒执行
var curCount;//当前剩余秒数
var code = ""; //验证码
var codeLength = 6;//验证码长度
function sendMessage(){
curCount = count;
var jbPhone = $("#telephonename").val();
alert(111);
alert(jbPhone);
var jbPhoneTip = $("#telephonenameTip").text();
if (jbPhone != "") {
/* if(jbPhoneTip == "√" || jbPhoneTip == "√ 短信验证码已发到您的手机,请查收"){ */
// 产生验证码
for ( var i = 0; i < codeLength; i++) {
code += parseInt(Math.random() * 9).toString();
}
// 设置button效果,开始计时
$("#btnSendCode").attr("disabled", "true");
$("#btnSendCode").val("请在" + curCount + "秒内输入验证码");
InterValObj = window.setInterval(SetRemainTime, 1000); // 启动计时器,1秒执行一次
// 向后台发送处理数据
$.ajax({
type: "POST", // 用POST方式传输
dataType: "text", // 数据格式:JSON
url: "register_sms.action", // 目标地址
data: "jbPhone=" + jbPhone +"&code=" + code,
error: function (XMLHttpRequest, textStatus, errorThrown) {
},
success: function (data){
data = parseInt(data, 10);
if(data == 1){
$("#telephonenameTip").html("√ 短信验证码已发到您的手机,请查收");
}else if(data == 0){
$("#telephonenameTip").html("× 短信验证码发送失败,请重新发送");
return false;
}else if(data == 2){
$("#telephonenameTip").html("× 该手机号码今天发送验证码过多");
}
}
});
/* } */
}else{
$("#telephonenameTip").html("× 手机号码不能为空");
}
}
//timer处理函数
function SetRemainTime() {
if (curCount == 0) {
window.clearInterval(InterValObj);// 停止计时器
$("#btnSendCode").removeAttr("disabled");// 启用按钮
$("#btnSendCode").val("重新发送验证码");
code = ""; // 清除验证码。如果不清除,过时间后,输入收到的验证码依然有效
}else {
curCount--;
$("#btnSendCode").val("请在" + curCount + "秒内输入验证码");
}
}
$(function(){
$("input",$("#codename").next("span")).blur(function(){
var SmsCheckCodeVal = $("#codename").val();
// 向后台发送处理数据
$.ajax({
url : "register_checkCode.action",
data : {SmsCheckCode : SmsCheckCodeVal},
type : "POST",
dataType : "text",
success : function(data) {
data = parseInt(data, 10);
if (data == 1) {
$("#codenameTip").html("√");
} else {
$("#codenameTip").html("× 短信验证码有误,请核实后重新填写");
}
}
});
return true;
});
});
3.struts.xml的配置
/register.jsp
4 Action中的代码
public class RegisterAction {
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();
public static String url = "http://service.XXXXXXXXXXXXX"; //融云通信给的接口
public static String userid = "XXXXXXXXXXXXXXX"; //注册时用户名
public static String account = "XXXXXXXXXXXXXX"; //此处可以不用设置
public static String password = "XXXXXXXXXXXXXXX"; //注册时密码
private String phonename;
public String getPhonename() {
return phonename;
}
public void setPhonename(String phonename) {
this.phonename = phonename;
}
//注册-往数据库中添加注册信息
public String add(){
//显示注册界面
return "test";
}
//判断该手机号码是否已经注册
/* public void checkLoginname() throws Exception{
String result = "0";
//判断该手机号码是否已经注册
List userlist=userRegisterService.findUser(phonename);
if(userlist!= null && userlist.size() > 0){
result = "1";
}else{
result = "0";
}
PrintWriter out = response.getWriter();
out.write(result.toString());
}
*/
//验证手机短信是否发送成功
public void sms() throws Exception {
String result = "0";
/** 手机号码 */
Object jbPhone=request.getParameter("jbPhone");
System.out.println("jbphone------------------------"+jbPhone);
/** 短信验证码 */
Object code = request.getParameter("code");
System.out.println("code---------------------------"+code);
/** 短信验证码存入session(session的默认失效时间30分钟) */
session.setAttribute("code", code.toString());
/** 单个手机号发送短信的方法的参数准备 */
// 手机号码
String mobilephone = jbPhone.toString();
// 短信内容+随机生成的6位短信验证码
String content = "【XXXXXXX】注册验证码为:" + code.toString(); //自定义发送的内容
/** 单个手机号发送短信 */
if (!sendMessage(content, mobilephone)) {
result = "0";// 失败
} else {
result = "1";// 成功
}
PrintWriter out = response.getWriter();
out.write(result.toString());
}
// 验证短信验证码是否正确
public void checkCode() throws Exception{
String result = "0";
// 获取手动输入的手机短信验证码
String SmsCheckCode = (String)(request.getParameter("SmsCheckCode"));
// 获取session中存放的手机短信验证码
Object code =session.getAttribute("code");
try {
if(SmsCheckCode != code.toString() && !SmsCheckCode.equals(code.toString())){
result = "0";
}else{
result = "1";
}
} catch (Exception e) {
throw new RuntimeException("短信验证失败", e);
}
PrintWriter out = response.getWriter();
out.write(result.toString());
}
//验证手机是否发送成功的方法
public static boolean sendMessage( String content, String mobileNumber) {
SmsBase smsBase = new SmsBase(); //SmsBase便是发送短信的核心类。此类我将在下文中贴出。
// 单个手机号码发送
try {
String retObj = smsBase.SendSms(mobileNumber, content); //---------调用
System.out.println("in sendMessage -------------------------");
//System.out.println(retObj);
if (retObj == "未发送,编码异常") {
return false;
} else {
return true;
}
} catch (Exception ex) {
ex.printStackTrace();
}
return true;
}
}
5.发送短信核心类SmsBase。
public class SmsBase {
private String x_id="XXXXXXX"; //注册时用户名(最好用英文,中文名字没测试。)
private String x_pwd="XXXXXXX"; //注册时密码
public String SendSms(String mobile,String content) throws UnsupportedEncodingException{
Integer x_ac=10;//发送信息
HttpURLConnection httpconn = null;
String result="Error";
StringBuilder sb = new StringBuilder();
sb.append("http://service.winic.org:8009/sys_port/gateway/index.asp?");
//以下是参数
sb.append("id=").append(URLEncoder.encode(x_id, "gb2312"));
sb.append("&pwd=").append(x_pwd);
sb.append("&to=").append(mobile);
sb.append("&content=").append(URLEncoder.encode(content, "gb2312"));
sb.append("&time=").append("1");
try {
URL url = new URL(sb.toString());
httpconn = (HttpURLConnection) url.openConnection();
BufferedReader rd = new BufferedReader(new InputStreamReader(httpconn.getInputStream()));
result = rd.readLine();
rd.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
if(httpconn!=null){
httpconn.disconnect();
httpconn=null;
}
}
return result;
}
}
6.至此,全部实现就完成了。 界面的样子和手机短信界面截图如下。
手机短信:
7.ok 搞定。