在做远程智能水表管理系统这个过程有一个功能是在注册页面可以使用手机注册,找了许久才大致了解了手机验证码实现流程,今天在此和大家分享一下。

短信验证码实现流程

1、构造手机验证码:使用random对象生成要求的随机数作为验证码,例如4位验证码:1000~9999之间随机数;
2、使用接口向短信平台发送手机号和验证码数据,然后短信平台再把验证码发送到制定手机号上,接口参数一般包括:目标手机号,随机验证码(或包含失效时间),平台接口地址,平台口令;
3、保存接口返回的信息(一般为json文本数据,然后需转换为json对象格式);
4、将手机号--验证码、操作时间存入Session中,作为后面验证使用;
5、接收用户填写的验证码及其他数据;
6、对比提交的验证码与Session中的验证码是否一致,同时判断提交动作是否在有效期内;
7、验证码正确且在有效期内,请求通过,处理相应的业务。

今天我们就前4步进行实现:

为了简化流程,我们在就使用固定手机验证码而不采用随机产生的数作为验证码
在此我们有一个前端页面一个后台逻辑处理页面,下面就该两项进行简单说明:

前端页面

<body>
        <h1>
            <%
            Send send = new Send();
            String PostData = "account=JamesXT&password=18770918982lkx&mobile=18770918982&content="+java.net.URLEncoder.encode("您的订单编码:4557。如需帮助请联系客服。","utf-8");
            //out.println(PostData);
            String ret = Send.SMS(PostData, "http://sms.106jiekou.com/utf8/sms.aspx");
            out.println(ret);
            //请自己反序列化返回的字符串并实现自己的逻辑
        %>

        </h1>
    </body>

PostData:就是想短信服务平台提交的待处理的数据,它一般包括短信服务平台注册者的用户账号名,密码,以及你想向谁发送短信验证码以及短信验证码所属信息的完整内容。

 String ret = Send.SMS(PostData, "http://sms.106jiekou.com/utf8/sms.aspx"); 
 
 这个是将数据和短信服务平台的网址进行绑定,即该提交数据交付哪个平台进行处理。
 

后台逻辑处理类:

public class Send {

   //SMS方法中有两个参数,这个参数是由前台页面提交的PostData和前者绑定的短信服务地址确定的
    public static String SMS(String postData, String postUrl) {
        try {
            //发送POST请求
            URL url = new URL(postUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            conn.setRequestProperty("Connection", "Keep-Alive");
            conn.setUseCaches(false);
            conn.setDoOutput(true);

            conn.setRequestProperty("Content-Length", "" + postData.length());
            OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
            //将前台提交的数据放入输出流中,即向短信服务平台发送该条业务请求
            out.write(postData);
            out.flush();
            out.close();

            //获取响应状态码
            if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
                System.out.println("connect failed!");
                return "";
            }
            //获取响应内容
            String line, result = "";
            BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
            while ((line = in.readLine()) != null) {
                result += line + "\n";
            }
            in.close();
            return result;
        } catch (IOException e) {
            e.printStackTrace(System.out);
        }
        return "";
    }
}

最后附上Demo源码地址:链接:https://pan.baidu.com/s/1bYwLpc 密码:8lfr
本demo所用短信服务商地址为:http://www.106jiekou.com/memb...


james
202 声望24 粉丝