短信验证码跟自己在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. SpringCloud的服务网关zuul

    演示如何使用api网关屏蔽各服务来源 一.概念和定义 1.zuul最终还是使用Ribbon的,顺便测试一下Hystrix断路保护2.zuul也是一个EurekaClient,访问服务注册中心,获取元数 ...

  2. XML之XPath

    1.在 XPath 中,有七种类型的节点:元素.属性.文本.命名空间.处理指令.注释以及文档节点(或称为根节点). 1.1 XPath 术语 节点(Node) 在 XPath 中,有七种类型的节点:元 ...

  3. leetcode算法: Find All Duplicates in an Array

    Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others ...

  4. Django REST framework+Vue 打造生鲜超市(四)

    五.商品列表页 5.1.django的view实现商品列表页 (1)goods/view_base.py 在goods文件夹下面新建view_base.py,为了区分django和django res ...

  5. ZOJ-2913 Bus Pass---BFS进阶版

    题目链接: https://vjudge.net/problem/ZOJ-2913 题目大意: 问哪个区域到公交路线上所有区域的最大距离最小 思路: 这里要求出到底是哪个区域到某些指定区域的最大距离最 ...

  6. vue+iview实现动态路由和权限验证

    github上关于vue动态添加路由的例子很多,本项目参考了部分项目后,在iview框架基础上完成了动态路由的动态添加和菜单刷新.为了帮助其他需要的朋友,现分享出实现逻辑,欢迎一起交流学习. Gith ...

  7. Java基础学习(五)-- Java中常用的工具类、枚举、Java中的单例模式之详解

    Java中的常用类 1.Math : 位于java.lang包中 (1)Math.PI:返回一个最接近圆周率的 (2)Math.abs(-10):返回一个数的绝对值 (3)Math.cbrt(27): ...

  8. MySQL 5.7 基于复制线程SQL_Thread加快恢复的尝试

    1. MySQL 数据恢复常用办法 MySQL恢复的方法一般有三种: 1. 官方推荐的基于全备+binlog , 通常做法是先恢复最近一次的全备,然后通过mysqlbiinlog --start-po ...

  9. ls-dyna基础教程

    刚刚开始使用ls-dyna,几天前还只知道点开dyna界面,然后就没有然后了,没人带,资料也没多少,但是科研还得继续往下做呀(手动滑稽),通过在仿真论坛上搜索相关的资料,并通过自己的一步步操作,做了大 ...

  10. Win10 VS2012 无法注册IIS4.0 解决方案

    死活注册不上,度娘也找了,最终找到只要打个补丁就行. 安装: Microsoft Visual Studio 2012 更新 (KB3002339) 下载:http://www.microsoft.c ...