您的位置:首页 > 编程语言 > Java开发

java实现发送手机验证码

2017-06-15 10:48 225 查看

java手机验证码发送功能

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

项目目录结构,短信发送所需的类在util包里(JsonResult不是)



我们可以看一下短信码通知短信的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+"×tamp="+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);
//  }
}


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

第一次写博客,很多地方描述的不完整,还请见谅。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