【NodeJS】 API Key 实现 短信验证码功能

这里使用的平台是 短信宝
整体来讲还是挺麻烦的平台必须企业才行,个人是无法使用该平台的
平台必须完成 身份信息认证 和 企业认证
 这里就需要 “营业执照”了 ,没有 “营业执照” 的朋友还是后退一步吧

后端我用的是NodeJS ,使用第三方库 router 来制作 api访问地址接口,然后在 验证码api 访问地址接口内“ 使用 axios 向 “https://api.smsbao.com/sms” 发送请求 ” ,当用户访问这个地址就执行,最后把失败或成功的值返回给前端 ,然后在做一个post接口,用来核对用户填写的验证码是否和发生至 接收手机号 的短信验证码一致 ,成功返回什么 ? 失败返回什么? 就这样 !
 

import express from 'express'
const router = express.Router()
import axios from 'axios'
// 替换为你的API账号信息
const apiUsername = 'your account number'
const apiPassword = 'your password md5'
const apiUrl = 'https://api.smsbao.com/sms'// 发送短信验证码的函数
async function sendSMS (mobile, content) {try {// `https://api.smsbao.com/sms?u=${apiUsername}&p=${apiPassword}&m=${mobile}&c=${content}`const response = await axios.get(apiUrl, {params: {u: apiUsername, //用户名p: apiPassword, //密码m: mobile,     //手机号c: content     //短信发送内容}})// 处理响应,根据需要进行进一步的处理console.log('SMS Sent:', response.data)return response.data} catch (error) {console.error('Error sending SMS:', error)throw error}
}function generateRandomCode (length) {const min = Math.pow(10, length - 1)const max = Math.pow(10, length) - 1return Math.floor(Math.random() * (max - min + 1) + min).toString()
}//存储验证码
let mobileCodeNumber//发送验证码
router.get('/Test/MobileCodeNumber', async (req, res) => {console.log(`这是用户传递来的信息`, req.query)if (!req.query.mobile)return res.status(400).json({ code: 400, message: 'mobile参数必传' })try {const mobileNumber = req.query.mobile // 替换为实际的手机号码const verificationCode = generateRandomCode(6) // 生成或获取实际的验证码console.log(`验证码`, verificationCode)await sendSMS(mobileNumber,`【短信宝】您的验证码是${verificationCode},30秒内有效`)mobileCodeNumber = verificationCoderes.status(200).json({ code: 200, message: 'SMS sent successfully!' })} catch (error) {console.error(error)res.status(400).json({ code: 400, message: 'Failed to send SMS.' })}
})//核对用户填写验证码是否和接收到的一致
router.post('/Test/login', async (req, res) => {if (req.body.code == mobileCodeNumber) {res.status(200).send({ code: 200, message: '登录成功' })} else {res.status(400).send({ code: 400, message: '验证码错误' })}
})
export default router

前端V3简单做了一下样式功能

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="stylesheet" href="./style/vant@3.css" /><title>Document</title>
</head><body><div id="mobileCodeNumber"><van-cell-group inset><van-field v-model="mobile" type="tel" label="手机号"></van-field><van-field v-model="mobileCode" center clearable label="短信验证码" placeholder="请输入短信验证码"><template #button><van-button size="small" type="primary" :disabled="counting" @click="sendSms">{{ counting ? `${count}s 后重新发送` : '发送验证码' }}</van-button></template></van-field><van-button round block type="success" @click="GotoLogin">登录</van-button></van-cell-group></div><script src="https://gitee.com/just-once-1/utils/tree/master/utils/Vue3.js"></script><script src="https://gitee.com/just-once-1/utils/tree/master/utils/vant.min.js"></script><script src="https://gitee.com/just-once-1/utils/tree/master/utils/axios.js"></script><script src="https://gitee.com/just-once-1/utils/tree/master/utils/VantPlugin.js"></script><script>const { createApp, ref } = Vue;const mobile = ref('')const counting = ref(false)const count = ref(60)const mobileCode = ref('')let domain = 'http://127.0.0.1:3009'const app = createApp({data() {return {mobile,counting,count,mobileCode}},setup() {const sendSms = () => {if (!counting.value) {counting.value = true;useSendMobileCode()const timer = setInterval(() => {if (count.value > 0) {count.value--;} else {counting.value = false;count.value = 60;clearInterval(timer);}}, 1000);}};const useSendMobileCode = async () => {try {const res = await axios({url: domain + `/Test/MobileCodeNumber?mobile=${mobile.value}`,method: 'get'})console.log(': ', res)} catch (err) {console.log(': ', err.response)}}const GotoLogin = async () => {try {const res = await axios({url: domain + '/Test/login',method: 'post',data: {mobile: mobile.value,code: mobileCode.value}})console.log('GotoLogin: ', res)} catch (err) {console.log('GotoLogin: ', err.response)}}return {sendSms,useSendMobileCode,GotoLogin};},});app.use(VantPlugin);app.mount('#mobileCodeNumber');</script>
</body></html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/236631.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

synxflow 安装环境

介绍&#xff1a; 该软件可以动态模拟洪水淹没&#xff0c;滑坡跳动和泥石流使用多个cuda支持的gpu。它还提供了一个用户友好但多功能的Python界面&#xff0c;可以完全集成到数据科学工作流程中&#xff0c;旨在简化和加速危害风险评估任务。 这个包我从网上找到的资源特别特…

Flutter页面刷新失败?看看是不是这个原因

文章目录 问题描述解决办法在控件A中定义回调函数在页面中使用控件A 原因分析回顾问题原因分析 setState使用注意事项上下文正确性异步更新避免深层嵌套避免频繁调用避免在 build 方法中调用避免在 dispose 方法中调用 问题描述 我用flutter开发了一个页面&#xff0c;页面上有…

笔记二十六、React中路由懒加载的扩展使用

26.1 在路由中配置懒加载 lazy routes/index.jsx 代码 import {Navigate} from "react-router-dom"; import Home from "../components/Home"; import About from "../components/About"; // import Classify from "../components/Home/c…

AIGC实战——生成对抗网络(Generative Adversarial Network)

AIGC实战——生成对抗网络 0. 前言1. 生成对抗网络1.1 生成对抗网络核心思想1.2 深度卷积生成对抗网络 2. 数据集分析3. 构建深度卷积生成对抗网络3.1 判别器3.2 生成器3.3 DCGAN 模型训练 4. GAN 训练技巧4.1 判别器强于生成器4.2 生成器强于判别器4.3 信息量不足4.4 超参数 小…

leetcode面试经典150题——34 有效的数独(矩阵)

题目&#xff1a; 有效的数独 描述&#xff1a; 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出…

机器学习入门(第六天)——支持向量机(升维打击)

Support vector machines 知识树 Knowledge tree 苹果表示重点 间隔&#xff1a;使用了几何间隔&#xff0c;保证w b的度量&#xff0c;感知机则是函数间隔 间隔最大化思想&#xff1a;则是支持向量机的独有&#xff0c;这使得它找到最优超平面 核函数&#xff1a;面试当中可…

C语言-指针讲解(4)

在上一篇博客中&#xff1a; C语言-指针讲解(3) 我们给大家介绍了指针进阶的用法 让下面我们来回顾一下讲了什么吧&#xff1a; 1.字符指针变量类型以及用法 2.数组指针本质上是一个指针&#xff0c;里面存放数组的地址。而指针数组本质上是个数组&#xff0c;里面存放的是指针…

⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)

1.这里我代码没啥问题~~~编辑器里也没毛病 void Start(){// 加载底图和上层图片string backgroundImagePath Application.streamingAssetsPath "/background.jpg";Texture2D backgroundTexture new Texture2D(2, 2);byte[] backgroundImageData System.IO.File.R…

超大规模集成电路设计----学习框架(一)

本文仅供学习&#xff0c;不作任何商业用途&#xff0c;严禁转载。绝大部分资料来自----数字集成电路——电路、系统与设计(第二版)及中国科学院段成华教授PPT 超大规模集成电路设计----学习框架&#xff08;一&#xff09; 这门课在学什么&#xff1f;这门课该怎么学&#xf…

能源企业管理ERP系统都有哪些?可以帮助企业解决哪些难点

能源企业在不同的发展阶段面对的经营压力以及遇到的管理问题各异&#xff0c;随着部分产品结构的复杂化&#xff0c;日常经营管理工作也愈加繁琐。 有些能源企业内部存在信息传递不畅、经营数据统计不及时、部门协作效率低、多仓库和多平台数据不统一等情况&#xff0c;而这些…

科技平权,哪吒汽车又双叒OTA了

OTA升级“学霸”再有新动作。11月30日&#xff0c;平均一、两个月就会OTA升级一次的哪吒汽车再度“进化”&#xff0c;同时启动哪吒S和哪吒GT的新一轮OTA升级。此轮OTA升级&#xff0c;哪吒汽车不但将百万豪车才有的赛道级技术&#xff0c;价值数万元的哪吒卫士、一键遥控泊车功…

PHPExcel 导出Excel报错:PHPExcel_IOFactory::load()

背景 近期在做 excel文件数据导出时&#xff0c;遇到如下报错&#xff1a; iconv(): Detected an illegal character in input string场景&#xff1a;计划任务后台&#xff0c;分步导出 大数据 excel文件发现在加载文件时&#xff0c;会有报错 报错信息 如下&#xff1a; {&q…