短信验证码跟自己在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. SpringBoot的RestController vs @ResponseBody + @Controller

    @Controller和@RestController的区别?官方文档:@RestController is a stereotype annotation that combines @Respon ...

  2. 新概念英语(1-55)The Sawyer family

    新概念英语(1-55)The Sawyer family When do the children do their homework? The Sawyers live at 87 King Str ...

  3. io使用的设计模式

    File f = new File("c:/a.txt"); 1. FileInputStream fis = new FileInputStream(f); 2. Reader ...

  4. django中图片的上传和显示

    上传图片实际上是 把图片存在服务器的硬盘中,将图片存储的路径存在数据库中. 1 首先要配置文件上传的路径: 1.1 建立静态文件目录 在项目根目录下 新建一个 static文件夹,下面再建立一个med ...

  5. Python之面向对象四

    面向对象进阶 一.关于面向对象的两个内置函数 isinstance   判断类与对象的关系    isinstance(obj,cls)检查obj是否是类 cls 的对象,返回值是bool值 issu ...

  6. SQL 中的日期和时间类型

    在我们SQL中一般支持三种数据类型. date:日历日期,包括年(四位),月和日. time: 一天中的时间,包括小时,分和秒.可以用变量time(p)来表示秒的小数点后的数字位数(默认是0). 通过 ...

  7. JavaScript 以及 css3进度条

    JavaScript css3进度条 使用css3实现进度条 <!DOCTYPE html> <html lang="en"> <head> & ...

  8. Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) A. Trip For Meal

    http://codeforces.com/contest/876/problem/A 题意: 一个人一天要吃n次蜂蜜,他有3个朋友,他第一次总是在一个固定的朋友家吃蜂蜜,如果说没有吃到n次,那么他就 ...

  9. spark2.1注册内部函数spark.udf.register("xx", xxx _),运行时抛出异常:Task not serializable

    函数代码: class MySparkJob{ def entry(spark:SparkSession):Unit={ def getInnerRsrp(outer_rsrp: Double, we ...

  10. asp.net core 二 Nginx Supervisor 负载,监听

           ASP.NET Core负载均衡集群搭建(CentOS7+Nginx+Supervisor+Kestrel)          asp.net core在linux运行下,一但命令行退出 ...