前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >腾讯云短信 nodejs 接入, 通过验证码修改手机示例

腾讯云短信 nodejs 接入, 通过验证码修改手机示例

原创
作者头像
用户1659066
修改于 2019-08-23 10:11:19
修改于 2019-08-23 10:11:19
12.8K23
代码可运行
举报
文章被收录于专栏:点滴点滴
运行总次数:3
代码可运行

腾讯云短信 nodejs 接入, 通过验证码修改手机示例

参考:

腾讯云短信文档

国内短信快速入门

qcloudsms Node.js SDK

文档中心>短信>错误码

nodejs sdk 使用示例

代码语言:txt
AI代码解释
复制
const QcloudSms = require('qcloudsms_js');

const cfg = {
  appid: 1400123123, // SDK AppID 以1400开头
  appkey:  '...', // 短信应用 SDK AppKey
  templateId: 402790, // 短信模板 ID,需要在短信控制台中申请
  smsSign: '我的过去公众号', // NOTE: 签名参数使用的是`签名内容`,而不是`签名ID`。这里的签名"腾讯云"只是示例,真实的签名需要在短信控制台申请
}

// 简单封装一下, 向指定手机下发验证码
// sendCode('18212341234', 1234) // 发送短信
function sendCode (phone, code, time = 10) {
  phone = typeof(phone) === 'object' ? phone : [phone]
  const qcloudsms = QcloudSms(cfg.appid, cfg.appkey) // 实例化 QcloudSms
  const msender = qcloudsms.SmsMultiSender()
  msender.sendWithParam(86,
    phone, // 一个数组
    cfg.templateId, // 模版 id
    [code, time], // 正文中的参数值
    cfg.smsSign, // 签名 未提供或者为空时,会使用默认签名发送短信
    '', '',
    (err, res, resData) => { // 回调函数
      err && console.log('err: ', err)
      console.log('request data: ', res.req)
      console.log('response data: ', resData)
    })
}

请求及回调

这里的请求及回调与 sdk 中的是一样的。

参考:

文档中心>短信>API 文档>短信API>指定模板群发短信

URL 示例

POST https://yun.tim.qq.com/v5/tlssmssvr/sendmultisms2?sdkappid=xxxxx&random=xxxx

请求

代码语言:txt
AI代码解释
复制
{
  "ext": "",
  "extend": "",
  "params": [
    "验证码",
    "1234",
    "4"
  ],
  "sig": "...",
  "sign": "腾讯云",
  "tel": [
    {
      "mobile": "13788888888",
      "nationcode": "86"
    },
    {
      "mobile": "13788888889",
      "nationcode": "86"
    }
  ],
  "time": 1457336869,
  "tpl_id": 19
}

回调

代码语言:txt
AI代码解释
复制
{
  "result": 0,
  "errmsg": "OK",
  "ext": "",
  "detail": [
    {
      "errmsg": "OK",
      "fee": 1,
      "mobile": "13788888888",
      "nationcode": "86",
      "result": 0,
      "sid": "xxxxxxx"
    },
    {
      "errmsg": "OK",
      "fee": 1,
      "mobile": "13788888889",
      "nationcode": "86",
      "result": 0,
      "sid": "xxxxxxx"
    }
  ]
}

使用验证码修改手机

API 发送验证码

返回验证码及有效时间的加密为字符串.

代码语言:txt
AI代码解释
复制
query: {phone}
response: {token}
代码语言:txt
AI代码解释
复制
phoneCode({
  body: {},
  query: {
    phone: '18212341234',
  }
})
async function phoneCode (ctx) {
  let {phone} = ctx.query
  let code = '1234' // 生成验证码用于测试
  if(process.env.PRO_ENV === 'pro') { // 如果是正式环境, 修改验证码为随机
    code = String(Math.random()).slice(-4)
    sms.sendCode(phone, code) // 发送验证码
  }
  let token = jwt.sign(
    { // 加密的 json 信息
      phone,
      code,
      iat: Date.now() + 1000 * 60 * 10, // 过期时间设置为 10 分钟后
    },
    config.jwt.secret, // secret 为密匙
  )
  ctx.body = {token: token} // 返回加密后的内容
}

API 修改手机号

解密加密字符串, 判断是否与用户填写的对应.

