JAVA实现利用第三方平台发送短信验证码

网友投稿 218 2023-06-23


JAVA实现利用第三方平台发送短信验证码

前段时间自己做的一个小项目中,涉及到用短信验证码登录、注册的问题,之前没涉及过这一块,看了别人的博客其实也是似懂非懂的,现在就将自己做的利用第三方短信平台来发送验证码这个功能记下来。

本文以注册为例,在SpringMVC+Spring+Mybatis框架的基础上完成该短信验证码功能。

发送短信验证码的原理是:随机生成一个6位数字,将该6位数字保存到session当中,客户端通过sessionid判断对应的session,用户输入的验证码再与session记录的验证码进行比较。

为了防止有广告嫌疑这里就不说短信平台是哪个了。

一般的第三方短信平台都会有他们自己的短信接口,只要读懂他们的接口稍作稍作改变就能满足自己的需求。

首先将短信平台接口代码列出:这里要下载三个jar包commons-logging-1.1.1.jar,commons-httpclient-3.1.jar,commons-codec-1.4.jar

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.sms.webchinese.cn"); //该第三方短信服务地址

post.addTbjqFIeRequestHeader("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")};

该接口中还有一个result信息,它的作用是告诉用户短信发送的状态,1表示发送成功,其他的小于0的为失败,这里只要知道1是成功即可。

我们实际的操作中,验证码肯定是要我们自己生成的。将result信息与验证码一起得到,于是很容易想到用一个HashMap集合。下面是以项目自己的需求对接口的更改:

import java.util.HashMap;

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;

import com.yuetile.utils.VerifyingCodeGenerator;

public class SendMsg_webchineseController {

public static HashMap getMessageStatus(String phone)throws Exception{

HashMap m=new HashMap();

HttpClient client = new HttpClient();

PostMethod post = new PostMethod("http://gbk.sms.webchinese.cn");

post.addRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=gbk");//在头文件中设置转码

String code=VerifyingCodeGenerator.generate();//验证码

NameValuePair[] data ={ new NameValuePair("Uid", "****"),new NameValuePair("Key", "******"),new NameValuePair("smsMob",phone),new NameValuePair("smsText","您正在注册本站会员,本次验证码为:"+code+""+"有效时间为5分钟")};

m.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); //打印返回消息状态

m.put("result", result);

post.releaseConnection();

return m;

}

}

***表示的是在第三方平台注册的账号密码。

ACTION层:

/**

* @author hang

* @Decription 注册,发送短信验证码,保存到Session中

* @param 封装客户端请求 POST

* @return 返回状态参数

* @throws Exception

*/

@ResponseBody

@RequestMapping(value = Uhttp://rlDefine.Register.CHECKMESSAGEWORK, method = RequestMethod.POST)

public Object SendCheckMessage(HttpServletRequest request, @RequestBody UserBean u)

throws Exception {

String message = "发送成功";

String phone=u.getTelephone(); //获取到客户端发来的手机号

UserBean user = userService.getByPhone(phone);

if (user != null) {

message = "该手机号已被注册";

return new Response(Status.ERROR, message);

} else {

HashMap m = SendMsg_webchineseController.getMessageStatus(phone); //应用发送短信接口

String result = m.get("result"); //获取到result值

if (result.trim().equals("1")) { //如果为1,表示成功发送

String code = m.get("code"); //获取发送的验证码内容

logger.info("发送的验证码:"+code); //打印日志

HttpSession session = request.getSession(); //设置session

session.setAttribute("code", code); //将短信验证码放到session中保存

session.setMaxInactiveInterval(60 * 5);//保存时间 暂时设定为5分钟

return new Response(Status.SUCCESS, message);

} else {

message = "短信发送失败";

return new Response(Status.ERROR, message);

}

}

}

这样就能发送成功了。

测试:

利用POSTMAN在本地进行测试:

结果:

到此发送成功。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:利用Bootstrap实现表格复选框checkbox全选
下一篇:Java对List进行排序的两种实现方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~