Java手机验证码的实现
来源:互联网 发布:阿里云华南 编辑:程序博客网 时间:2024/06/15 18:34
接入手机验证码的实现需要第三方平台提供的接口
这里我使用的是 美圣 的,这种平台有很多,大家自行选择,比如网易云,容联等等,都有免费的短信数量以供测试,接口不一样,实现的方式大同小异
下面是我实现的代码片,供参考
这是一个测试类
基于http
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;import java.util.HashMap;import java.util.Iterator;import java.util.Map;/** * @ClassName: ApiDemo * @Description: TODO * */public class ApiDemo4Java { /** * 短信提供商开设账号时提供一下参数: * * 账号、密码、通信key、IP、端口 */ static String account = "你的账号"; static String password = "你的密码"; static String veryCode = "通信key"; static String http_url = "IP和端口"; public static String vcode = createRandomVcode(); /** * 默认字符编码集 */ public static final String CHARSET_UTF8 = "UTF-8"; public static String createRandomVcode(){ //验证码 StringBuffer buffer = new StringBuffer(); for (int i = 0; i < 4; i++) { buffer.append((int)(Math.random() * 9)); } return buffer.toString(); } /** * 查询账号余额 * @return 账号余额,乘以10为短信条数 * String xml字符串,格式请参考文档说明 */ public static String getBalance(){ String balanceUrl = http_url + "/service/httpService/httpInterface.do?method=getAmount"; Map<String,String> params = new HashMap<String,String>(); params.put("username",account); params.put("password",password); params.put("veryCode",veryCode); String result = sendHttpPost(balanceUrl, params); return result; } /** * 发送普通短信 普通短信发送需要人工审核 * 请求地址: * UTF-8编码:/service/httpService/httpInterface.do?method=sendUtf8Msg * GBK编码:/service/httpService/httpInterface.do?method=sendGbkMsg * @param mobile 手机号码, 多个号码以英文逗号隔开,最多支持100个号码 * @param content 短信内容 * @return * String xml字符串,格式请参考文档说明 */ public static String sendSms(String mobile,String content){ String sendSmsUrl = http_url + "/service/httpService/httpInterface.do?method=sendMsg"; Map<String,String> params = new HashMap<String,String>(); params.put("username", account); params.put("password", password); params.put("veryCode", veryCode); params.put("mobile", mobile); params.put("content", content); params.put("msgtype", "1"); params.put("code", "utf-8"); String result = sendHttpPost(sendSmsUrl, params); return result; } /** * 模版短信,无需人工审核,直接发送 * (短信模版的创建参考客户端操作手册) * 模版:@1@会员,动态验证码@2@(五分钟内有效)。请注意保密,勿将验证码告知他人。 * 参数值:@1@=某某,@2@=4293 * 手机接收内容:【短信签名】某某会员,动态验证码4293(五分钟内有效)。请注意保密,勿将验证码告知他人。 * * 请求地址: * UTF-8编码:/service/httpService/httpInterface.do?method=sendUtf8Msg * GBK编码:/service/httpService/httpInterface.do?method=sendGbkMsg * 注意: * 1.发送模板短信变量值不能包含英文逗号和等号(, =) * 2.特殊字符进行转义: * + %2b * 空格 %20 * & %26 * % %25 * @param mobile 手机号码 * @param tplId 模板编号,对应客户端模版编号 * @param content 模板参数值,以英文逗号隔开,如:@1@=某某,@2@=4293 * @return xml字符串,格式请参考文档说明 */ public static String sendTplSms(String mobile,String tplId,String content){ String sendTplSmsUrl = http_url + "/service/httpService/httpInterface.do?method=sendUtf8Msg"; Map<String,String> params = new HashMap<String,String>(); params.put("username", account); params.put("password", password); params.put("veryCode", veryCode); params.put("mobile", mobile); params.put("content", content); //变量值,以英文逗号隔开 params.put("msgtype", "2"); //2-模板短信 params.put("tempid", tplId); //模板编号 params.put("code", "utf-8"); String result = sendHttpPost(sendTplSmsUrl, params); return result; } /*** * 查询下发短信的状态报告 * @return * String xml字符串,格式请参考文档说明 */ public static String queryReport(){ String reportUrl = http_url + "/service/httpService/httpInterface.do?method=queryReport"; Map<String,String> params = new HashMap<String,String>(); params.put("username", account); params.put("password", password); params.put("veryCode", veryCode); String result = sendHttpPost(reportUrl, params); return result; } /** * 查询上行回复短信 * @return * String xml字符串,格式请参考文档说明 */ public static String queryMo(){ String moUrl = http_url + "/service/httpService/httpInterface.do?method=queryMo"; Map<String,String> params = new HashMap<String,String>(); params.put("username", account); params.put("password", password); params.put("veryCode", veryCode); String result = sendHttpPost(moUrl, params); return result; } /*** * * @param apiUrl 接口请求地址 * @param paramsMap 请求参数集合 * @return xml字符串,格式请参考文档说明 * String */ private static String sendHttpPost(String apiUrl, Map<String, String> paramsMap) { String responseText = ""; StringBuilder params = new StringBuilder(); Iterator<Map.Entry<String, String>> iterator = paramsMap.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String, String> entry = iterator.next(); params.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } try { URL url = new URL(apiUrl); URLConnection connection = url.openConnection(); connection.setDoOutput(true); OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), CHARSET_UTF8); out.write(params.toString()); //post的关键所在! out.flush(); out.close(); //读取响应返回值 InputStream is = connection.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is,CHARSET_UTF8)); String temp = ""; while (( temp = br.readLine()) != null) { responseText += temp; } } catch (MalformedURLException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return responseText; } /** * @param args */ public static void main(String[] args) throws Exception{ //查询账号余额 //System.out.println(getBalance()); //发送普通短信,修改接收短信的手机号码及短信内容,多个号码以英文逗号隔开,最多支持100个号码 //System.out.println(sendSms("159*******1,159*******2", "您的验证码是8888,请注意保密,勿将验证码告知他人。")); //System.out.println(sendTplSms("这里是你的手机号码","你的模板的编号","参数=value")); //查询下发短信的状态报告// System.out.println(queryReport()); //查询上行回复短信 //System.out.println(queryMo()); }}
如果发送成功,回返回一个xml字符串
其中的status标签内的text数值就是表示成功与否的标志
你可以解析出来并判断是否发送成功:
import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.DocumentHelper;import org.dom4j.Element;import java.util.List;public class ParseXML { public static String dom4jParse(String xmlString){ try {// //创建 XML 的阅读器(解析器)// SAXReader saxReader = new SAXReader();// //阅读(解析) XML文件// Document document = saxReader.read(file); Document document = DocumentHelper.parseText(xmlString);// //获取根节点 Element rootElement = document.getRootElement();// //得到节点下的所有子节点 List<Element> elements = rootElement.elements(); for(int i=0;i<elements.size();i++){ Element e = elements.get(i); List<Element> mts = e.elements(); for (Element mt :mts) { String name = mt.getName(); if("status".equals(name)){ return mt.getText(); } } } return null; } catch (DocumentException e) { e.printStackTrace(); } return null; }}
状态码分别表示的意思:
阅读全文
0 0
- Java手机验证码的实现
- 【java】webservice实现手机验证码
- java实现手机发送验证码
- java 实现发手机验证码功能
- java实现发送手机验证码
- Java实现发送手机验证码
- java 手机验证码
- java实现手机邮箱格式验证
- Java实现用户注册手机发码送验证
- java 手机验证码功能
- Java 手机验证码生成
- java发送手机验证码
- JAVA验证码的实现
- 验证码的java实现
- java验证码的实现
- Java 验证码的实现
- js获取手机验证码倒计时的实现
- 一个简单的前端获取手机验证码实现
- android 使用websocket 实现简单的聊天。
- NVIDIA DIGITS 安装
- 求两个序列的最长公共子序列
- 无头单链表面试题(3)
- iOS开发—自定义NSOperation子类下载图片
- Java手机验证码的实现
- 信息学奥赛一本通(C++版) 第三部分 数据结构 第四章 图论算法
- 08-图7 公路村村通(30 分)
- java运算符
- Java基础——第一个Java程序
- 1019. 数字黑洞 (20)
- Chrome 控制台console的用法
- 断点续传
- Android 使用多线程来做多文件上传Or下载