首先就是导入相关的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+"×tamp="+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+":验证码");
}
}