通过node实现阿里云短信接口,并将手机号缓存,通过Redis过期时间限制频繁发短信
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了通过node实现阿里云短信接口,并将手机号缓存,通过Redis过期时间限制频繁发短信,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4479字,纯文字阅读大概需要7分钟。
内容图文
1,首先安装Redis , npm install redis --save
RedisHelper.js
const redis = require('redis'); function SetString(key,value) { let redishost = global.urls.controllers.RedisServer.split(":")[0]; let redisport = global.urls.controllers.RedisServer.split(":")[1]; const client = redis.createClient(redisport, redishost, {}); client.select(2, function() { /* ... */ }); //错误监听? client.on("error", function (err) { console.log("Error " + err); }); client.set(key, value,redis.print); // 三分钟后过期 client.expire(key, 180); client.quit(); } function GetString(key) { return new Promise((resolve, reject) => { let redishost = global.urls.controllers.RedisServer.split(":")[0]; let redisport = global.urls.controllers.RedisServer.split(":")[1]; const client = redis.createClient(redisport, redishost, {}); client.select(2, function() { /* ... */ }); //错误监听? client.on("error", function (err) { console.log("Error " + err); }); // This will return a JavaScript String client.get(key,function(err,reply){ if (err) throw err; console.log('Got: ' + reply); resolve(reply) client.quit(); }); }) } exports.SetString = SetString; exports.GetString = GetString;
config.josn
controllers:{"RedisServer":"127.0.0.1:6379"}
//生成随机数和;将配置文件放到全局变量中
let fs = require("fs"); function RangeCode(length) { //随机产生指定位数验证码 var range = function (start, end) { var array = []; for (var i = start; i < end; ++i) array.push(i); return array; }; let getnum = function () { let num = Math.floor(Math.random() * 10); if(num==0){ return getnum(); } else return num; } var randomstr = range(0, length).map(function (x) { return getnum(); }).join(''); return randomstr; } function UpdateConfig() { let configfile = "../config/ServerConfig.json"; var urls = JSON.parse(fs.readFileSync(configfile)); global.urls = urls; return true; } exports.RangeCode = RangeCode; exports.UpdateConfig = UpdateConfig;
2,发短信
//npm install @alicloud/pop-core -S
const log = require('./logger');
const utiltools = require('./UtilTools');
const redis = require("./RedisHelper");
async function SendSMSCode(ip, phonenum, callback) { try { // 生成短信码 let code = utiltools.RangeCode(6); // 设置验证码过期时间3min,实例化类 let codeobj = new smsCode.CMSCode(ip, code, phonenum, 1, new Date((new Date()).getTime() + 3 * 60 * 1000)); const SMSClient = require('@alicloud/sms-sdk') // ACCESS_KEY_ID/ACCESS_KEY_SECRET 根据实际申请的账号信息进行替换 const accessKeyId = '***' const secretAccessKey = '***' //初始化sms_client var smsClient = new SMSClient({accessKeyId, secretAccessKey}) let redisTemp =await redis.GetString(phonenum); if(redisTemp && new Date().getTime() - redisTemp < 1000){ log.logger.info("获取Redis缓存手机时间:" + redisTemp); let returnobj = {Result: 0, Resultobj: "操作过于频繁!"}; callback.send(returnobj); callback.end(); return; } //发送短信 smsClient.sendSMS({ PhoneNumbers: phonenum, SignName: '钓鱼App', TemplateCode: 'SMS_***', TemplateParam: '{"code":' + code + '}' }).then(function (res) { let {Code} = res; if (Code === 'OK') { //处理返回参数 log.logger.info("发送成功num:" + phonenum + "code:" + code); SetSMSArray(codeobj); let returnobj = {Result: 1}; callback.send(returnobj); callback.end(); }else { log.logger.error("发送失败:" + Code); let returnobj = {Result: 0, Resultobj: "返回失败",err}; callback.send(returnobj); callback.end(); } }, function (err) { log.logger.error(err); var returnobj = {Result: 0, Resultobj: "错误",err}; callback.send(returnobj); callback.end(); }) } catch (Exception) { log.logger.error(Exception); } }
function CompareSmsCode(phonenum, code) { var i = global.SMScodearray.length; while (i--) { if (global.SMScodearray[i].getPhonum() == phonenum) { if ((global.SMScodearray[i].getExpireTime() - new Date()) > 0) { log.logger.debug("验证未过期:" + global.SMScodearray[i].getExpireTime()); return code == global.SMScodearray[i].getCode(); } else { log.logger.debug("验证码已过期:" + global.SMScodearray[i].getExpireTime()); return false; } } } return false; }
function SetSMSArray(smsmodel) {
// 定义全局存手机号和验证码
var i = global.SMScodearray.length;
let isexist = false;
while (i--) {
if (global.SMScodearray[i].getPhonum() == smsmodel.getPhonum()) {
global.SMScodearray[i].setTimes(global.SMScodearray[i].getTimes() + 1);
global.SMScodearray[i].setCode(smsmodel.getCode());
global.SMScodearray[i].setExpireTime(smsmodel.getExpireTime());
isexist = true;
}
}
if (!isexist) {
global.SMScodearray.push(smsmodel);
}
//动态存手机号
redis.SetString(smsmodel.getPhonum(), new Date().getTime())
}
内容总结
以上是互联网集市为您收集整理的通过node实现阿里云短信接口,并将手机号缓存,通过Redis过期时间限制频繁发短信全部内容,希望文章能够帮你解决通过node实现阿里云短信接口,并将手机号缓存,通过Redis过期时间限制频繁发短信所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。