抖音实战~手机号一键注册登录流程(验证码)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

一、 一键注册登录流程

在这里插入图片描述

二、前端
2.1. 验证码获取流程
  • 1.点击->获取验证码调用后端获取验证码api接口
  • 2.验证码59秒倒计时
  • 3.重复点击获取验证码,判断验证码倒计时是否大于0:
    • 3.1.如果大于0,获取验证码按钮不可触摸
    • 3.2.如果等于0,获取验证码调用后端获取验证码api接口
2.2. 验证码获取代码
	var serverUrl = app.globalData.serverUrl;
				// 调用后端发送验证码
				uni.request({
					method: "POST",
					url: serverUrl + "/passport/getSMSCode?mobile=" + mobile,
					success(result) {
						var status = result.data.status;
						if (status != 200) {
							uni.showToast({
								title: result.data.msg,
								icon: "none"
							});
						}
						
						// 开始倒数60秒限制
						if(me.codeTimes == 0) {
							me.doTimer(59);
						}
					}
				});	
			},
			// 发送验证码的倒计时方法
			doTimer(times) {
				var me = this;
				// 倒计时定时器
				var sendCodeBtnFunction = function(){
					var left = times--;

					if (left <= 0) {
						me.codeTouched = false;
						me.codeBtnText = "发送验证码";
						clearInterval(smsTimer);
					} else {
						me.codeBtnText = left + "s";
					}
					me.codeTimes = left;
				};
				var smsTimer = setInterval(sendCodeBtnFunction, 1000);
			},
三、后端验证码
3.1. 前置处理

由于为了避免频繁获取验证码导致无效的操作,因此,对验证码获取逻辑需要进行前置拦截处理。
根据用户ip进行限制,限制用户在60秒之内只能获得一次验证码

先进入->验证码前置拦截处理:

  • 1.获取用户的ip
  • 2.验证码redis存储key的前缀+获取用户的ip当做redis中的key,从redis中获取已经存储的请求请求ip
    • 1.如果redis中存在未过期的用户请求ip,则提示"短信发送太快啦~请稍后再试!"
    • 2.如果redis中,不存在用户请求ip,则放行,继续调用获取验证码接口api
      在这里插入图片描述
3.2. 拦截器添加

在这里插入图片描述

3.3. 获取验证码
  • 1.对输入框填写的数据进行校验,不合法则提示,合法继续。
  • 2.获得用户请求ip
  • 3.根据用户ip进行限制,限制用户在60秒之内只能获得一次验证码
  • 4.生成随机6位验证码
  • 5.调用腾讯/阿里短信服务,发送验证码
  • 6.把验证码放入到redis中,用于后续的验证
  • 7.返回验证码
    在这里插入图片描述
