发送手机短信获取验证码功能

发送手机短信获取验证码功能
2014-05-05 20:42:05
原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://linhongyu.blog.51cto.com/6373370/1406867

   因为移动端的方便,现在网络上很多的网站与应用都有与实现用户手机绑定的功能。这样做的好处很多,例如账号登陆、修改密码、在线支付……等功能模块都可以与手机实时获取验证码短信结合,来确保用户的安全性操作。

   而这整功能模块的实现,我把它大致分为三个步骤:

(1)前端触发获取验证码,同步显示有效验证倒计时;

(2)后台通过代理平台发送验证短信;

(3)用户提交验证信息,后台逻辑判断处理。


一、首先,与大家分享下前端的实现:

wKiom1Nnc0XxcjVdAAFQar-_Rag420.jpg

如图:输入完正确的手机号码后再触发有效验证倒计时。

js代码如下(头部需引入jQuery):

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 );
     }
}

   因为涉及到隐私,所以什么地址、用户名密码之类的,自己去向运营商联系获取吧……

   要注意哦:这个类里引入了importcom.jasson.im.api.APIClient;

   还有就是项目中也必须加一个jar包:ImApi.jar

如果有去和运营商合作的话,他们会给你文档和所需的开发包之类的,所以你大可放心。


   嗯,该功能模块的核心内容都已经介绍得差不多了,就只剩下用户查看短信验证信息,输入了传到后台,然后再获取刚才发送短信成功时存入session中连个值进行对比验证。我也就不在此啰嗦……


   结语:天下没有白吃的午餐,垄断行业就是屌。水平不足,文章中也许存在着许多不足之处,还望大家指点与纠正。坚持博客精神,分享是一种快乐!



本文出自 “学而思” 博客,请务必保留此出处http://linhongyu.blog.51cto.com/6373370/1406867

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值