Java实现发送短信验证码功能

时间:2022-11-06 18:06:47

一个发送短信验证码的功能,使用的是信易通的短信平台接口,然后在Java中使用HttpClient模拟POST请求或者GET请求(看短信平台要求,一般的情况下都是POST请求),调用短信平台提供的接口(遵循短信平台的接口规范即可)。具体看代码:

使用HttpClient的时候需要在项目中引入:

commons-httpclient-3.1.jar

这个jar包,

项目结构:

Java实现发送短信验证码功能

1、创建一个Http的模拟请求工具类,然后写一个POST方法或者GET方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/**
 * 文件说明
 * @Description:扩展说明
 * @Copyright: 2015 dreamtech.com.cn Inc. All right reserved
 * @Version: V6.0
 */
package com.demo.util;
 
import java.io.IOException;
import java.util.Map;
 
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.SimpleHttpConnectionManager;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
 
/**
 * @Author: feizi
 * @Date: 2015年4月17日 上午9:26:34
 * @ModifyUser: feizi
 * @ModifyDate: 2015年4月17日 上午9:26:34
 * @Version:V6.0
 */
public class HttpRequestUtil {
 
 /**
  * HttpClient 模拟POST请求
  * 方法说明
  * @Discription:扩展说明
  * @param url
  * @param params
  * @return String
  * @Author: feizi
  * @Date: 2015年4月17日 下午7:15:59
  * @ModifyUser:feizi
  * @ModifyDate: 2015年4月17日 下午7:15:59
  */
 public static String postRequest(String url, Map<String, String> params) {
  //构造HttpClient的实例
  HttpClient httpClient = new HttpClient();
 
  //创建POST方法的实例
  PostMethod postMethod = new PostMethod(url);
 
  //设置请求头信息
  postMethod.setRequestHeader("Connection", "close");
 
  //添加参数
  for (Map.Entry<String, String> entry : params.entrySet()) {
   postMethod.addParameter(entry.getKey(), entry.getValue());
  }
 
  //使用系统提供的默认的恢复策略,设置请求重试处理,用的是默认的重试处理:请求三次
  httpClient.getParams().setBooleanParameter("http.protocol.expect-continue", false);
 
  //接收处理结果
  String result = null;
  try {
   //执行Http Post请求
   httpClient.executeMethod(postMethod);
 
   //返回处理结果
   result = postMethod.getResponseBodyAsString();
  } catch (HttpException e) {
   // 发生致命的异常,可能是协议不对或者返回的内容有问题
   System.out.println("请检查输入的URL!");
   e.printStackTrace();
  } catch (IOException e) {
   // 发生网络异常
   System.out.println("发生网络异常!");
   e.printStackTrace();
  } finally {
   //释放链接
   postMethod.releaseConnection();
 
   //关闭HttpClient实例
   if (httpClient != null) {
    ((SimpleHttpConnectionManager) httpClient.getHttpConnectionManager()).shutdown();
    httpClient = null;
   }
  }
  return result;
 }
 
 /**
  * HttpClient 模拟GET请求
  * 方法说明
  * @Discription:扩展说明
  * @param url
  * @param params
  * @return String
  * @Author: feizi
  * @Date: 2015年4月17日 下午7:15:28
  * @ModifyUser:feizi
  * @ModifyDate: 2015年4月17日 下午7:15:28
  */
 public static String getRequest(String url, Map<String, String> params) {
  //构造HttpClient实例
  HttpClient client = new HttpClient();
 
  //拼接参数
  String paramStr = "";
  for (String key : params.keySet()) {
   paramStr = paramStr + "&" + key + "=" + params.get(key);
  }
  paramStr = paramStr.substring(1);
 
  //创建GET方法的实例
  GetMethod method = new GetMethod(url + "?" + paramStr);
 
  //接收返回结果
  String result = null;
  try {
   //执行HTTP GET方法请求
   client.executeMethod(method);
 
   //返回处理结果
   result = method.getResponseBodyAsString();
  } catch (HttpException e) {
   // 发生致命的异常,可能是协议不对或者返回的内容有问题
   System.out.println("请检查输入的URL!");
   e.printStackTrace();
  } catch (IOException e) {
   // 发生网络异常
   System.out.println("发生网络异常!");
   e.printStackTrace();
  } finally {
   //释放链接
   method.releaseConnection();
 
   //关闭HttpClient实例
   if (client != null) {
    ((SimpleHttpConnectionManager) client.getHttpConnectionManager()).shutdown();
    client = null;
   }
  }
  return result;
 }
}