代码语言:txt
AI代码解释
复制
body: {
  token,
  phone,
  code,
}
response: {...}
代码语言:txt
AI代码解释
复制
phoneChange({
  body: {
    token: '...',
    phone: '18212341234',
    code: '1111',
  },
  query: {},
})
async function phoneChange(ctx) {
  const userModel = models.user // 数据库中的 user 表
  const { token, phone, code } = ctx.body
  let decoded = jwt.decode(token, config.secret) // 使用 secret 密匙解密 token
  let { creator_id } = ctx.state || {}
  if(!creator_id) {return console.log('非法请求')}
  const apiUser = await userModel.findOne({ where: { id: creator_id }}) // 查询当前发起请求的用户
  if (apiUser && decoded) {
    if(decoded.iat < Date.now()) {return console.log('验证码已过期')}
    if(decoded.phone !== phone) {return console.log('接收验证码的手机号与要修改的手机号不匹配')}
    if(decoded.code !== code) {return console.log('验证码错误')}
    const bindUser = await userModel.findOne({where: {bind_phone: phone}, raw: true}) // 查询是否存在已绑定
    if(bindUser) {return console.log('该手机号已有绑定用户')}
    
    apiUser.bind_phone = phone // 修改为新手机并保存
    return ctx.body = await apiUser.save({ new: true })
  } else {
    return console.log('该用户不存在')
  }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
2 条评论
热度
最新
看着全网最详细的,但仍看不懂,自学小白太难了
看着全网最详细的,但仍看不懂,自学小白太难了
11点赞举报
我也是在学习中,来一起学习哇
我也是在学习中,来一起学习哇
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
如何解决Redis复制风暴?
作为一个DBA,已经遇到过很多次Redis复制异常了。下面让我来介绍一下Redis复制风暴原因及其处理方式。
用户10842762
2023/11/24
6531
面试题:讲讲Redis主从架构?
单机的 redis,能够承载的 QPS 大概就在上万到几万不等。对于缓存来说,一般都是用来支撑读高并发的。因此架构做成主从(master-slave)架构,一主多从,主负责写,并且将数据复制到其它的 slave 节点,从节点负责读。所有的读请求全部走从节点。这样也可以很轻松实现水平扩容,支撑读高并发。
用户1263954
2019/07/04
5830
Redis复制缓冲区案例
可以看到,主库在进行了bgsave的时候,发生了中断,和从库之间的连接被断开了,原因也很清楚,就是超过了output buffer的值
AsiaYe
2021/10/14
1.3K0
Redis缓冲区不会还有人不知道吧?
会导致缓冲区需越来越多内存暂存数据。当缓冲区占用内存>设定上限阈值,就会出现缓冲区溢出。发生溢出,就会丢数据。不给缓冲区设上限,不就没这问题了?No!随累积数据增多,缓冲区所占内存空间越大,耗尽Redis机器可用内存时,Redis实例就会崩溃!
JavaEdge
2023/02/01
1.2K0
redis灵魂拷问:聊一聊主从复制缓冲区
在我之前《redis灵魂拷问:怎样搭建一个哨兵主从集群》搭建的集群主从哨兵集群,有1个主节点和2个从节点环境如下表:
jinjunzhu
2020/11/04
1.4K0
redis灵魂拷问:聊一聊主从复制缓冲区
Redis知识思维导图总结
Redis基础知识总结思维导图,系统的学习Redis。不定时更新。 主要包括: 基本数据和应用场景 常见问题分析 性能优化 持久化 集群模式 子模块 基本知识 基本数据类型和使用场景 基本数据类型 string 二进制安全,可以包含任何数据,一个键最大能存储512M hash 键值对集合,存储、读取、修改用户属性 list 链表(双向链表),可用于最新消息排行等功能(比如朋友圈的时间线)和消息队列 set 哈希表实现,元素不重复。可用于利用唯一性,统计访问网站的所有独立ip和好友推荐时
zeekling
2022/08/26
4480
Redis知识思维导图总结
Redis:22---客户端API:client、monitor)
一、client list client list命令能列出与Redis服务端相连的所有客户端连接信息。例如下面代码是在一个Redis实例上执行client list的结果,其中每一行代表一个客户端信
用户3479834
2021/02/03
8210
Redis:22---客户端API:client、monitor)
Redis pipeline(12)原
Pipeline模式:是一次性发送多个命令,最后一次取回所有的返回结果,这种模式通过减少网络的往返时间和io读写次数,大幅度提高通信性能。
兜兜毛毛
2020/04/23
9840
记录一次redis cluster集群故障-运维笔记
公司的一个系统业务出现故障,提示查询redis失败。查询相关日志,分析过程记录如下:
洗尽了浮华
2018/12/04
5.3K0
Redis学习五(Redis 阻塞的原因及其排查方向).
因为 Redis 是单线程的,大量的慢查询可能会导致 redis-server 阻塞,可以通过 slowlog get n 获取慢日志,查看详情情况。
JMCui
2020/11/05
2.2K0
Redis学习五(Redis 阻塞的原因及其排查方向).
如何保证 redis 的高并发和高可用?(redis 主从架构)
如果你用 redis 缓存技术的话,肯定要考虑如何用 redis 来加多台机器,保证 redis 是高并发的,还有就是如何让 redis 保证自己不是挂掉以后就直接死掉了,即 redis 高可用。
IT技术小咖
2019/11/22
2K0
redis.conf翻译与配置(六)【redis6.0.6】
当散列有少量条目且最大条目不超过给定的阈值时,使用内存高效数据结构对其进行编码。可以使用以下指令配置这些阈值:
看、未来
2022/05/06
6850
redis8.0新特性之Rdb Channel Replication:如何使复制过程更快,提升主节点在全量同步期间的性能
水平及维护精力所限,译文不免存在错误或过时之处,如有疑问,请查阅原文(文末英文链接)。
崔认知
2025/03/03
2350
redis8.0新特性之Rdb Channel Replication:如何使复制过程更快,提升主节点在全量同步期间的性能
redisclient命令_redisconnection
对于每个与服务器进行连接的客户端,服务器都为这些客户端建立了相应的 redis.h/redisClient结构(客户端状态),这个结构保存了客户端当前的状态信息,以及执行相关功能时需要用到的数据结构,其中包括:
全栈程序员站长
2022/11/04
5130
redisclient命令_redisconnection
如何确保Redis Pub/Sub模式的数据安全?
最近遇到一个生产环境问题,排查了比较久,记录一下,方便以后反思。 业务场景:实现每天的考勤打卡提醒,根据配置的规则数据,比如每天提前几分钟,提醒员工打卡,所以会下班前几分钟推送消息到微信公众号,提醒员工,记得打卡考勤
SmileNicky
2024/12/23
1580
《Redis设计与实现》读书笔记(十九) ——Redis客户端创建关闭及客户端总结
《Redis设计与实现》读书笔记(十九) ——Redis客户端创建关闭及客户端总结 (原创内容,转载请注明来源,谢谢) 一、客户端的创建于关闭 1、普通客户端连接 普通的客户端,通过connect
用户1327360
2018/03/07
1.7K0
《Redis设计与实现》读书笔记(十九)  ——Redis客户端创建关闭及客户端总结
Redis事件循环
Redis基于IO多路复用模式开发了自己的网络事件处理器,这个处理器被称为文件事件处理器,该处理器核心运作流程如下:
大忽悠爱学习
2022/12/30
5640
Redis事件循环
redis安装配置
redis安装配置文档 # 非常详细redis的介绍 http://blog.chinaunix.net/uid-790245-id-3766268.html wget http://redis.googlecode.com/files/redis-2.6.10.tar.gz tar zxvf redis-2.6.10.tar.gz -C /usr/local/ cd /usr/local/redis-2.6.10 make make install # make命令执行完成后,会在src目录下生成5个可执
程序员同行者
2018/07/02
9290
Redis的缓冲区
在Redis中,也存在缓冲区,即使Redis本身就是将数据存储在内存中,但也利用了内存缓冲区来避免因为请求处理速度跟不上请求接收速度而导致的数据丢失和性能问题。
夜半钟鸣
2021/02/19
1.4K0
Redis 复制过程详解
Redis 的复制功能分为同步( sync )和命令传播( command propagate )两个步骤:
程序员历小冰
2019/09/22
4810
Redis 复制过程详解
推荐阅读
相关推荐
如何解决Redis复制风暴?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验