百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Step by Step之腾讯云短信-验证码实践

lipiwang 2025-06-15 17:23 4 浏览 0 评论

在商城小程序和前端上线用了一阵子之后,用户提出了体验提升的需求,如忘记密码、绑定用户、快捷注册等,作为业界最佳实践的短信验证码登录、重置密码和注册等功能开发也就提上日程了,本文就以重置密码为例,将验证码功能的设计与开发进行整理,供小伙伴们参考。


一、业务及技术实现概要设计

1、业务流程概要设计

场景一:验证码登录/注册

用户输入手机号,并请求验证码,平台产生随机6位验证码,调用腾讯云短信SDK给该手机号发送。

用户收到验证码后,在小程序端输入验证码发送给平台。

平台接收到手机号与验证码后,核验验证码是否有效(包括正确性和在有效期内),检查现有用户列表中的登录账号或者手机号码中是否包含该手机号码,如果有,则进行平台登录操作并返回,如没有找到对应的用户,进行新用户注册操作,新用户的登录账号和手机号码字段填入相同号码,并进行平台登录操作后返回。

场景二:密码重置

用户在登录界面中点击“忘记密码”后进入密码重置页,在这个页面中可以输入手机号,并点击“获取验证码”,平台收到请求后核验是否存在有该号码或相同账号名称的用户,没有找到则返回错误提示信息,找到用户后则产生随机6位验证码,调用腾讯云短信SDK给该手机号发送。

用户收到验证码后,在密码重置页输入验证码及重置密码和确认的重置密码,点击“重置”按钮后发送给平台,平台接收到所有信息后,首先核验验证码是否有效(包括正确性和在有效期内),然后核验是否存在有该号码或相同账号名称的用户,没有找到则返回错误提示信息,找到用户后则进行该用户密码的重置。

场景三:用户绑定

主要针对一些预分配用户或其他已有用户账号和密码,而用户使用了第三方认证的登录方式,如微信/微博/QQ等授权登录,然后将两个账号关联或合并的场景。

用户使用第三方授权登录后,在“我的”页面中可选择“绑定账号”操作,在绑定页面中输入手机号码,并点击“获取验证码”,平台收到请求后核验是否存在有该号码或相同账号名称的用户,没有找到则返回错误提示信息,找到用户后则产生随机6位验证码,调用腾讯云短信SDK给该手机号发送。

用户收到验证码后,在绑定页面中输入验证码,并点击“账号绑定”操作,平台接收到手机和验证码信息后,首先核验验证码是否有效(包括正确性和在有效期内),然后核验是否存在有该号码或相同账号名称的用户,没有找到则返回错误提示信息,找到用户后则将两个账号进行合并。

其他设计要求

前端验证码发送间隔控制:验证码发送后,需要防止用户马上进行二次发送,一般在“发送验证码”按钮上进行disable操作,并进行有效期倒计时,一般是2分钟或1分钟,即从120秒或60秒开始倒计时。

后端验证码有效期控制:后端接收到验证码发送请求后,先去检查是否超过有效期,如果没有超过则直接返回已发送成功,如果超过有效期才会调用腾讯云短信SDK再次发送验证码,有效期一般设置为5分钟。

2、技术实现概要设计

前端概要设计

小程序页面设计参照上述的场景进行开发即可,并无特别困难的地方,稍微需要注意的是实现“验证码发送”的倒计时控制。

后端概要设计

腾讯云SDK的基础接入和调用具体见之前的文章-《Step by Step之最简腾讯云短信实践》,就不再重新赘述。

不同的是验证码生成及生效时间的控制,采用Redis实现,即平台随机生成验证码,并调用腾讯云短信SDK发送成功后,在Redis中写入对应的Key和有效期,这样在核验验证码时,直接查询Redis是否存在对应的Key即可。

二、验证码重置密码实践

1、前端实践及相关代码

参考界面如下:

//手机号码校验
let reg = /^1[3|5|6|7|8|9]\d{9}$/;
if (!reg.test(this.data.mobile)) {
  wx.showToast({
    title: '手机号码输入错误',
    icon: 'none'
  })
  return
}

// 验证码发送倒计时
// wxml
<text class="verify-text" bindtap="handleVerifyCode">{{txtVerify}}</text>
// js
data: {
  txtVerify: '获取验证码',
  verifyTimer: null,
  verifyTimerValue: 60, 
},
  
// 发送验证码成功后
var that = this;
if (!that.data.verifyTimer) {
  that.data.verifyTimer = setInterval( function () {
    if (that.data.verifyTimerValue == 0) {
      clearInterval(that.data.verifyTimer)
      that.data.verifyTimer = null
      that.setData({
        txtVerify: '获取验证码'
      })
    } else {
      that.setData({
        txtVerify: '请等候' + that.data.verifyTimerValue + '秒'
      })
    }
    that.data.verifyTimerValue = that.data.verifyTimerValue - 1;
  }, 1000)
}

// handleVerifyCode函数中初始校验
// check the status of timer
if (this.data.verifyTimer !== null) {
  return 
}

这里也可以把text组件换成Button组件,就可以使用button的disabled属性进行控制,就不需要在回调函数开头进行判断。