2、在创建一个类,生成验证码,然后传递相应的参数(不同的短信平台接口会有不同的参数要求,这个一般短信平台提供的接口文档中都会有的,直接看文档然后按要求来即可)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/**
 * 文件说明
 * @Description:扩展说明
 * @Copyright: 2015 dreamtech.com.cn Inc. All right reserved
 * @Version: V6.0
 */
package com.demo.util;
 
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
 
/**
 * @Author: feizi
 * @Date: 2015年4月17日 上午9:24:48
 * @ModifyUser: feizi
 * @ModifyDate: 2015年4月17日 上午9:24:48
 * @Version:V6.0
 */
public class SendMsgUtil {
 
 /**
  * 发送短信消息
  * 方法说明
  * @Discription:扩展说明
  * @param phones
  * @param content
  * @return
  * @return String
  * @Author: feizi
  * @Date: 2015年4月17日 下午7:18:08
  * @ModifyUser:feizi
  * @ModifyDate: 2015年4月17日 下午7:18:08
  */
 @SuppressWarnings("deprecation")
 public static String sendMsg(String phones,String content){
  //短信接口URL提交地址
  String url = "短信接口URL提交地址";
 
  Map<String, String> params = new HashMap<String, String>();
 
  params.put("zh", "用户账号");
  params.put("mm", "用户密码");
  params.put("dxlbid", "短信类别编号");
  params.put("extno", "扩展编号");
 
  //手机号码,多个号码使用英文逗号进行分割
  params.put("hm", phones);
  //将短信内容进行URLEncoder编码
  params.put("nr", URLEncoder.encode(content));
 
  return HttpRequestUtil.getRequest(url, params);
 }
 
 /**
  * 随机生成6位随机验证码
  * 方法说明
  * @Discription:扩展说明
  * @return
  * @return String
  * @Author: feizi
  * @Date: 2015年4月17日 下午7:19:02
  * @ModifyUser:feizi
  * @ModifyDate: 2015年4月17日 下午7:19:02
  */
 public static String createRandomVcode(){
  //验证码
  String vcode = "";
  for (int i = 0; i < 6; i++) {
   vcode = vcode + (int)(Math.random() * 9);
  }
  return vcode;
 }
 
 /**
  * 测试
  * 方法说明
  * @Discription:扩展说明
  * @param args
  * @return void
  * @Author: feizi
  * @Date: 2015年4月17日 下午7:26:36
  * @ModifyUser:feizi
  * @ModifyDate: 2015年4月17日 下午7:26:36
  */
 public static void main(String[] args) {
//  System.out.println(SendMsgUtil.createRandomVcode());
//  System.out.println("&ecb=12".substring(1));
  System.out.println(sendMsg("18123456789,15123456789", "尊敬的用户,您的验证码为" + SendMsgUtil.createRandomVcode() + ",有效期为60秒,如有疑虑请详询400-069-2886(客服电话)【XXX中心】"));
 }
}

然后执行一下,一般的情况下参数传递正确,按照接口文档的规范来操作的话,都会发送成功的,手机都能收到验证码的,然后可能会出现的问题就是:发送的短信内容有可能会出现中文乱码,然后就会发送不成功,按照短信平台的要求进行相应的编码即可。一般都会是UTF-8编码。

完整代码:sendmassage

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://blog.csdn.net/hu1991die/article/details/45101651