手机验证码(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+"×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+":验证码"); } }