2、后端实践及相关代码

其他逻辑都很简单,把随机数及Redis部分代码贴出以供参考。

// 随机数相关
StringBuilder verifyCode = new StringBuilder();
Random random = new Random();
for (int i = 0; i < 6; i++) {
  verifyCode.append(random.nextInt(10));
}

// Redis相关
// 检查是否在有效期内发送过验证码
if (RedisUtil.hasKey(CONSTANTS_REDIS_VERIFY_PREFIX+mobileNumber)) {
  return "验证码已发送,请稍后再重试";
}
// 发送验证码
MessageUtils.sendVerifyCode(mobileNumber, verifyCode.toString(), CONSTANTS_VERIFY_CODE_EXPIRE_TIME
// 在Redis中增加对应的键值
RedisUtil.set(CONSTANTS_REDIS_VERIFY_PREFIX+mobileNumber, verifyCode, CONSTANTS_VERIFY_CODE_EXPIRE_TIME);


相关推荐

软件测试|MySQL CROSS JOIN:交叉连接的详细解析

简介在MySQL数据库中,CROSSJOIN是一种用于生成两个或多个表的笛卡尔积的连接方法。CROSSJOIN不需要任何连接条件,它将左表的每一行与右表的每一行进行组合,从而生成一个包含所...

「MySQL笔记」left join-on-and 与 left join-on-where 的区别

1.摘要关于这两种写法的重要知识点摘要如下:left-join时,即使有相同的查询条件,二者的查询结果集也不同,原因是优先级导致的,on的优先级比where高on-and是进行韦恩运算连接...

MySQL中的JOIN——联合查询的基本语法

MySQL中的JOIN指令用来将两个或多个表中的数据进行联合查询,根据连接条件来匹配记录,从而得到需要的结果集。在MySQL中,常见的JOIN类型包括INNERJOIN、LEFTJOIN和RIGH...

MySQL 中的 CROSS JOIN:强大的连接工具

CROSSJOIN在MySQL里是一种挺特别的连接操作,它能弄出连接表的笛卡尔积。这就是说,要是表A有m行,表B有n行,那ACROSSJOINB的结果就会有m*n...

大厂必问:MySQL 三表 JOIN 操作的解析与性能优化,效率又如何?

大厂必问:MySQL三表JOIN操作的解析与性能优化策略,效率又如何?点击关注,开启技术之旅!大家好,这里是互联网技术学堂,无论你是一名程序员、设计师、还是对技术充满好奇心的普通人,都欢迎你加入...

面试题:MySQL 的 JOIN 查询优化(mysql查询优化方法)

MySQL的JOIN查询优化是提升数据库性能的关键环节。以下是综合多个技术文档的核心优化策略,按优先级和实现难度分类:一、索引优化:性能提升的基础为连接字段建立索引确保参与JOIN的列(通常...

Flink中处理维表关联技术实现路径

在Flink中处理维表关联大体氛围TableSQLLookupJoin和DataStream算子函数,主要技术实现路径:I.FlinkSQL/TableAPI中的Lookup...

深入剖析Zookeeper原理(一)整体设计

1.ZK集群架构设计与特性1.ZK集群架构设计:ZK主要分为三种角色:Leader(领导者):一个Zookeeper集群同一时间只会有一个实际工作的Leader,它会发起并维护与各Follwer及...

多种负载均衡算法及其Java代码实现

首先给大家介绍下什么是负载均衡负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡,英...

一分钟了解SpringCloud中的ribbon到底是什么,原理是啥?

1.概念ribbon是一款客户端负载均衡器,用于微服务之间的负载均衡。首先,什么是客户端负载均衡?如图,ribbon可以通过注册中心获取服务列表,然后自己执行自己的负载均衡策略来决定要访问哪个微服务,...

Step by Step之腾讯云短信-验证码实践

在商城小程序和前端上线用了一阵子之后,用户提出了体验提升的需求,如忘记密码、绑定用户、快捷注册等,作为业界最佳实践的短信验证码登录、重置密码和注册等功能开发也就提上日程了,本文就以重置密码为例,将验证...

10分钟入门响应式:Springboot整合kafka实现reactive

Springboot引入Reactor已经有一段时间了,笔者潜伏在各种技术群里暗中观察发现,好像scala圈子的同仁们,似乎对响应式更热衷一点。也许是因为他们对fp理解的更深吧,所以领悟起来障碍性更少...

使用java随机生成有个性的用户名,LOL地名+水浒传,合计2808个

*随机生成用户名*取水浒传108好汉名字*取LOL地名26个,组合而成*一共可以生成2808个不同特色的用户名如果你在上网的时候,用户名难取的话,这里有很多可选择的用户名,现提供100个...

深入理解Math.random()的概率分布特性

直接上源码/***Returnsa{@codedouble}valuewithapositivesign,*返回一个带符号的double类型的数字,说人话就是返回一个非负...

编程英文 - 创建/生成/构建 (create/generate/build)

在软件开发中,create、generate和build这三个词经常被用到,它们都与"创造"或"产生"某些东西有关,但在具体使用场景和含义上有所不同。基本含义creat...

取消回复欢迎 发表评论: