java实现发送手机验证码
来源:互联网 发布:网络女歌手唱的谁不是 编辑:程序博客网 时间:2024/05/22 16:57
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);// }}
至此,短信验证码发送类就写完了。
第一次写博客,很多地方描述的不完整,还请见谅。
阅读全文
0 0
- java实现手机发送验证码
- java实现发送手机验证码
- Java实现发送手机验证码
- java发送手机验证码
- 用户登录,实现发送手机验证码。
- js实现手机验证码发送
- java功能模块--给手机发送验证码
- java给手机发送验证码思路
- java调接口实现发送手机短信验证码功能,手机验证码,接口调用
- java调接口实现发送手机短信验证码功能,手机验证码,接口调用
- java调接口实现发送手机短信验证码功能,手机验证码,接口调用
- java调接口实现发送手机短信验证码功能,手机验证码,接口调用
- Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用
- Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用
- Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用
- Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用
- Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用
- Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用
- Hbase的TTL字段超时设置测试
- mysql查询user_id重复数据
- QMenu增加带滚动条的子菜单
- c语言:二维数组传递方法
- C语言Sigsetjmp函数的用法
- java实现发送手机验证码
- 关于SpringMVC的作用域SessionScope
- java.lang.UnsatisfiedLinkError: E:\tomcat\apache-tomcat-7.0.56\bin\tcnative-1.dll: Can't load IA 64-
- Kotlin最简单的入门教程——关键字,操作符,异常,空指针
- 转onpaint ondraw
- CentOS7配置本地Yum源
- 深度优先遍历之树边,前向边,回边,横跨边
- 保存页面文本到本地文件&&读取本地文件内容到页面
- 控制面板SVN提交代码需要忽略的文件及文件夹