【NodeJs】UniSMS 实现短信验证码

承接上文 ,上次用的是 短信宝平台 认证已经通过 后续又新增要求 平台相当麻烦!

短信宝实现短信发送要求:
1.平台绑定手机号    必须和   营业执照法人一致
2.平台个人实名认证 必须和  营业执照法人一致
3.平台需要上传营业执照
4.平台需要上传手持身份证
5.平台需要网站备案信息 备案信息 必须和 营业执照法人一致

第五步完成后 我不知道还需要提交什么才能通过认证实现短信发送 ,因为我看不到平台这个洞底

 

UniSMS

介绍:

认证要求, 平台有 个人认证 和 企业认证 

  • 个人认证实名通过后 创建签名 添加对应信息提交等待
  • 企业认证提交 三合一营业执照  创建签名 添加对应信息提交等待
     

说一下 unisms 我这里是怎么通过的 
提交三合一营业执照 创建签名 签名名称 添加 机构名即可
相比其他平台 unisms 会快捷容易

实现短信验证码发送

unisms有实现短信发送两种方式分别是 SDK 和 API接口 


sdk实现:

注意:这里把 .js 后缀 替换为 .cjs 为什么要替换? 这样 Node.js 会将该文件视为 CommonJS 模块。

安装第三方库:

npm install unisms or yarn add unisms

const express = require('express')
const router = express.Router()
const UniSMS = require('unisms').defaultconst client = new UniSMS({accessKeyId: 'your access key id'
})
const SmsSignature = 'your SMS signature name'async function sendSMS (mobile, template, codeNumber) {try {const data = await client.send({to: mobile,  //手机号signature: SmsSignature, //你的短信签名 名称templateId: template,  //你的短信签名模版templateData: { code: codeNumber } //短信验证码})console.log('SMS Sent:', data)return 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()
}router.get('/uniSdk/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)const TemplateContent = 'your sms template variate'await sendSMS(mobileNumber, TemplateContent, verificationCode)res.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.' })}
})module.exports = router

API接口实现

import express from 'express'
const router = express.Router()
import axios from 'axios'
// 替换为你的API账号信息const apiAccessKeyId = 'your access key id'
const apiUrl = 'https://uni.apistd.com/'
const apiAction = 'sms.message.send'
const SmsSignature = 'your sms signature name'
// 'pub_verif_basic'
// 发送短信验证码的函数
async function sendSMS (mobile, template, codeNumber) {try {// url: apiUrl + '?action=' + apiAction + '&accessKeyId=' + apiAccessKeyIdconst { data } = await axios({url: apiUrl + '?action=' + apiAction + '&accessKeyId=' + apiAccessKeyId,method: 'post',data: {to: mobile, //手机号signature: SmsSignature, //短信签名 名称templateId: template, // 短信内容templateData: { code: codeNumber } //验证码} })// 处理响应,根据需要进行进一步的处理console.log('SMS Sent:', data)return 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()
}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)const TemplateContent = 'your sms Template variable'await sendSMS(mobileNumber, TemplateContent, verificationCode)res.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.' })}
})
export default router

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

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

相关文章

拒接服务攻击(DOS)的初步介绍

文章目录 什么是拒绝服务攻击拒绝服务攻击的过程拒绝服务攻击的类型常见的拒绝服务攻击如何防范拒绝服务攻击分布式拒绝服务攻击(DDoS) 什么是拒绝服务攻击 拒绝服务攻击是一种网络攻击方式,攻击者通过向目标计算机系统或网络发送大量的请求…

免费分享一套Springboot+Vue前后端分离的在线商城系统,挺实用的

大家好,我是java1234_小锋老师,看到一个不错的SpringbootVue前后端分离的在线商城系统,分享下哈。 项目视频演示 【免费】SpringbootVue在线商城系统 毕业设计 Java毕业设计_哔哩哔哩_bilibili【免费】springbootvue在线商城系统 毕业设计 …

97基于matlab的改进的带记忆的模拟退火算法求解TSP问题

基于matlab的改进的带记忆的模拟退火算法求解TSP问题,采用多普勒型降温曲线描述迭代过程,在传统算法的基础上增加记忆功能,可测试中国31/64/144以及att48城市的数据,也可自行输入数据进行测试,测试结果基本达到当前最优…

Swagger2的使用

手写Api文档的几个痛点: 文档需要更新的时候,需要再次发送一份给前端,也就是文档更新交流不及时。 接口返回结果不明确 不能直接在线测试接口,通常需要使用工具,比如postman 接口文档太多,不好管理 Sw…

gin投票项目4

对应视频v2版本 gin项目投票系统4 1.增加一个注册账号的功能 增加接口 参数校验:(需求) 确认密码需要一致,不为空用户名必须唯一, 不为空用户名大于8小于16位密码大于8小于16位,并且不能为纯数字 正则表达式 必须知道这东西…

我对迁移学习的一点理解(系列2)

文章目录 我对迁移学习的一点理解 我对迁移学习的一点理解 源域和目标域是相对的概念,指的是在迁移学习任务中涉及到的两个不同的数据集或领域。 源域(Source Domain)通常指的是已经进行过训练和学习的数据集,它被用来提取特征、…

