java实现发送手机验证码

来源:互联网 发布:网络女歌手唱的谁不是 编辑:程序博客网 时间:2024/05/22 16:57

java手机验证码发送功能

现在很多网页应用的登录注册都需要用到手机验证码,正好这几天公司也有个新项目,其中注册账户就需要验证码。在网上找了一些资料学习了以后,自己也写了一个短信发送功能。我用的短信平台是秒嘀科技http://www.miaodiyun.com/。这个注册就有200条免费短信,在开发阶段测试用很方便。


项目目录结构,短信发送所需的类在util包里(JsonResult不是)
这是我的项目结构,短信发送的几个类都在util包里。

我们可以看一下短信码通知短信的API文档
这是请求参数

这是请求地址和请求方式
注册登录后,ACCOUNT SID和****AUTH TOKEN平台都会给你。smsContent是需要我们在模板中创建的短信内容,审核过后才能使用。在后面的类中,也必须严格按照模板去定义内容。

代码块

首先是生成验证码的RandUtil类。这里验证码我定义的是6位数,利用随机数生成,为GetMessage提供验证码。

import java.util.Random;public class RandUtil {    public static String getRandNum() {        String randNum = new Random().nextInt(1000000)+"";        System.out.println("生成"+randNum);        if (randNum.length()!=6) {   //如果生成的不是6位数随机数则返回该方法继续生成            return getRandNum();        }        return randNum;    }}

然后是一个发送验证码的工具类QueryUtil。这个类我们在里面写MD5的签名加密sig和时间戳timestamp的获取

import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.text.SimpleDateFormat;import java.util.Date;/** * 类描述:发送验证码工具类 */public class QueryUtil {    public static String queryArguments(String ACCOUNT_SID,String AUTH_TOKEN, String smsContent,String to) {        String timestamp = getTimestamp(); //时间戳        String sig =  MD5(ACCOUNT_SID,AUTH_TOKEN,timestamp);//签名认证        String str = "accountSid="+ACCOUNT_SID+"&smsContent="+                smsContent+"&to="+to+"&timestamp="+timestamp+"&sig="+sig;        return str;    }    /**     * MD5加密     * @param args     * @return     */    public static String MD5(String... args){ //动态参数        StringBuffer result = new StringBuffer();        if (args == null || args.length == 0) {            return "";        } else {            StringBuffer str = new StringBuffer();            for (String string : args) {                str.append(string);            }            System.out.println("加密前:\t"+str.toString());            try {                MessageDigest digest = MessageDigest.getInstance("MD5");                byte[] bytes = digest.digest(str.toString().getBytes());                for (byte b : bytes) {                    String hex = Integer.toHexString(b&0xff);  //转化十六进制                    if (hex.length() == 1) {                        result.append("0"+hex);                    }else{                        result.append(hex);                    }                }            } catch (NoSuchAlgorithmException e) {                e.printStackTrace();            }        }        System.out.println("加密后:\t"+result.toString());        return result.toString();    }    /*     * 获取时间戳     */    public static String getTimestamp(){        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");        Date date = new Date();        return sdf.format(date);    }}

写完这些工具类以后就可以开始写获取短信验证码类GetMessage。因为用到JSONObject所以需要导入以下几个包:
这里写图片描述

import net.sf.json.JSONObject;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.URL;import java.net.URLConnection;/** * 获取短信验证码类 * @author LB_lfx * * */public class GetMessage {    /**     * 用户ID     */    public static final String ACCOUNT_SID = "7e04461fad07********7e478e3eec663";//这里填写你在平台里的ACOUNT_SID    /**     * 密钥     */    public static final String AUTH_TOKEN = "10aa253a6ece4********ae987032b66";    /**     * 请求地址前半部分     */    public static final String BASE_URL = "https://api.miaodiyun.com/20150822/industrySMS/sendSMS";//请求地址是固定的不用改    public static  String randNum = RandUtil.getRandNum();    public  static String smsContent = "【****】您的验证码为"+randNum+",请于"+2+"分钟内正确输入,如非本人操作,请忽略此短信。";    /**     * (获取短信验证码)     * @param to     * @return String     */    public static String getResult(String to) {        randNum = RandUtil.getRandNum();        String smsContent = "【****】您的验证码为"+randNum+",请于"+2+"分钟内正确输入,如非本人操作,请忽略此短信。";            //这里的randNum 和 smsContent和上面的静态变量是一样的,可删除可保留        String args = QueryUtil.queryArguments(ACCOUNT_SID, AUTH_TOKEN, smsContent, to);        OutputStreamWriter out = null;        InputStream in = null;        BufferedReader br = null;        StringBuffer sb = new StringBuffer();        try {            URL url = new URL(BASE_URL);            URLConnection connection = url.openConnection(); //打开链接            connection.setDoOutput(true);            connection.setDoInput(true);            connection.setConnectTimeout(5000);  //设置链接超时            connection.setReadTimeout(10000);    //设置读取超时            //提交数据            out = new OutputStreamWriter(connection.getOutputStream(),"utf-8");            out.write(args);            out.flush();            //读取返回数据            br = new BufferedReader(new InputStreamReader(connection.getInputStream()));            String line = "";            while((line = br.readLine())!=null){                sb.append(line);            }        } catch (Exception e) {            e.printStackTrace();        }finally {            try {                if (br!=null) {                    br.close();                }                if (out!=null) {                    out.close();                }            } catch (Exception e2) {                e2.printStackTrace();            }        }        JSONObject jsonObject = JSONObject.fromObject(sb.toString());        System.out.println(jsonObject);        Object object = jsonObject.get("respCode");        System.out.println("状态码:"+object+"验证码:"+randNum);        System.out.println(!object.equals("00000"));        if (!object.equals("00000")) {            return object.toString();        }else{            return randNum;        }    }//  测试功能//  public static void main(String[] args) {//      String result = getResult("你的手机号");//      System.out.println("验证码:"+randNum+"\t"+result);//  }}

至此,短信验证码发送类就写完了。

第一次写博客,很多地方描述的不完整,还请见谅。


阅读全文
0 0
原创粉丝点击