前台代码
逻辑:点击获取验证码通过调用函数生成6位随机的验证码存在隐藏的input框值,把生成的验证码和手机号码传入到后台把验证码发送给用户,把用户填写的验证码和隐藏的input框值的验证码做对比看是否正确。
注:(在后台生成验证码返回给前台作对比也是可以的,这样比较安全)
<div style="padding: 20px;">
<input type="text" name="phone" id="phone" style="margin-top: 10px;" placeholder="请填写你的电话号码" />
<input style="width:30%;" type="text" name="code" id="code" />
<input id="btnSendCode" style="height:40px;" type="button" value="获取验证码" onclick="sendMessage()" />
<p id="timeshort"></p>
<input style="display:none;" name="codeid" id="codeid" value="" />
<input type="hidden" name="hidCodeId" id="hidCodeId" value="0" />
<button type="button" id="butSubmit" class="mui-btn mui-btn-primary" style="margin-top: 10px; width: 100%; height: 45px;" onclick="nextOrder();">下一步</button>
</div>
<script>
function nextOrder() {
var phone = jQuery("#phone").val();//电话号码
var code = jQuery("#code").val();//填写的验证码
var codeid = jQuery("#codeid").val();//发送出去的验证码
if (codeid != code) {
alert("验证码错误,请重新填写!");
enabledControl();
return;
}
if (phone === "") {
alert("电话号码不能为空!");
enabledControl();
return;
}
if (code === "") {
alert("请输入验证码!");
enabledControl();
return;
}
var regBox = { regMobile: /^1[3456789]\d{9}$/ }
var mflag = regBox.regMobile.test(phone);
if (!mflag) {
alert("请输入正确的手机号码");
enabledControl();
return;
}
window.location.href = *******;//跳转的页面
}
var after = '';
var InterValObj; //timer变量,控制时间
var count = 60; //间隔函数,1秒执行
var curCount = 60;//当前剩余秒数
var exp = new Date();
var time;
time = exp.getTime();
//获取cookie值
function getCookie(name) {
var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
if (arr = document.cookie.match(reg))
return unescape(arr[2]);
else
return null;
}
//这是有设定过期时间的使用示例:
//s20是代表20秒
//h是指小时,如12小时则是:h12
//d是天数,30天则:d30
//设置cookie
function setCookie(name, value, time) {
var strsec = getsec(time);
var exp = new Date();
exp.setTime(exp.getTime() + strsec * 1);
document.cookie = name + "=" + escape(value) + ";expires=" + exp.toGMTString();
}
function getsec(str) {
// alert(str);
var str1 = str.substring(1, str.length) * 1;
var str2 = str.substring(0, 1);
if (str2 == "s") {
return str1 * 1000;
}
else if (str2 == "h") {
return str1 * 60 * 60 * 1000;
}
else if (str2 == "d") {
return str1 * 24 * 60 * 60 * 1000;
}
}
function sendMessage() {
var phone = jQuery("#phone").val();
if (phone === "") {
mui.alert("电话号码不能为空!");
enabledControl();
return;
}
var codeid = parseInt(Math.random() * (999999 - 100000) + 100000);//生成随机的6位数
var code=parseInt(codeid,10);
$("#codeid").attr('value', code);//把生成验证码随机值存到隐藏的input框里面去
if (getCookie('after') > time && document.cookie.indexOf('after=') != -1) {
$('#timeshort').html('请不要在60秒内重复获取验证码');
} else {
$('#timeshort').html('');
}
trySend();//调用一次
}
function trySend() {
if (getCookie('after') < time || document.cookie.indexOf('after=') == -1 || getCookie('after') == null) {
//测试时先注释掉ajax请求代码,否则会不成 +
var url = "SingleSend";
var v = {};
v.co = jQuery("#codeid").val();//生成的验证码
v.phone = jQuery("#phone").val();//电话号码
jQuery.post(url, v, function (res) {
if (res> 0)
{
$('#hidCodeId').val(res);
}
});
setCookie("after", time + 60 * 1000, "s60");
setCookie("phone", $('#phone').val(), "s60");
curCount = count;
//设置button效果,开始计时
$("#btnSendCode").attr("disabled", "true");
$("#btnSendCode").val(curCount + "秒后重新获取");
InterValObj = window.setInterval(SetRemainTime, 1000); //启动计时器,1秒执行一次
}
}
//timer处理函数
function SetRemainTime() {
if (curCount == 0) {
window.clearInterval(InterValObj);//停止计时器
$("#btnSendCode").removeAttr("disabled");//启用按钮
$("#btnSendCode").val("重新发送验证码");
// code = ""; //清除验证码。如果不清除,过时间后,输入收到的验证码依然有效
} else {
curCount--;
$("#btnSendCode").val(curCount + "秒后重新获取");
}
}
function disabledControl() {
$("#butSubmit").attr("disabled", "disabled");
}
function enabledControl() {
$("#butSubmit").removeAttr("disabled");
}
</script>
后台代码
通过前台传来的手机号和验证码调用短信接口发送给用户
云短信接口需要的参数
//短信验证码的接口
public ActionResult SingleSend()
{
var phone = Request["phone"]; //电话号码
var Randoms= Request["co"]; //验证码
var accesskey = "*****"; //用户开发key
var accessSecret = "***"; //用户开发秘钥
string url = "http://api.1cloudsp.com/api/v2/single_send";//云短信接口
var parameters = new Dictionary<string, string>();
parameters.Add("secret", accessSecret); //秘钥
parameters.Add("sign", "71116");//签名id必须审核通过
parameters.Add("templateId", "90063");//短信模板Id必须审核通过
parameters.Add("mobile", phone); //接收短信的手机号码
parameters.Add("accesskey", accesskey); //用户开发key
parameters.Add("content", HttpUtility.UrlEncode(""+Randoms, Encoding.UTF8)); //验证码
string result2 = sendPost(url, parameters, "get");//返回结果为json字符串
return Json(result2, JsonRequestBehavior.AllowGet);
}
static string sendPost(string url, IDictionary<string, string> parameters, string method)
{
if (method.ToLower() == "post")
{
HttpWebRequest req = null;
HttpWebResponse rsp = null;
System.IO.Stream reqStream = null;
try
{
req = (HttpWebRequest)WebRequest.Create(url);
req.Method = method;
req.KeepAlive = false;
req.ProtocolVersion = HttpVersion.Version10;
req.Timeout = 5000;
req.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
byte[] postData = Encoding.UTF8.GetBytes(BuildQuery(parameters, "utf8"));
reqStream = req.GetRequestStream();
reqStream.Write(postData, 0, postData.Length);
rsp = (HttpWebResponse)req.GetResponse();
Encoding encoding = Encoding.GetEncoding(rsp.CharacterSet);
return GetResponseAsString(rsp, encoding);
}
catch (Exception ex)
{
return ex.Message;
}
finally
{
if (reqStream != null) reqStream.Close();
if (rsp != null) rsp.Close();
}
}
else
{
//创建请求
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + "?" + BuildQuery(parameters, "utf8"));
//GET请求
request.Method = "GET";
request.ReadWriteTimeout = 5000;
request.ContentType = "text/html;charset=UTF-8";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
//返回内容
string retString = myStreamReader.ReadToEnd();
return retString;
}
}
// <summary>
/// 组装普通文本请求参数。
/// </summary>
/// <param name="parameters">Key-Value形式请求参数字典</param>
/// <returns>URL编码后的请求数据</returns>
static string BuildQuery(IDictionary<string, string> parameters, string encode)
{
StringBuilder postData = new StringBuilder();
bool hasParam = false;
IEnumerator<KeyValuePair<string, string>> dem = parameters.GetEnumerator();
while (dem.MoveNext())
{
string name = dem.Current.Key;
string value = dem.Current.Value;
// 忽略参数名或参数值为空的参数
if (!string.IsNullOrEmpty(name))//&& !string.IsNullOrEmpty(value)
{
if (hasParam)
{
postData.Append("&");
}
postData.Append(name);
postData.Append("=");
if (encode == "gb2312")
{
postData.Append(HttpUtility.UrlEncode(value, Encoding.GetEncoding("gb2312")));
}
else if (encode == "utf8")
{
postData.Append(HttpUtility.UrlEncode(value, Encoding.UTF8));
}
else
{
postData.Append(value);
}
hasParam = true;
}
}
return postData.ToString();
}
/// <summary>
/// 把响应流转换为文本。
/// </summary>
/// <param name="rsp">响应流对象</param>
/// <param name="encoding">编码方式</param>
/// <returns>响应文本</returns>
static string GetResponseAsString(HttpWebResponse rsp, Encoding encoding)
{
System.IO.Stream stream = null;
StreamReader reader = null;
try
{
// 以字符流的方式读取HTTP响应
stream = rsp.GetResponseStream();
reader = new StreamReader(stream, encoding);
return reader.ReadToEnd();
}
finally
{
// 释放资源
if (reader != null) reader.Close();
if (stream != null) stream.Close();
if (rsp != null) rsp.Close();
}
}