博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
短信验证模块
阅读量:5884 次
发布时间:2019-06-19

本文共 3625 字,大约阅读时间需要 12 分钟。

最近使用到手机短信校验,分享一下我的实现方式,也希望能够了解更好的实现方式 屏幕快照 2015-10-24 上午9.01.51.png

使用短信平台:阿里大鱼(阿里巴巴)

使用语言:node.js

数据库:redis(可用任意数据库或文件操作替代)

实现代码如下:

//安装依赖//redis 数据库操作模块npm install redis//taobao API 操作模块。ES6请使用topapi-nodenpm install top
//AuthControllervar redisClient = require('../bin/redisClient');var regx = /^(13|15|17|18|14)[0-9]{9}$/;var top = require("top");var client = top.createClient({  appkey:'******',  appsecret:'*******',  REST_URL: 'http://gw.api.taobao.com/router/rest'});var params_check = {      extend:"",      sms_type:"normal",      sms_free_sign_name:"注册验证",      sms_param:'{"product":"网站名","code":"'+parseInt(code)+'"}',      rec_num:tel,      sms_template_code:"SMS_1020033"    };module.exports = {  /**   * 发送短信验证   * @param req   * @param res   */    "smsCheck":function(req,res){    var tel = req.query.tel;    if (!tel || !regx.exec(tel))return res.json({errMsg: "tel is no true", errCode: "400"});    //生成4位数字的随机数    var code = Math.floor(Math.random() * (9999 - 999 + 1) + 999);    //检查用户是否已经注册    User.findOne({tel: tel}).exec(function findOneCB(err, user) {      if (user) return res.json({errMsg: "该手机号已被注册", errCode: "400"});      redisClient.exists("register:" + tel, function (err, result) {        if (err)return res.json({errMsg: "服务器出错,请重试", errCode: "500"});        if (result == 1)return res.json({errMsg: "请求过于频繁,请稍候重试", errCode: "423"});        //发送短信        client.invoke('alibaba.aliqin.fc.sms.num.send', params_check, [], null, 'GET', function (err, result) {          if (!err) {            //发送成功            redisClient.multi()              //限制访问频率60秒              .set("register:" + tel, code)              .expire("register:" + tel, 60)              .hset("code:" + tel, "code",code)              .hset("code:" + tel,"count",0)              .exec(function (err, replies) {                if (!err)return res.json({errMsg: "ok", errCode: 0});              });          } else {            res.json({errMsg: "服务器出错,请重试", errCode: "500"});          }        });      });    });  },  /**   * 检验验证码   * @param req   * @param res   */  "checkRandom":function(req,res){    var code = req.body.code;    var tel = req.body.tel;    redisClient.hgetall("code:"+tel,function(err,result){      if (err)return res.status(500).json({errMsg:"服务器出错,请重试",errCode:"500"});      //服务器不存在校验码或已被删除      if(!result)return res.status(400).json({errMsg:"验证码失效,请重新获取验证码",errCode:"404"});      if(result.code == code){        return res.status(200).json({errMsg:"ok",errCode:"0"});      }else if(result.code != code){        if(result.count >=100)redisClient.del("code:" + tel);        else redisClient.hset("code:" + tel,"count",Number(result.count)+1);        return res.status(400).json({errMsg:"验证码不一致",errCode:"1"});      }    });  },  /**   * 提交注册   */  "register":function(req,res){    var data = req.body;    if(!data || !data.tel ||!data.password || !data.code || !regx.exec(data.tel))return res.json({errMsg:"请输入有效内容",errCode:"400"});    redisClient.get("code:"+data.tel,function(err,result){      if (err)return res.json({errMsg:"服务器出错,请重试",errCode:"500"});      if(result != data.code)  return res.json({errMsg:"验证码不一致",errCode:"1"});      //通过短信校验      var user = {        tel:data.tel,        password:data.password      };      User.create(user).exec(function createCB(err,createUser){        if(err){          return res.json({errMsg:"服务器出错,创建失败",errCode:500});        }        if(!err){          req.session.objectid = createUser.id;          return res.json({errMsg:"ok",errCode:0});        }        //清除缓存数据        redisClient.del("code:"+data.tel);      });    });  }};

转自:https://cnodejs.org/topic/562adf63004756b058c237b1

 

转载地址:http://ugoix.baihongyu.com/

你可能感兴趣的文章
Annotation研究的一些学习资料
查看>>
webpack资料
查看>>
DotNet加密方式解析--散列加密
查看>>
OpenSSL使用2(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12概念说明)(转)
查看>>
win 下 apache 虚拟主机配置方式
查看>>
第十一篇:基于TCP的一对回射客户/服务器程序及其运行过程分析( 下 )
查看>>
【HDU1219】AC Me(水题)
查看>>
【前端】:HTML
查看>>
从JDBC程序看为什么需要Mybatis
查看>>
ZOJ 1403&&HDU 1015 Safecracker【暴力】
查看>>
更新软件
查看>>
Windows10锁屏壁纸提取
查看>>
SSM框架——使用MyBatis Generator自动创建代码
查看>>
Logstash之Logstash inputs(file和redis插件)、Logstash outputs(elasticsearch 和redis插件)和Filter plugins...
查看>>
利用struts2<s:token>标签防止用户重复提交
查看>>
局域网基本原理与广域网基本原理
查看>>
java数据库操作:JDBC的操作
查看>>
Codeforces Round #247 (Div. 2) D. Random Task
查看>>
解决Ubuntu下博通网卡驱动问题
查看>>
怎样给ExecutorService异步计算设置超时
查看>>