使用nodejs接入封装第三方短信验证码工具类

2023-11-17

简介:使用nodejs接入封装第三方短信验证码工具类

  • 第三方短信运营商接入

    • 安装axios
      yarn add axios@1.1.3
      
  • 配置

    • 在项目的config文件夹新建一个文件,命名为接入短信验证码平台的名字,例如aliyunMessage.js,具体配置如下
      	const axios = require('axios')
      	const sendMsgCode = (phone,randomCode) => {
      		return axios({
         		 	method:'post',
         			url:`http(s)://jmsms.market.alicloudapi.com/sms/send`,  //短信验证码平台接入的url
          		data:{
              		appid:'ATB3w4hJl7xqs9P2ty',   //appid可以在开通的短信验证码平台控制台即可查到
             			appSecret:'J5ByBB287o1Cipvc01U2eOgV0diXYuT8',  // appSecret可以在开通的短信验证码平台控制台即可查到
              		code:randomCode,  //要发送的随机数,需要自己定义
              		phoneNum:phone,  // 接收短信验证码的手机号
              		templateCode: "SMS_168781429"  // 额外的参数,需要结合短信验证码平台来编写,如不需要去掉即可
          		}
      		})
      	}
      	// 测试调试发送短信
      	(async()=>{
      		console.log((await sendMsgCode(13800138000,'5201')).data);
      	})()
      	// 进行导出
      	module.exports = sendMsgCode;
      
  • 随机生成四位数封装(路径:utils/randomTool.js)

    class RandomTool{
    	static randomCode(){
        	return Math.floor(Math.random()*(9999-1000)+1000)
    	}
    }
    module.exports = RandomTool
    
  • 数据层代码逻辑

    • 优化方案(方案二)
      • 必须保证两个redis操作的原子性:事务具有原子性指的是,数据库将事务中的多个操作当作一个整体来执行,服务器要么就执行事务中的所有操作,要么就一个操作也不执行。
      • 同时减少命名空间的浪费
            // 获取手机验证码逻辑处理
        sendCode: async (phone,captcha,type,key,randomCode) =>{
            // 60秒内不能重新获取
            // ------>方案一
            // if(await redisConfig.exists(`${type}:over:`+phone)) {
            //     return { code: -1, msg: '60秒内不能重复获取'}
            // }
        
            // ------->方案二
            if(await redisConfig.exists(`${type}:code:`+phone)){
                let dateRedis = dayjs(Number((await redisConfig.get(`${type}:code:`+phone)).split('_')[0]))
                if(dayjs(Date.now()).diff(dateRedis,'second')<=60) {
                    return {code:-1,msg:'60秒内不能重复获取'}
                }
            }
        
            // 是否已经填写图形验证码
            if (!(await redisConfig.exists(`${type}:captcha:`+key))) {
                return { code: -1, msg: '请发送图形验证码' }
              }
        
            // 对比用户的图形验证码和redis缓存中的是否一致
            let captchaRedis = await redisConfig.get(`${type}:captcha:`+key)
            if(!(captcha.toLowerCase() === captchaRedis.toLowerCase())) {
                return { code: -1,msg:'图形验证码填写错误'}
            }
        
            // 发送手机验证码
            let CodeRes = (await aliyunMessage(phone,randomCode)).data
            
            // ------->方案一
            // // 验证码存入redis
            // redisConfig.set(`${type}:code`+phone,randomCode,600)
        
            // // 存60秒判断
            // redisConfig.set(`${type}:over:`+phone,'1',60)
        
            // ------->方案二
            // 获取当前时间拼接验证码
            let randomCodeTime = `${Date.now()}_${randomCode}`
            redisConfig.set(`${type}:code:`+phone,randomCodeTime,600)
        
            // 删除图形验证码
            redisConfig.del(`${type}:captcha:`+key)
        
            if(CodeRes.code == 0) return {code:0,msg:'验证码发送成功'}
            else {return {code:-1,msg:'验证码发送失败'}}
        }
        
  • 对用户的ip和设备进行md5加密,文件路径:controller/NotifyController.js

    const NotifyService = require('../service/NotifyService')
    const GetUserInfoTool = require('../utils/GetUserInfoTool')
    const SecretTool = require('../utils/SecretTool')
    const randomTool = require('../utils/randomTool')
    
    const NotifyController = {
        sendCode: async(req,res)=>{
            let {phone,captcha,type}  = req.body;
            // 用户的ip+设备md5加密
            let _key = SecretTool.md5(GetUserInfoTool.getIp(req)+GetUserInfoTool.getUserAgent(req))
            let handleRes = await NotifyService.sendCode(phone,captcha,type,_key,randomTool.randomCode())
            res.send(handleRes)
        }
    }
    
    module.exports = NotifyController
    
  • 在router文件夹里面编写接口路径,以及调用的方法

    const express = require('express')
    const router = express.Router()
    const NotifyController = require('../controller/NotifyController')
    
    // 图形验证码接口
    router.get('/captcha',NotifyController.captcha)
    
    // 手机验证码接口
    router.post('/sendCode',NotifyController.sendCode)
    
    module.exports = router
    
  • 大功告成,可以在apifox上进行调用,需要先请求图形验证码接口,图形验证码如何编写可以看我以往的文章
    在这里插入图片描述

  • 手机上也收到了对应的短信验证码
    在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用nodejs接入封装第三方短信验证码工具类 的相关文章

