因为移动端的方便,现在网络上很多的网站与应用都有与实现用户手机绑定的功能。这样做的好处很多,例如账号登陆、修改密码、在线支付……等功能模块都可以与手机实时获取验证码短信结合,来确保用户的安全性操作。
而这整功能模块的实现,我把它大致分为三个步骤:
(1)前端触发获取验证码,同步显示有效验证倒计时;
(2)后台通过代理平台发送验证短信;
(3)用户提交验证信息,后台逻辑判断处理。
一、首先,与大家分享下前端的实现:
如图:输入完正确的手机号码后再触发有效验证倒计时。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
function
getCode(){
var
tel = $(
"#mobile"
).val();
//获取手机号码输入框值
var
reg = /^1[3|4|5|8][0-9]\d{4,8}$/;
if
(!reg.test(tel)){
//校验手机号码格式
alert(
"请先输入您的正确手机号!"
);
document.form1.o_tel.focus();
return
false
;
}
var
paras =
"o_tel="
+tel;
//jquery post方法同步提交
//(提交地址; data:返回值)
$.post(
'<%=basePath%>mobile/sendCode?'
+paras,
function
(data) {
if
(data!=
null
&&
typeof
(data)!=
"undefined"
){
var
msg = data.msg;
//返回值为json格式
if
(msg!=
null
&&
typeof
(msg)!=
"undefined"
&&msg==
"SUCCESS"
){
get_code_time();
//发送成功则出发get_code_time()函数
}
else
{
alert(
"短信验证码发送失败!请重新获取。"
);
}
}
else
{
alert(
"短信验证码发送失败!请重新获取。"
);
}
},
"json"
);
}
var
wait = 120;
function
get_code_time(){
if
(wait==0){
$(
"#updateverify"
).removeAttr(
"disabled"
);
//移除获取验证码按钮的disabled属性
$(
"#updateverify"
).val(
"获取验证码"
);
wait = 120;
}
else
{
$(
"#updateverify"
).attr(
"disabled"
,
true
);
//设置获取验证码按钮为不可触发
$(
"#updateverify"
).val(
"剩("
+ wait +
")秒"
);
wait--;
setTimeout(
"get_code_time()"
, 1000);
}
}
|
二、接下来我们就该在后台进行短息发送处理了(Demo是用Java整合spring MVC框架写的):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
/**
* 订单查询发送验证码
* @param request
* @param response
* @return
*/
@RequestMapping
(value=
"/sendCode"
,method={RequestMethod.POST,RequestMethod.GET})
public
String sendCode(HttpServletRequest request,HttpServletResponse response){
HttpSession session = request.getSession();
String ret=
""
;
String o_tel = request.getParameter(
"o_tel"
);
//获取前端传送过来的电话号码
if
(o_tel!=
null
&&o_tel!=
""
){
int
Random = (
int
) ((Math.random()*
9
+
1
)*
1000
);
//随机生成的4位数(验证码)
String mes = Random+
"(用于测试的验证码,两分钟内有效)【学而思博客】"
;
//需在短信中显示的文字信息描述
ApiSendMobile asm =
new
ApiSendMobile();
String msg = asm.sendSM(o_tel, mes);
//发送短信
if
(
"发送成功"
.equals(msg)){
ret =
"{\"msg\":\"SUCCESS\"}"
;
//把验证码与电话号码存入session中,并设置120秒有效期限
session.setAttribute(
"code"
, Random);
session.setAttribute(
"tel"
, o_tel);
session.setMaxInactiveInterval(
2
*
60
);
}
else
{
ret =
"{\"msg\":\"ERROR\"}"
;
}
}
else
{
ret =
"{\"msg\":\"ERROR\"}"
;
}
response.setContentType(
"application/json;charset=UTF-8"
);
PrintWriter writer =
null
;
try
{
writer = response.getWriter();
}
catch
(IOException e) {
e.printStackTrace();
}
writer.write(ret);
//推送回前端
return
null
;
}
|
后台的大概逻辑就是这样,不熟悉SpringMVC的请不要在意太多细节。因为接下来的才是我要说的关键点:
ApiSendMobile asm =
new
ApiSendMobile();
String msg = asm.sendSM(o_tel, mes);
嗯,没错ApiSendMobile这货是我已经封装好的一个类。先来说说目前我们常用的发送短信方法,
1、与运营商联系,调用运营商的接口,把要发送的内容与手机号给运营商,让运营商去发送。(例如Mas机平台,附上相关链接:http://blog.csdn.net/wufeishimeng/article/details/4204093)
2、自己去买设备,然后在基于它进行二次开发(例如短信猫,相关链接:http://my.oschina.net/backtract/blog/133629)
3、专门的短信服务公司,让后通过网络服务形式调用第三方接口发送(例如飞信)
额,才疏学浅。目前我知道的就这三种吧,其中第一种方式是稳定快速有保障的(因为运营商们要收费),第二种就出现延迟或者遗漏现象的几率就会很大,最后一种不知道现在是否还可行了。
我们言归正传,本文的例子就是用了第一种方法,上代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
package
com.xiaoxm.util;
import
java.io.BufferedReader;
import
com.jasson.im.api.APIClient;
/**
* ApiTestDemo
*/
public
class
ApiSendMobile
{
private
long
smId =
1
;
private
int
smType =
0
;
private
String host =
"mas地址"
;
private
String dbName =
"mas"
;
private
String apiId =
"用户apid"
;
private
String name =
"用户名"
;
private
String pwd =
"密码"
;
private
APIClient handler =
new
APIClient();
BufferedReader in =
null
;
public
ApiSendMobile()
{
}
public
void
init()
{
int
connectRe = handler.init(host, name, pwd, apiId,dbName);
if
(connectRe == APIClient.IMAPI_SUCC)
info(
"初始化成功"
);
else
if
(connectRe == APIClient.IMAPI_CONN_ERR)
info(
"连接失败"
);
else
if
(connectRe == APIClient.IMAPI_API_ERR)
info(
"apiID不存在"
);
if
(connectRe != APIClient.IMAPI_SUCC)
{
System.exit(-
1
);
}
}
public
void
release()
{
handler.release();
Thread.currentThread().interrupt();
}
public
String sendSM(String mobile,String sendContent)
{
init();
//初始化 相关参数
String msg =
""
;
int
result =
0
;
result = handler.sendSM(mobile, sendContent, smId );
if
(result == APIClient.IMAPI_SUCC)
{
msg =
"发送成功"
;
}
else
if
(result == APIClient.IMAPI_INIT_ERR)
msg =
"未初始化"
;
else
if
(result == APIClient.IMAPI_CONN_ERR)
msg =
"数据库连接失败"
;
else
if
(result == APIClient.IMAPI_DATA_ERR)
msg =
"参数错误"
;
else
if
(result == APIClient.IMAPI_DATA_TOOLONG)
msg =
"消息内容太长"
;
else
if
(result == APIClient.IMAPI_INS_ERR)
msg =
"数据库插入错误"
;
else
msg =
"出现其他错误"
;
release();
//释放资源
return
msg;
}
public
void
error(Object obj , Throwable thr)
{
info(obj);
thr.printStackTrace();
}
public
void
info(Object obj)
{
System.out.println(obj);
}
public
void
quit()
{
release();
System.exit(
0
);
}
}
|
因为涉及到隐私,所以什么地址、用户名密码之类的,自己去向运营商联系获取吧……
要注意哦:这个类里引入了import
com.jasson.im.api.APIClient;
还有就是项目中也必须加一个jar包:ImApi.jar
如果有去和运营商合作的话,他们会给你文档和所需的开发包之类的,所以你大可放心。
嗯,该功能模块的核心内容都已经介绍得差不多了,就只剩下用户查看短信验证信息,输入了传到后台,然后再获取刚才发送短信成功时存入session中连个值进行对比验证。我也就不在此啰嗦……
结语:天下没有白吃的午餐,垄断行业就是屌。水平不足,文章中也许存在着许多不足之处,还望大家指点与纠正。坚持博客精神,分享是一种快乐!
本文出自 “学而思” 博客,请务必保留此出处http://linhongyu.blog.51cto.com/6373370/1406867