<think>好的,我现在需要为用户介绍小程序的一键登录实现。用户之前询问过UniApp+Vue2的跨平台一键登录按钮,现在转向小程序,可能需要了解特定于平台的实现方式。 首先,我需要回忆小程序的开发框架和登录流程小程序基于字节跳动的小程序框架,可能使用自己的API,类似于微信小程序,但细节会有不同。用户可能需要知道如何获取用户信息、授权流程以及如何与后端交互。 接着,用户可能关注的是具体实现步骤,比如按钮的创建、授权弹窗的处理、获取用户信息的API调用,以及如何发送到后端服务器。需要注意的是,小程序的API可能和微信不同,比如登录接口、获取用户信息的接口名称和参数可能有差异。 另外,考虑到用户之前使用的是UniApp,可能需要确认是否支持小程序的跨平台开发,或者是否需要单独为编写原生代码。不过,用户这次的问题可能集中在原生小程序的实现,因此需要以原生开发为例。 还需要注意权限配置,比如在小程序中是否需要申请特定的权限,比如用户信息权限,以及如何在manifest或项目配置中声明这些权限。此外,安全性和防止重复点击等优化措施也需要提及,类似于之前的防处理。 最后,应该提供示例代码,展示按钮的模板、事件处理函数、API调用顺序,以及如何处理成功和失败的情况。同时,提醒用户替换示例中的接口URL和参数,如appid、token存储方式等。 可能还需要比较和微信小程序在登录流程上的异同,帮助用户迁移之前的经验。比如,是否也需要用户主动触发按钮,授权流程是否分步骤,是否需要先调用登录接口获取code,再换取用户信息等。 总结下来,回答需要包括以下部分: 1. 小程序登录的基本流程 2. 按钮的创建和事件绑定 3. 获取用户授权和用户信息的API使用 4. 与后端交互的示例 5. 注意事项和配置要求 6. 代码示例和关键点说明 需要确保信息准确,参考小程序的官方文档,避免过时的API或方法。如果有不确定的地方,可能需要查阅最新文档或示例,确保示例代码的正确性。</think>以下是针对 **小程序(字节跳动小程序)** 的一键登录实现指南,包含核心流程、代码示例和注意事项: --- ### **小程序登录核心流程** 小程序的登录流程分为两步: ``` 1. 用户点击按钮 → 触发登录授权 → 获取临时 code 2. 将 code 发送到后端 → 后端换取用户 openid/session → 返回 token ``` --- ### **完整代码示例** ```html <!-- 登录按钮模板 --> <view class="container"> <button class="login-btn" open-type="getUserInfo" @getuserinfo="handleLogin" @click="preventFastClick" > 一键登录 </button> </view> ``` ```javascript // 逻辑层代码 Page({ data: { isLogging: false // 防止重复点击 }, // 防处理 preventFastClick() { if (this.isLogging) return; this.setData({ isLogging: true }); }, // 登录处理 async handleLogin(e) { const { detail } = e; if (!detail.userInfo) { this.setData({ isLogging: false }); return tt.showToast({ title: '授权取消', icon: 'none' }); } try { // 1. 获取用户临时 code const { code } = await new Promise(resolve => { tt.login({ force: true, success: resolve }); }); // 2. 发送 code + 用户信息到后端 const res = await tt.request({ url: 'https://your-api.com/login-by-douyin', method: 'POST', data: { code, rawData: detail.rawData, // 原始用户数据 signature: detail.signature // 数据签名(用于后端验证) } }); // 3. 存储登录态 tt.setStorageSync('token', res.data.token); tt.showToast({ title: '登录成功' }); // 4. 跳转页面 tt.reLaunch({ url: '/pages/home/index' }); } catch (err) { tt.showToast({ title: '登录失败', icon: 'none' }); console.error('登录错误:', err); } finally { this.setData({ isLogging: false }); } } }); ``` --- ### **关键配置说明** 1. **权限声明** 在 `app.json` 中添加用户信息权限: ```json { "permission": { "scope.userInfo": { "desc": "用于获取您的账号信息" } } } ``` 2. **按钮要求** - 必须使用 `<button>` 组件 - 必须设置 `open-type="getUserInfo"` - 用户主动点击才能触发授权弹窗 --- ### **流程详解** 1. **前端触发登录** - 用户点击按钮 → 弹出授权弹窗 - 同意后通过 `@getuserinfo` 事件返回加密用户数据 2. **后端验证流程** ```mermaid graph LR A[前端发送 code + rawData] --> B[后端用 code 换取 session_key] B --> C[后端用 session_key 解密数据] C --> D[返回用户唯一标识 openid + token] ``` --- ### **注意事项** 1. **安全校验** - 必须验证 `signature` 防止数据篡改 - 示例验证代码(Node.js): ```javascript const crypto = require('crypto'); const signature = crypto .createHash('sha1') .update(rawData + session_key) .digest('hex'); ``` 2. **用户信息敏感字段** - 返回的 `userInfo` 包含脱敏昵称(如 `昵称**`) - 如需获取真实手机号,需额外申请资质并通过 `<button open-type="getPhoneNumber">` 3. **测试环境限制** - 开发者工具中无法获取真实 `openid`,需使用真机调试 --- ### **扩展功能** **获取手机号(需企业资质)** ```html <button open-type="getPhoneNumber" @getphonenumber="handlePhone"> 绑定手机号 </button> ``` ```javascript handlePhone(e) { const { encryptedData, iv } = e.detail; // 发送 encryptedData + iv 到后端解密 } ``` --- 以上代码可直接用于小程序项目,需替换实际接口地址并补充后端解密逻辑。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gblfy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值