随机推荐

  • Python灰度图像均衡化

    import cv2 import numpy as np from matplotlib import pyplot as plt 读取同文件夹下的lena图像并做灰度化处理 lena plt imread lena jpg lena l
  • 【ADS学习笔记(一)——ADS介绍】

    一 创建Workspace 在创建Workspace时 点击Change Libraries 可以添加和更改元件库 系统默认添加Analog RF 模拟 射频元件库 以及DSP 数字元件库 也可以添加自己下载的元件库 元件库也可以在创建完W
  • 10 分钟上手Web Scraper,从此爬虫不求人

    我现在很少写爬虫代码了 原因如下 网站经常变化 因此需要持续维护代码 爬虫的脚本通常很难复用 因此价值就很低 写简单的爬虫对自己的技能提升有限 对我来不值 但是不写爬虫 就不能方便的获取数据 自己写代码又要花费很多时间 少则一两个小时 多则
  • 用java代码实现图书管理系统

    您好 下面是一个使用 Java 语言实现的图书管理系统的简单示例代码 这个示例包含了一个图书类 Book 和一个图书管理类 BookManager Book 类用于存储图书的信息 包括书名 作者 出版日期等 BookManager 类用于管
  • 解决iview打包时UglifyJs报错

    使用npm run dev时运行是ok的 但是npm run build打包时iview报错 如下 原因是iview中使用了es6语法 然而uglifyJs是不支持的 打开我们的build webpack prod conf js文件 可以
  • spring boot 过滤器实现接收 压缩数据 并解压

    1 新加类GzipRequestWrapper 继承HttpServletRequestWrapper类 public class GzipRequestWrapper extends HttpServletRequestWrapper p
  • 基于Python实现 传感器的随机布置 传感网覆盖仿真

    代码演示 import tkinter as tk import random import win32gui import cv2 import time import math from PIL import Image ImageGr
  • 黑客游戏Hacknet下载(游戏分享一)

    OK Shall we begin Hacknet中文版下载 百度网盘 添加链接描述 夸克网盘 添加链接描述 注 解压后直接点击Hacknet exe进行游戏 英文版下载 百度网盘 添加链接描述 夸克网盘 添加链接描述 难关过不了自行上b站
  • AndroidStudio链接手机的步骤

    1 设置手机为开发者模式 设置 gt 关于手机 gt 连续点击MIUI版本 开启成功 2 在更多设置中选择开发者选项 在开发者选项中同时勾选USB调试和USB安装的开关 3 数据线与电脑连接 4 打开AndroidStudio 等待程序加载
  • centos7关闭防火墙

    出现物理机ping不通虚拟机 但虚拟机可以ping通物理机 排查的方向 一个是虚拟机的防火墙问题 1 查看防火墙的状态 systemctl status firewalld 2 关闭防火墙 如果还是不通 第二个排查方向是虚拟机的链接模式 桥
  • Springboot集成activiti的配置文件ActivitiConfig

    Configuration public class ActivitiConfig Bean public ProcessEngineConfiguration processEngineConfiguration DataSource d
  • Stable Diffusion教程

    什么是Stable Diffusion Stable Diffusion是一种潜在扩散模型 Latent Diffusion Model 能够从文本描述中生成详细的图像 它还可以用于图像修复 图像绘制 文本到图像和图像到图像等任务 简单地说
  • radius认证服务

    radius认证服务 RADIUS是一种分布的 客户端 服务器系统 实现安全网络 反对未经验证的访问 在cisco实施中 RADIUS客户端运行在cisco路由器上上 发送认证请求到中心RADIUS服务器 服务器上包含了所有用户认证和网络服
  • cuda测试集编译linux,linux下使cmake编译cuda(附列子,亲测可用)

    在网上百度 并没有找到什么合适的教程 让我等小白着急不已 借助于GOOGLE的强大能力 发现原来cmake已经支持了cuda 于是乎 赶紧 http www cmake org 下载了最新的cmake 调用了里面的一个FindCUDA cm
  • ApiPost 开源接口调试工具使用大全

    ApiPost使用 简介 接口调试 API请求参数 Header 参数 Query 参数 Body 参数 API 请求响应 返回Headers 响应结果分屏展示 生成调试代码 参数 全局参数 目录参数 参数的优先级 变量 环境变量 环境变量
  • 运行 AppImage软件:Running AppImages (***)

    How to run an AppImage Running AppImages 使用 AppImage appImagetool 进行 Linux 软件包管理 带笔记 要点 1 需要运行权限 通常 linux软件的运行 都需要运行权限 B
  • 基于OpenCASCADE自制三维建模软件(一)介绍

    一 制作背景 目前工作的项目中 需要三维建模作为其中一个模块 而本人刚接触三维建模 因而借助制作一个简单的三维建模软件学习相关的知识 并在此作笔记 在调研过程中 我了解到开源的Open CASCADE软件平台 Open CASCADE简称O
  • ChatGPT 类 AI 软件供应链的安全及合规风险

    AIGC将成为重要的软件供应链 近日 OpenAI推出的ChatGPT通过强大的AIGC 人工智能生产内容 能力让不少人认为AI的颠覆性拐点即将到来 基于AI将带来全新的软件产品体验 而AI也将会成为未来软件供应链中非常重要的一环 在Ope
  • colab 导出csv文件

    生成之后download即可 from google colab import files files download train csv
  • 使用nodejs接入封装第三方短信验证码工具类

    简介 使用nodejs接入封装第三方短信验证码工具类 第三方短信运营商接入 安装axiosyarn add axios 1 1 3 配置 在项目的config文件夹新建一个文件 命名为接入短信验证码平台的名字 例如aliyunMessage