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

 更新时间:2016年12月21日 09:06:53   作者:小珂椰子皮  
本文以注册为例,在SpringMVC+Spring+Mybatis框架的基础上完成该短信验证码功能。需要的朋友一起来看下吧

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

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

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

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

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

首先将短信平台接口代码列出:这里要下载三个jar包commons-logging-1.1.1.jarcommons-httpclient-3.1.jarcommons-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.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")};

该接口中还有一个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<String,String> getMessageStatus(String phone)throws Exception{
HashMap<String,String> m=new HashMap<String,String>();
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 = UrlDefine.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<String, String> 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在本地进行测试:

结果:

到此发送成功。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

相关文章

  • 为什么Java中都不用a.equals(b)判断对象相等

    为什么Java中都不用a.equals(b)判断对象相等

    在面试中经常会被问,a.equals(b)和“==”的区别,那么a.equals(b)能不能判断对象相等,本文就来详细的介绍一下
    2021-06-06
  • SpringBoot之如何指定配置文件启动

    SpringBoot之如何指定配置文件启动

    这篇文章主要介绍了SpringBoot之如何指定配置文件启动问题,具有很好的参考价值,希望对大家有所帮助。
    2023-04-04
  • SpringBoot调用Poi-tl实现渲染数据并生成Word文档

    SpringBoot调用Poi-tl实现渲染数据并生成Word文档

    这篇文章主要为大家详细介绍了SpringBoot如何调用Poi-tl实现渲染数据并生成Word文档,文中的示例代码讲解详细,有需要的小伙伴可以了解下
    2023-09-09
  • SpringBoot如何基于POI-tl和word模板导出庞大的Word文件

    SpringBoot如何基于POI-tl和word模板导出庞大的Word文件

    这篇文章主要介绍了SpringBoot如何基于POI-tl和word模板导出庞大的Word文件,poi-tl是一个基于Apache POI的Word模板引擎,也是一个免费开源的Java类库
    2022-08-08
  • Java9中操作和查询本地进程信息的示例详解

    Java9中操作和查询本地进程信息的示例详解

    这篇文章主要为大家详细介绍了Java9中操作和查询本地进程信息的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • java 文件流的处理方式 文件打包成zip

    java 文件流的处理方式 文件打包成zip

    这篇文章主要介绍了java 文件流的处理方式 文件打包成zip,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • spring中BeanUtils.copyProperties的使用(深拷贝,浅拷贝)

    spring中BeanUtils.copyProperties的使用(深拷贝,浅拷贝)

    本文主要介绍了spring中BeanUtils.copyProperties的使用(深拷贝,浅拷贝),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 详解Java设计模式——迭代器模式

    详解Java设计模式——迭代器模式

    这篇文章主要介绍了Java设计模式——迭代器模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • springboot整合kaptcha生成验证码功能

    springboot整合kaptcha生成验证码功能

    这篇文章主要介绍了springboot整合kaptcha生成验证码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Java软件设计模式之桥接模式详解

    Java软件设计模式之桥接模式详解

    这篇文章主要介绍了Java软件设计模式之桥接模式详解,桥接模式也叫做桥梁模式,结构型设计模式的一种,顾名思义,就是用来连接两个部分,为被分离了的抽象部分和实现部分搭桥,需要的朋友可以参考下
    2023-07-07

最新评论