本文介绍的是Java实现短信验证码的接入流程,因为使用的是标准的HTTP接口,可以适用用其他任何语言接入。其实只要清楚来电验证码的几个参数,接入还是很快的。
前端实现代码
<html>
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0">
<!-- 国内使用 -->
<link rel="stylesheet" href="https://cdn.staticfile.org/amazeui/2.7.2/css/amazeui.min.css">
<script type="text/javascript" charset="utf-8" src="https://cdn.staticfile.org/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript" charset="utf-8" src="https://g.alicdn.com/sd/nch5/index.js?t=2015052012"></script>
<!-- 若您的主要用户来源于海外,请替换使用下面的js资源 -->
<!-- <script type="text/javascript" charset="utf-8" src="//aeis.alicdn.com/sd/nch5/index.js?t=2015052012"></script> -->
<style>
.am-form{
padding: 10px;
}
._nc .stage1 .slider{
left: 0;
right: 0;
}
</style>
</head>
<body>
<div class="am-form">
<div class="am-form-group">
<label for="tel">请输入手机号</label>
<input type="text" class="" id="tel" placeholder="请输入手机号">
</div>
<div id="__nc" style="height: 70px">
<div id="nc"></div>
</div>
<div class="am-form-group">
<label for="code">请输入验证码</label>
<input id="code" type="text" placeholder="请输入验证码">
</div>
<button type="button" class="am-btn am-btn-primary">提交</button>
</div>
<script>
var nc_token = ["CF_APP_1", (new Date()).getTime(), Math.random()].join(':');
var nc=NoCaptcha.init({
renderTo: '#nc',
appkey: 'CF_APP_1',
scene: 'register',
token: nc_token,
trans: {"key1": "code200"},
elementID: ["usernameID"],
is_Opt: 0,
language: "cn",
timeout: 10000,
retryTimes: 5,
errorTimes: 5,
inline:false,
apimap: {
// 'analyze': '//a.com/nocaptcha/analyze.jsonp',
// 'uab_Url': '//aeu.alicdn.com/js/uac/909.js',
},
bannerHidden:false,
initHidden:false,
callback: function (data) {
window.console && console.log(nc_token)
window.console && console.log(data.csessionid)
window.console && console.log(data.sig);
var tel = $('#tel').val();
$.ajax({
url: "sendCode",
type: "post",
data: {
tel:tel
},
dataType: "json",
success: function (result) {
if (result.code == 0) {
alert("验证码已发送!", "green")
} else {
alert("发送失败,请稍后再试!");
nc.reset()
}
},
error: function () {
alert("系统繁忙,请稍后再试!", "red")
}
})
},
error: function (s) {
}
});
NoCaptcha.setEnabled(true);
nc.reset();//请务必确保这里调用一次reset()方法
NoCaptcha.upLang('cn', {
'LOADING':"加载中...",//加载
'SLIDER_LABEL': "请向右滑动验证",//等待滑动
'CHECK_Y':"验证通过",//通过
'ERROR_TITLE':"非常抱歉,这出错了...",//拦截
'CHECK_N':"验证未通过", //准备唤醒二次验证
'OVERLAY_INFORM':"经检测你当前操作环境存在风险,请输入验证码",//二次验证
'TIPS_TITLE':"验证码错误,请重新输入"//验证码输错时的提示
});
</script>
</body>
</html>
后端实现代码
HttpSession session = req.getSession();
// TODO 验证码有效时间
session.setMaxInactiveInterval(600);
try {
Integer num = RandNumber.getNum();
// TODO 发送验证码通道
Sendsms.Send(num, phone);
session.setAttribute(phone, num);
return R.ok();
} catch (Exception e) {
e.printStackTrace();
logger.error(e.getMessage());
return R.error("fasle");
}
import java.io.Exception;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
public class Sendsms {
private static String Url = "https://vip.veesing.com/smsApi/verifyCode";
// 发送短信验证码
public static void Send(Integer num, String mobile) {
try {
HttpClient client = new HttpClient();
PostMethod method = new PostMethod(Url);
client.getParams().setContentCharset("UTF-8");
method.setRequestHeader("ContentType", "application/x-www-form-urlencoded;charset=UTF-8");
NameValuePair[] data = {
new NameValuePair("appId", "*********"),
new NameValuePair("appKey", "**********"),
new NameValuePair("templateId", "*******"),
new NameValuePair("mobile", "*******"),
new NameValuePair("variables", "*******")
};
method.setRequestBody(data);
client.executeMethod(method);
String submitResult = method.getResponseBodyAsString();
System.out.println(submitResult);
} catch (Exception e) {
e.printStackTrace();
}
}
}
HttpSession session = req.getSession();
String yzm = String.valueOf(session.getAttribute(username));
logger.info(yzm);
if (yzm == null) {
return R.error("验证码错误");
}
if (yzm != null && !verifycode.equals(yzm)) {
return R.error("验证码错误");
}
为了能是以上代码正常接入,需要获取或者设置一些参数:
第一:短信签名
短信签名是短信验证码内容的一个必要参数,一般来说的话,验证码签名是需要根据企业营业执照或者商标名称等进行命名,大多数是2-6个字,常用是4个字。大多数短信平台都有提交签名入口
第二:验证码接口接入的AppId和AppKey获取
不同的平台的定义是不一样的,但都是需要账户名和秘钥,这也是短信平台必须具备的特定。例如这个平台的获取方式很直接,再首页就可看到。当然这个是需要审核的,根据平台的审核速度,一般在10分钟之内会给审核结果,工作时间外可能会存在延长。
第三:限定同一手机号的日请求次数和预警提醒
主要是为了防止通过同一手机号码多次提交验证码申请,造成短信条数流失。有些平台是默认设置为5条,有的则需要自己添加限制。
除了单个手机号码日发送量,还可以对账户的每天最大发送量进行设置,避免被恶意攻击造成较大损失;账户预警通知手机,主要是提醒用户账号条数不足或者账户异常情况。这都是一个短信平台所必须的功能。
第四:接入之前的验证码接口测试
这步主要是给考察短信平台的开发者使用的,可以在没有接入的情况之下对接口进行简单的测试,大部分短信平台没有这个功能,不是必须具备的功能。
第五:选择短信平台的三要素
一是快速,二是稳定,三是价格美丽。结合着三点选择短信平台,不仅老板对你赞赏有加,还能为公司节省一部分资金。