Nginx缓存及HTTPS配置小记

缓存基础 缓存分类 某些场景下,Nginx需要通过worker到上有服务中获取数据并将结果响应给客户端,在高并发场景下,我们完全可以将这些数据视为热点数据,并将其缓存到Nginx服务上。 客户端缓存:将缓存数据放到客户端。 …

yolov8与yolov5网络对比

回顾一下YOLOv5,不然没机会了 这里粗略回顾一下,这里直接提供YOLOv5的整理的结构图吧: Backbone:CSPDarkNet结构,主要结构思想的体现在C3模块,这里也是梯度分流的主要思想所在的地方;PAN-FPN&…

OFDM模糊函数仿真

文章目录 前言一、OFDM 信号及模糊函数1、OFDM 信号表达式2、模糊函数表达式 二、MATLAB 仿真1、MATLAB 核心源码2、仿真结果①、OFDM 模糊函数②、OFDM 距离模糊函数③、OFDM 速度模糊函数 前言 本文进行 OFDM 的仿真,首先看一下 OFDM 的模糊函数仿真效果&#xf…

【vim】常用操作

用的时候看看,记太多也没用,下面都是最常用的,更多去查文档vim指令集。 以下均为正常模式下面操作,正在编辑的,先etc一下. 1/拷贝当前行 yy,5yy为拷贝包含当前行往下五行 2/p将拷贝的东西粘贴到当前行下…

Nmap脚本的应用场景

网络安全检测和漏洞扫描 Nmap脚本是一种强大的工具,可以用于网络安全检测和漏洞扫描。在渗透测试工程师的角度下,本文将详细阐述Nmap脚本的应用场景,以及如何使用Nmap脚本进行网络安全检测和漏洞扫描。 一、Nmap脚本的应用场景 Nmap脚本在渗…

Java、JDK、JRE、JVM

Java、JDK、JRE、JVM 一、 Java 广义上看,Kotlin、JRuby等运行于Java虚拟机上的编程语言以及相关的程序都属于Java体系的一员。从传统意义上看,Java社区规定的Java技术体系包括以下几个部分: Java程序设计语言各种硬件平台上的Java虚拟机实…

vue的知识点

Vue.js是一个渐进式JavaScript框架,用于简化Web应用程序开发和管理。下面是Vue.js的一些核心知识点: 1. 数据绑定:Vue.js通过指令和模板语法实现了双向数据绑定,可以实时更新视图和模型之间的数据。 2. 组件化开发:V…

【力扣】移除链表元素203

目录 1.前言2. 题目描述3. 题目分析3.1 不带哨兵位3.2 带哨兵位 4. 附代码4.1 不带哨兵位4.2 带哨兵位 1.前言 这里开始介绍从网上一些刷题网站上的题目,在这里做一些分享,和学习记录。 先来介绍一些力扣的OJ题目。 这里的OJ就是我们不需要写主函数&…

数据表记录的操作

一、数据添加 1、打开SSMS,附加数据库(数据库文件在自己的文件夹下面),并进行下面的设置: (1)设置“部门信息”表中的“编号”为主键(SSMS) 首先建立好所需的数据库库…

华为OD机试 - 生成哈夫曼树(Java JS Python C)

题目描述 给定长度为 n 的无序的数字数组,每个数字代表二叉树的叶子节点的权值,数字数组的值均大于等于1。 请完成一个函数,根据输入的数字数组,生成哈夫曼树,并将哈夫曼树按照中序遍历输出。 为了保证输出的二叉树中序遍历结果统一,增加以下限制: 二叉树节点中,左节…

java中什么是线程池?

线程池(Thread Pool)是一种线程管理的机制,它主要解决了线程生命周期的开销和资源消耗问题。线程池在程序中创建一些预先定义数量的线程,将任务分配给这些线程,从而提高了线程的重用性和性能。线程池的核心思想是将创建…

为 Compose MultiPlatform 添加 C/C++ 支持(3):实战 Desktop、Android、iOS 调用同一个 C/C++ 代码

theme: serene-rose 前言 在本系列的前两篇文章中我们已经学会了如何在 kotlin native 平台(iOS)使用 cinterop 调用 C/C 代码。以及在 jvm 平台(Android、Desktop)使用 jni 调用 C/C 代码,并且知道了如何自动编译 A…

Git 五分钟教程速度入门

Git 五分钟教程速度入门 分类 编程技术 许多人认为 Git 太混乱,或认为它是一种复杂的版本控制系统,其实不然,这篇文章有助于大家快速上手使用 Git。 入门 使用Git前,需要先建立一个仓库(repository)。您可以使用一个已经存在的…

Win10操作系统安装Python

1 Python解释器下载 1.1 安装环境 Windows 10 专业工作站版22H2 python-3.9.6-amd64.exe 1.2 下载地址 Python官网:Welcome to Python.org Python镜像:CNPM Binaries Mirror 2 Python解释器安装 2.1 Install Python 3.9.6 (64-bit)界面 双击运行下…