最近在做用户登陆注册模块的时候用到了采用第三方短信接口发送短信验证码,查询了一些网站和参考了一些别人的方法,用的是网建短信通的,也可以阿里云平台的或者别的平台的。
首先还是登陆注册用户信息,然后进入这个网站的首页之后我们先进入修改短信密钥拿到自己的安全密钥,然后进入上面的短信API接口页面
可以看到他们官方给出了一个演示demo
import JAVA.io.UnsupportedEncodingException;
import org.Apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
public class SendMsg_webchinese {
public static void main(String[] args)throws Exception
{
HttpClient client = new HttpClient();
PostMethod post = new PostMethod("http://gbk.api.smschinese.cn");
post.addRequestHeader("Content-Type","
Application/x-www-form-urlencoded;charset=gbk");//在头文件中设置转码
NameValuePair[] data ={ new NameValuePair("Uid", "本站用户名"),new NameValuePair("Key", "接口安全秘钥"),new NameValuePair("smsMob","手机号码"),new NameValuePair("smsText","验证码:8888")};
post.setRequestBody(data);
client.executeMethod(post);
Header[] headers = post.getResponseHeaders();
int statusCode = post.getStatusCode();
System.out.println("statusCode:"+statusCode);
for(Header h : headers)
{
System.out.println(h.toString());
}
String result = new String(post.getResponseBodyAsString().getBytes("gbk"));
System.out.println(result); //打印返回消息状态
post.releaseConnection();
}
}
代码还是很容易就能看懂的,我们只需要改的是
NameValuePair[] data ={ new NameValuePair("Uid", "本站用户名"),new NameValuePair("Key", "接口安全秘钥"),new NameValuePair("smsMob","手机号码"),new NameValuePair("smsText","验证码:8888")};
1
可以看到这个Uid就是刚刚我们注册的用户名,key是刚刚获取到的密钥,smsMob就是要发送信息的手机号了,smsText就是要发送的信息。
所以把上面的演示demo稍微修改一下就可以直接使用了:
public static HashMap<String,String> getMessageStatus(String phone)throws Exception
{
HashMap<String,String> map=new HashMap<String,String>();
String code=VerifyingCode();
HttpClient client = new HttpClient();
PostMethod post = new PostMethod("
http://gbk.api.smschinese.cn");//该第三方短信服务地址
post.addRequestHeader("Content-Type",
"
application/x-www-form-urlencoded;charset=gbk");//在头文件中设置转码
NameValuePair[] data = {
new NameValuePair("Uid", "*****"),
new NameValuePair("Key", "*********"),
new NameValuePair("smsMob",phone),
new NameValuePair("smsText","您的验证码是"+code+",有效时间为10分钟,请尽快验证。")
};
map.put("code",code);
post.setRequestBody(data);
client.executeMethod(post);
Header[] headers = post.getResponseHeaders();
int statusCode = post.getStatusCode();
System.out.println("statusCode:"+statusCode);
for(Header h : headers)
{
System.out.println(h.toString());
}
String result = new String(post.getResponseBodyAsString().getBytes("gbk"));
System.out.println(result); //打印返回消息状态,1表示发送成功,其他的小于0的为失败
map.put("result", result);
post.releaseConnection();
return map;
}
//生成六位随机数
public static String VerifyingCode()
{
Random random=new Random();
String code="";
for (int i=0;i<6;i++)
{
code+=random.nextInt(10);
}
System.out.println(code);
return code;
}
我的想法就是定义一个hashmap将生成的验证码与发送的状态放在map里面,那么在service层上进行业务处理的时候就可以直接拿到我们刚刚发送的验证码进行业务处理。
最后还需要导入官方给的三个jar包,依赖如下
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>