短信验证码跟自己在Servlet画的验证码不一样,我们不用管短信验证码是怎么产生的,我们只需要关注如何调用短信验证码,在短信验证码里面添加

自己需要的随机数或者其他的内容。

现在直接上流程

第一步找一个给用户发送短信的短信平台,我这里用的秒滴科技的短信平台,新人注册有10元的免费额度,一条短信几分,够我们测试用了。

第二步 找到配置管理里面的验证码短信模板自己写好申请过了就可以备用了。如下图所示

第三步 在右上角有个API文档点进去,左边有个开发者中心,里面有个Https API 点开里面有个验证码通知短信,这个是这个短信平台接口的规则,必须要满足平台接口的要求的参数

还有下面的必选参数如下图截图,必选的参数待会再后台都必选要有不然会报错。

第四步 进入Eelipse写我们的后台代码 。直接上代码我的方法是在Dao层里面写的,自己定义了一个SmsDao短信验证码的持久接口。

package www.meizu.com.dao.impl;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random; import www.meizu.com.dao.SmsDao;
/**
* 生产短信验证码持久接口实现类
* @author Administrator
*
*/
public class SmsDaoImpl implements SmsDao{
//这里的3个String 属性对应的用户中心里的开发者信息里面的ACCOUNT SID 和 AUTHTOKEN 还有验证码通知短信接口中的请求地址这3个属性待会需要用到
private String sendUrl="https://api.miaodiyun.com/20150822/industrySMS/sendSMS";
private String ACCOUNTSID="d85da4485e094a5296c2d401f459d487";
private String AUTHTOKEN="e225e0ef637046bc8eb72818923a808c";

然后我们开始满足平台的必要的参数。当然我们从最简单的参数开始满足,我首先满足的时间戳这个参数,方法很简单如以下代码

/**
* 获取时间戳,生产短信验证码需要时间戳
* @return
*/
public static String getTimeStamp(){
return new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
}

然后在满足短信签名,平台要求需要MD5加密,32位小写

/**
* 短信签名,生产短信验证码需要签名
* 签名。MD5(ACCOUNT SID + AUTH TOKEN + timestamp)共32位(小写)。
* @param sdk 开发者账号
* @param token 开发者密码
* @param timeStamp 时间戳
* @return
*/
public static String getMD5(String sdk,String token,String timeStamp){
StringBuilder sb=new StringBuilder();
String source=sdk+token+timeStamp;
try {
MessageDigest md=MessageDigest.getInstance("MD5");
byte[] b=md.digest(source.getBytes());
for (byte c : b) {
String hex=Integer.toHexString(c&0xff);
if(hex.length()==1){
sb.append("0"+hex);
}else{
sb.append(hex);
}
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return sb.toString();

然后是请求参数拼接,注释的模板是API文档上的模板复制API文档上的就可以了,每个人的请求参数模板好像都不一样

/**
* 请求参数拼接
* @param accounSid
* @param smsContent
* @param to
* @param timestamp
* @param sig
* @param respDataType
* @return 返回拼接好的参数
*/
public static String pinJie(String accounSid,String smsContent,String to,String timestamp,String sig,String respDataType){
//accountSid=a14f6bfd43ce44c9b019de57f4e2de4b&smsContent=【秒嘀科技 to】您的验证码是345678,30分钟输入有效。
//&to=13896543210&timestamp=20150821100312&sig=a14f6bfd43ue44c9b019du57f4e2ee4r&respDataType=JSON
return "accountSid="+accounSid+"&smsContent="+smsContent+"&to="+to+"&timestamp="+timestamp+"&sig="+sig+"&respDataType="+respDataType;
}

然后生成短信验证码里面的数字

/**
* 生成短信验证码
* @return 返回验证码
*/
public static String smsCode(){
String code=new Random().nextInt(1000000)+"";
if(code.length()!=6){
return smsCode();//不够6位,再次调用自己的方法,递归
}else{
return code;
}
}

接下来往平台发送我们参数

@Override
public String getSmsCode(String phone) {
String smsCode=smsCode();//获取随机短信验证码
code=smsCode;
String timeStamp=getTimeStamp();//获取时间戳
String md5=getMD5(ACCOUNTSID,AUTHTOKEN,timeStamp);//获取签名
String smsMoban="【j37】尊敬的用户,您的验证码为"+smsCode;
StringBuilder sb=new StringBuilder();
try {
URL url=new URL(sendUrl);//导net的包
HttpURLConnection connection=(HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");//设置传送数据的方式
connection.setDoInput(true);//设置是否允许数据写入
connection.setDoOutput(true);//设置是否允许数据输出
connection.setConnectTimeout(5000);//设置连接时间
connection.setReadTimeout(10000);//设置读取参数的时间
connection.setRequestProperty("Content-type","application/x-www-form-urlencoded");//设置请求头
String args=pinJie(ACCOUNTSID,smsMoban,phone,timeStamp,md5,"JSON");
System.out.println(args);
osw=new OutputStreamWriter(connection.getOutputStream(),"UTF-8");
osw.write(args);
osw.flush();
//读取返回参数
br=new BufferedReader(new InputStreamReader(connection.getInputStream(),"UTF-8"));
String temp="";
while((temp=br.readLine())!=null){
sb.append(temp);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();

代码比较分散这里上一个完整的方法代码

package www.meizu.com.dao.impl;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random; import www.meizu.com.dao.SmsDao;
/**
* 生产短信验证码持久接口实现类
* @author Administrator
*
*/
public class SmsDaoImpl implements SmsDao{
//这里的3个String 属性对应的用户中心里的开发者信息里面的ACCOUNT SID 和 AUTHTOKEN 还有验证码通知短信接口中的请求地址这3个属性待会需要用到
private String sendUrl="https://api.miaodiyun.com/20150822/industrySMS/sendSMS";
private String ACCOUNTSID="d85da4485e094a5296c2d401f459d487";
private String AUTHTOKEN="e225e0ef637046bc8eb72818923a808c";
OutputStreamWriter osw=null;
BufferedReader br=null;
private String code=""; /**
* 获取6位数验证码的方法
* @return
*/
public String getCode(){
return code;
}
@Override
public String getSmsCode(String phone) {
String smsCode=smsCode();//获取随机短信验证码
code=smsCode;
String timeStamp=getTimeStamp();//获取时间戳
String md5=getMD5(ACCOUNTSID,AUTHTOKEN,timeStamp);//获取签名
String smsMoban="【j37】尊敬的用户,您的验证码为"+smsCode;
StringBuilder sb=new StringBuilder();
try {
URL url=new URL(sendUrl);//导net的包
HttpURLConnection connection=(HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");//设置传送数据的方式
connection.setDoInput(true);//设置是否允许数据写入
connection.setDoOutput(true);//设置是否允许数据输出
connection.setConnectTimeout(5000);//设置连接时间
connection.setReadTimeout(10000);//设置读取参数的时间
connection.setRequestProperty("Content-type","application/x-www-form-urlencoded");//设置请求头
String args=pinJie(ACCOUNTSID,smsMoban,phone,timeStamp,md5,"JSON");
System.out.println(args);
osw=new OutputStreamWriter(connection.getOutputStream(),"UTF-8");
osw.write(args);
osw.flush();
//读取返回参数
br=new BufferedReader(new InputStreamReader(connection.getInputStream(),"UTF-8"));
String temp="";
while((temp=br.readLine())!=null){
sb.append(temp);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
/**
* 获取时间戳,生产短信验证码需要时间戳
* @return
*/
public static String getTimeStamp(){
return new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
}
/**
* 短信签名,生产短信验证码需要签名
* 签名。MD5(ACCOUNT SID + AUTH TOKEN + timestamp)共32位(小写)。
* @param sdk 开发者账号
* @param token 开发者密码
* @param timeStamp 时间戳
* @return
*/
public static String getMD5(String sdk,String token,String timeStamp){
StringBuilder sb=new StringBuilder();
String source=sdk+token+timeStamp;
try {
MessageDigest md=MessageDigest.getInstance("MD5");
byte[] b=md.digest(source.getBytes());
for (byte c : b) {
String hex=Integer.toHexString(c&0xff);
if(hex.length()==1){
sb.append("0"+hex);
}else{
sb.append(hex);
}
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return sb.toString();
}
/**
* 生成短信验证码
* @return 返回验证码
*/
public static String smsCode(){
String code=new Random().nextInt(1000000)+"";
if(code.length()!=6){
return smsCode();//不够6位,再次调用自己的方法,递归
}else{
return code;
}
}
/**
* 请求参数拼接
* @param accounSid
* @param smsContent
* @param to
* @param timestamp
* @param sig
* @param respDataType
* @return 返回拼接好的参数
*/
public static String pinJie(String accounSid,String smsContent,String to,String timestamp,String sig,String respDataType){
//accountSid=a14f6bfd43ce44c9b019de57f4e2de4b&smsContent=【秒嘀科技 to】您的验证码是345678,30分钟输入有效。
//&to=13896543210&timestamp=20150821100312&sig=a14f6bfd43ue44c9b019du57f4e2ee4r&respDataType=JSON
return "accountSid="+accounSid+"&smsContent="+smsContent+"&to="+to+"&timestamp="+timestamp+"&sig="+sig+"&respDataType="+respDataType;
} }

短信验证码的方法就写完了,前台点击通过ajax异步请求发送给后台,后台产生结果发送给平台。流程就完了。

java后台通过Servlet给用户发送手机短信验证码,第一次写勿喷,欢迎转载的更多相关文章

  1. 四:java调接口实现发送手机短信验证码功能

    1.点击获取验证码之前的样式: 2.输入正确的手机号后点击获取验证码之后的样式: 3.如果手机号已经被注册的样式: 4.如果一个手机号一天发送超过3次就提示不能发送: 二:前台的注册页面的代码:reg ...

  2. Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用

    近来由于项目需要,需要用到手机短信验证码的功能,其中最主要的是用到了第三方提供的短信平台接口WebService客户端接口,下面我把我在项目中用到的记录一下,以便给大家提供个思路,由于本人的文采有限, ...

  3. django之集成阿里云通信(发送手机短信验证码)

    python3 + django2.0 集成 "阿里云通信" 服务: (SDK文档地址:https://help.aliyun.com/document_detail/55491. ...

  4. 利用java实现的一个发送手机短信的小例子

    今天闲来无事,在微博上看到一个关于用java实现的一个发送手机短信的程序,看了看,写的不太相信,闲的没事,把他整理下来,以后可能用得着 JAVA发送手机短信,流传有几种方法:(1)使用webservi ...

  5. JAVA发送手机短信

    <p><span>JAVA发送手机短信,流传有几种方法:(1)使用webservice接口发送手机短信,这个可以使用sina提供的webservice进行发送,但是需要进行注册 ...

  6. Python3利用Twilio(国际)以及腾讯云服务(国内)免费发送手机短信

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_152 短信服务验证服务已经不是什么新鲜事了,但是免费的手机短信服务却不多见,本次利用Python3.0基于Twilio和腾讯云服务 ...

  7. C#简单实现发送手机短信

    偶然想起,像编写一个从电脑向手机发送短信的程序,从网上查找到有三种方式:(1)使用webservice接口发送手机短信,这个可以使用sina提供的webservice进行发送,但是需要进行注册;(2) ...

  8. SNF开发平台WinForm之十二-发送手机短信功能调用-金笛-SNF快速开发平台3.3-Spring.Net.Framework

    1.调用前组装参数 2.调用发送信息服务脚本   .调用前组装参数: BaseSendTaskEntity entity = new BaseSendTaskEntity(); entity.Mess ...

  9. 装饰者模式的学习(c#) EF SaveChanges() 报错(转载) C# 四舍五入 保留两位小数(转载) DataGridView样式生成器使用说明 MSSQL如何将查询结果拼接成字符串 快递查询 C# 通过smtp直接发送邮件 C# 带参访问接口,WebClient方式 C# 发送手机短信 文件 日志 写入 与读取

    装饰者模式的学习(c#) 案例转自https://www.cnblogs.com/stonefeng/p/5679638.html //主体基类 using System;using System.C ...

随机推荐

  1. ssh整合之四单独搭建struts的运行环境

    1.导入struts的基本jar包 2.在web.xml中配置我们struts的核心控制器StrutsPrepareAndExecuteFilter <?xml version="1. ...

  2. django 配置URLconf和获取值

    django中正确配置url匹配找到视图: 1 在项目下的settings.py中ROOT_URLCONF = "项目名.urls" 表示 前台发来请求会先去项目下的test3/u ...

  3. python网络编程基础(一)

    一.C/S架构 客户端/服务端架构 二.OSI七层架构 七层模型,亦称OSI(Open System Interconnection)参考模型,是参考模型是国际标准化组织(ISO)制定的一个用于计算机 ...

  4. 开源博客系统使用springmvc

    https://github.com/Zephery/newblog http://www.wenzhihuai.com/index.html

  5. hive优化之——控制hive任务中的map数和reduce数

    一.    控制hive任务中的map数: 1.    通常情况下,作业会通过input的目录产生一个或者多个map任务.主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文 ...

  6. Java:日期类Date与Calendar

    Timestamp类型与日期类型之间的转化? Timestamp timestamp = Timestamp.valueOf("2017-03-17 07:00:00"); Dat ...

  7. .Net Core 学习之路-基础

    .Net Core出来好久了,一直在了解,但始终没有应用到实际项目中.... 准备用.net core搞个SSO,才发现它和.net framework的变化并不是一点点... .net core还在 ...

  8. 超级好用的前端开发测试Chrome插件-WEB前端助手(FeHelper)

    WEB前端助手(FeHelper)插件概述 WEB前端助手:FeHelper是一款chrome浏览器插件.包含一些前端实用的工具,如字符串编解码.代码美化.JSON格式化查看.二维码生成器.编码规范检 ...

  9. drupal 8 之 captcha模块

    captcha模块的作用: 添加验证码表单 一.模块下载 https://www.drupal.org/project/captcha 二.安装模块 [扩展]>[+安装新的模块] 在模块页面,复 ...

  10. leetcode 283. Move Zeroes -easy

    题目链接:https://leetcode.com/problems/move-zeroes/ 题目内容: Given an array nums, write a function to move ...