手机验证码(Java代码)

首先就是导入相关的jar包,这里用maven依赖:

        <dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.54</version>
		</dependency>

  

创建发送验证码的类:

package com.snm.util;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;

import net.sf.json.JSONObject;

/**
 * 获取短信验证码类
 * @author LB_lfx
 *
 *
 */
public class GetMessage {


    /**
     * 用户ID
     */
    public static final String ACCOUNT_SID = "";//在平台里将sid复制到这里即可

    /**
     * 密钥
     */
    public static final String AUTH_TOKEN = "";//在平台里获取token复制到这里即可

    /**
     * 请求地址前半部分
     */
    public static final String BASE_URL = "https://api.miaodiyun.com/20150822/industrySMS/sendSMS";//请求地址是固定的不用改

    public static  String randNum = RandUtil.getRandNum();//随机数

    public  static String smsContent = null;//信息内容
    /**
     * (获取短信验证码)
     * @param to
     * @return String
     */
    public static String getResult(String to) {
        String randNum = RandUtil.getRandNum();
        smsContent = "【CRM人力资源管理】您的验证码为{" +randNum+ "},请于2分钟内正确输入,如非本人操作,请忽略此短信。";//消息模板,与平台的模板保持一致
        System.out.println(randNum);
        System.out.println(smsContent);
        String args = QueryUtil.queryArguments(ACCOUNT_SID, AUTH_TOKEN, smsContent, to);
        OutputStreamWriter out = null;
        BufferedReader br = null;//读取缓存
        StringBuffer sb = new StringBuffer();


        try {
            URL url = new URL(BASE_URL);//创建链接
            URLConnection connection = url.openConnection(); //打开链接
            connection.setDoOutput(true);//打开URLConnection的OutputStream输出流
            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(),"UTF-8"));
            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();
            }
        }
        //转json格式
        JSONObject jsonObject = JSONObject.fromObject(sb.toString());
        //获取状态码
        Object object = jsonObject.get("respCode");
       System.out.println("状态码:"+object+"验证码:"+randNum);
        if (!object.equals("00000")) {
            return object.toString();//如果发送失败返回状态码
        }else{
            return randNum;
        }

    }
    }

  这里用到的平台是秒滴,以上需要改的是ACCOUNT_SID和AUTH_TOKEN

然后创建随机生成随机数的类:

package com.snm.util;

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

然后一步就是给验证码加密配置类:

package com.snm.util;

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){ //动态参数
    	//加密用户id
        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 {
            	//加密用户id转成16进制数
                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);
    }

}

最后一步就是测试了,在main方法中测试:

package com.snm.test;

import com.snm.util.GetMessage;

public class Test {
 
	public static void main(String[] args) {
		String phone = "15893868533";
		String rod = GetMessage.getResult(phone);
		System.out.println(rod+":验证码");
	}
 
}

  

posted @ 2019-06-11 15:22  白いバラの夜  阅读(640)  评论(3编辑  收藏  举报