微信小程序登录流程与实现

这篇具有很好参考价值的文章主要介绍了微信小程序登录流程与实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在了解小程序登录之前,请大家先了解小程序的全局实例和全局组件,以方便理解本文的后续内容,已经了解的可以直接开始。
全局实例和全局组件( 👈 点击直达)

微信小程序的登录流程

微信小程序jscode,原生微信小程序,微信小程序,小程序,前端,javascript,uniapp

微信小程序的登录

首先需要写一个微信小程序的登录弹窗,登录弹窗的作用就是发起登录,让用户点击授权后登录小程序,该弹窗是一个全局弹窗,因为小程序是有分享功能的,如果新用户是从分享的链接进来的,那么会先让新用户登录再做后续操作。
所以,登录功能得是一个组件,而且,登录必须是全局弹窗。
在登录页面的index.json文件中,设置登录弹窗为组件

{
  "component": true,
  "usingComponents": {
     // xxxx.....
  }
}

登录弹窗上需要有授权的选项,如果未勾选授权直接点击登录,需要提示用户先授权再登录

用户勾选授权后,点击登录。 小程序登录需要使用 button 组件,将button组件的 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到动态令牌code,然后把code传到开发者后台,并在开发者后台调用微信后台提供的 phonenumber.getPhoneNumber 接口,消费code来换取用户手机号。并且每个code有效期为5分钟,且只能消费一次。
open-type="getPhoneNumber"使用文档 ( 👈 点击直达)

注:getPhoneNumber 返回的 codewx.login 返回的 code 作用是不一样的,不能混用。

<button open-type="getPhoneNumber" bindgetphonenumber="handleConfirm"></button>
  data: {
    show: false,     // 登录弹窗是否显示
    selected: true,  // 是否勾选授权
    loginSuccess: undefined,
    loginFail: undefined,
  },
  
    // 确认授权手机号-这里可以做节流操作,防止用户点击次数过多,为了便于演示,这里未做节流
    async handleConfirm(data) {
      const {selected} = this.data
      // 用户未勾选,提示请勾选
      if(!selected){
        wx.showToast({
          title: '请同意《用户隐私协议》',
          icon: 'none'
        })
        return
      }
      // data.detail.code就是获取手机号的动态令牌
      let info = data.detail
      let fail = this.data.loginFail
      if (info.code) {
        // info.code就是手机号动态令牌
        
        /**新版本微信小程序不需要提前调用wx.login进行登录,这里的写法是为了实配老版本,在获取手机号授权登录之前先调用wx.login
           这里的app.globalData.userInfo为全局挂载的userInfo,关于userInfo的解释在本文下方
        */
        /* 使用awiat阻塞进程 */
        await app.globalData.userInfo._getLoginCode()  // wx.login登录
        // 调用了wx.login后进入下一步
        
        this.setPhoneInfo(info)  // 绑定手机号-获取手机号授权用户登录功能
      } else {
        fail && fail(info)
      }
    },
    

// 绑定手机号-获取手机号授权用户登录功能
setPhoneInfo(data) {
  let success = this.data.loginSuccess
  let fail = this.data.loginFail
  // data.jsCode保存通过login获取的code
  data.jsCode = app.globalData.userInfo.code
  // 手机号动态令牌
  data.phoneCode = data.code 
  // 调用用户登录接口,removeNull其实是一个封装的方法, 用来去掉空格,本质就是传了一个data
  getLoginSession(removeNull(data)).then(async res => {
    // then为登录成功,存入token
    wx.setStorageSync('token', res.data)
    // 手机号授权算登录成功
    success && success()
    // 设置全局userInfo属性,isLogin = true,表示登录成功
    app.globalData.userInfo.isLogin = true
    // 清除等待列表
    wx.queue.asyncExe("login_back")
    // 调用全局的_getUserInfo方法,传入'login'参数
    await app.globalData.userInfo._getUserInfo('login')
    // 关闭弹框
    this.hideLogin()
  }).catch(async e => {
    if (e.data.indexOf("已绑定") > -1) {
      success && success()
      wx.setStorageSync("token", e.data)
      await app.globalData.userInfo._getUserInfo('login')
    } else {
      fail && fail()
    }
    // 关闭弹框
    this.hideLogin()
  })
  },


// 关闭弹框
hideLogin() {
      // 关闭弹框
      this.setData({
        show: false
      }, () => {
        if (isPopup()) {
          // 显示tabbar()
          setTimeout(() => {
            this.getTabBar().show()
          }, 300)
        }
      })
 },

旧版本的微信小程序是需要提前调用wx.login获取code才能进行下一步操作,而新版本则不需要提前调用wx.login进行登录。
微信小程序jscode,原生微信小程序,微信小程序,小程序,前端,javascript,uniapp
wx.login文档 ( 👈 点击直达)

下面是userInfo.js文件,该文件内部创建了一个class类,该类会挂载到全局实例身上

// userInfo.js
import {
  getUserInfo
} from '../service/user'
class UserInfo {
  code = '' // 用户授权登录时需要用到的code
  isLogin = false // 判断用户是否已经登录拿到token
  isInfo = false  // 判断用户是否已经登录了

  /**
   * 获取用户信息
   */
  _getUserInfo(type) {
    return new Promise((resolve,reject)=>{
      // isInfo初始化为false,表示未登录过,如登录过isInfo = true,如果登录过则直接获取本地的token
      if(type=="login"&&this.isInfo) return resolve(wx.getStorageSync('userInfo'))
      this.isInfo = true
      // 调用获取用户信息的接口
      getUserInfo().then(res=>{
        // 如果返回200,拿到token以后,保存用户的信息,主要是名称和头像
        if (res.code == 200) {
          // 保存用户信息到本地
          wx.setStorageSync('userInfo', res.data)
          // resolve返回
          resolve(res)
        }
        // 不等于200 isInfo = false,表示已经登录过,重新获取即可
        this.isInfo = false
        // 不等于200 返回错误信息
        reject(res)
      },(err)=>{
        // 不等于200 isInfo = false,表示已经登录过,重新获取即可
        this.isInfo = false
        // 不等于200 返回错误信息
        reject(err)
      })
    })
  }

  /**
   * 通过wx.login获取code
   * 不全局调用,每次授权调用Login方法前,都重新获取一次
   */
  async _getLoginCode() {
    try {
      const loginCodeRes = await wx.p.login()
      console.log(loginCodeRes)
      /**loginCodeRes.code : 用户登录凭证(有效期五分钟)。开发者需要在开发者服务器后台调用 code2Session,使用 code 换取 openid、unionid、session_key 等信息 */

      // 将该code挂载到全局的global.userInfo中
      this.code = loginCodeRes.code
    } catch (error) {
      console.error(error, 'get jscode error');
    }
  }

}

export default UserInfo
// app.js
import UserInfo from './private/UserInfo'

App({
  /** 小程序生命周期,全局调用一次onLaunch */
  onLaunch(e) {
    /**new UserInfo() */
    this.globalData.userInfo = new UserInfo()
  },

  onShow(e) {},
  
  globalData: {
    userInfo: null,   /**private -> UserInfo的属性和方法挂载到这里 */
    show:false
  }
})

流程总结

通过getPhoneNumber的方式登录

1、components中创建auth文件夹,该文件夹就是内的html就是小程序的登录弹窗,auth是一个全局组件,在app.json中挂载

2、在private文件夹中封装小程序的登录方法 ——> UserInfo.js ——> js文件内创建class类,在class封装方法并导出

3、在app.jsonLaunchnew UserInfo 获取之前封装好的小程序登录方法,该方法挂载到globalData.userInfo

import UserInfo from './private/UserInfo'
App({
    onLaunch(e){
        this.globalData.userInfo = new UserInfo()
    }
})

4、auth文件夹为小程序的全局授权登录弹窗,从基础库 2.21.2 开始,对获取手机号的接口进行了安全升级,新版小程序需要用户自动触发才能获取手机号接口,需用 button 组件的点击来触发。新版小程序不再需要提前调用wx.login进行登录

<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>
Page({
  getPhoneNumber (e) {
    console.log(e.detail.code)  // 该code就是动态令牌,用于换取用户手机号
  }
})

需要将 button 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到动态令牌code,然后把code传到开发者后台,并在开发者后台调用微信后台提供的 phonenumber.getPhoneNumber 接口,消费code来换取用户手机号。每个code有效期为5分钟,且只能消费一次。

注:getPhoneNumber 返回的 codewx.login 返回的 code 作用是不一样的,不能混用。

5、用户点击弹框后,先让用户勾选协议,勾选后才允许点击登录,调用登录接口,将登录接口单独封装起来,将获取到的code手机号动态令牌当参数传入登录方法。

新版本微信不许要提前调用login来获取code码,旧版本微信小程序是需要提前调用login获取code

为了演示,所以这里提前调用 wx.login 来获取code码,并将该code码存入全局app.globalData.userInfo中,需要注意的是,该code码的有效期是5分钟

6、调用登录方法, 携带code手机号动态令牌和接口规定的必传参数,请求登录接口,返回200为登录成功,

1)、将登录成功的token存入本地
	
2)、设置全局属性app.globalData.userInfo.isLogin = true表示登录成功
	
3)、清除等待列表

7、调用获取用户信息接口,也就是全局挂载的await app.globalData.userInfo._getUserInfo(),关闭登录弹框

await app.globalData.userInfo._getUserInfo('login')

8、获取用户信息接口,通过传入的参数判断是是否要登录,这里有两种情况:

1)、用户已经登录了,只是想重新获取一下token
	
2)、用户第一次登录,要获取用户信息,例如头像、用户名称

根据这两种情况,传入的参数"login"当然是不够的,所以需要再加一个状态,isInfoisInfo默认为false

  /**
   * 获取用户信息
   */
  _getUserInfo(type) {
    return new Promise((resolve,reject)=>{
      // 用户登录过
      if(type=="login"&&this.isInfo) return resolve(wx.getStorageSync('userInfo'))
        
      // 设置isInfo = true,因为下面要走获取用户信息流程,获取后,第二次调用_getUserInfo判断isInfo = true,直接return掉
      this.isInfo = true
      // 调用获取用户信息的接口
      getUserInfo().then(res=>{
        // 如果返回200,拿到token以后,保存用户的信息,主要是名称和头像
        if (res.code == 200) {
          // 保存用户信息到本地
          wx.setStorageSync('userInfo', res.data)
          // resolve返回
          resolve(res)
        }
        // 不等于200 isInfo = false,表示已经登录过,重新获取即可
        this.isInfo = false
        // 不等于200 返回错误信息
        reject(res)
      },(err)=>{
        // 不等于200 isInfo = false,表示已经登录过,重新获取即可
        this.isInfo = false
        // 不等于200 返回错误信息
        reject(err)
      })
    })
  }

最后附上微信官方对登录的说明 ( 👈 点击直达)

以上就是微信小程序的登录流程,这些步骤都是按实际需求编写的,有些时候流程的2、3、4、5、6都是混着写的,大家可以根据项目的实际需求做自由调整。


如果觉得这篇文章对你有帮助,欢迎点赞、收藏、转发哦~文章来源地址https://www.toymoban.com/news/detail-573342.html

到了这里,关于微信小程序登录流程与实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序的登录流程

    1.使用完整服务也就是用户登录并且允许获取头像和昵称的时候,微信小程序通过方法wx.login获取到code(5 分钟内有效),携带code、appid和appSecret发送请求到服务器端; 2.服务器端利用appId、appSecret 和code调用相对应的接口(auth.code2Session)发送请求到微信官方服务器进行校验,

    2024年02月09日
    浏览(35)
  • 微信小程序登录流程理解

    小程序官网里面会提到一个小程序的登录逻辑,下面是微信登录的整个过程,官方提供的图片。    官方流程的个人理解: 1.小程序启动 。 2.小程序通过 wx.login 获取微信的 code,然后将这个 code 发送给开发者服务器(我们自己的开发服务器) 3.开发者服务器接收到code 之后,

    2024年02月09日
    浏览(65)
  • 微信小程序的微信登录流程

    目录 1、登录流程 2、wx.login 3、auth.code2Session 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎Python人工智能开发和前端开发。 🦅主页:@逐梦苍穹 🍔所属专栏:前端 📕您的一键三连,是我

    2024年02月22日
    浏览(41)
  • 前端笔记--微信小程序(原生)

    介于工作需要,这里总结一下微信小程序的开发。 官网:微信小程序 开发文档:微信开放文档 vscode安装插件:   ‘ wxml 对应 html wxss 对应 css js 逻辑层 json 数据配置层 同样也是MVVM模型 (1)app.json pages :该项目的所有页面,字符串对应文件路径,但是不要加后缀名。 我们可

    2024年02月11日
    浏览(29)
  • 【微信小程序】授权登录流程解析

      目录 微信授权登录流程 1. 官方图示流程详解 2. 代码登录流程拆解 2.1 前端代码示例讲解 2.2 后端代码示例讲解 2.3 代码登录流程拆解 🌟 3. 表情包存储展示(扩展) 附议  ① 微信服务器验证: 当用户打开小程序时,小程序会向用户展示登录按钮,用户点击登录按钮后,小

    2024年02月08日
    浏览(32)
  • 前端uniapp+后端springboot 详细教程《实现微信小程序授权登录》(附完整前后端项目demo)

    微信小程序官方登录流程图: 参考微信小程序登录官网文档 1、前端技术栈 1.1、uniapp 使用uniapp构建一套代码多端使用的前端框架项目 1.2、前端封装工具 dateUtil.js: 功能: 1. 时间日期格式化 2. 传入日期是否和当前日期的比较 完整代码: requestUtil.js: 功能: 1. 定义公共的

    2024年02月14日
    浏览(37)
  • 原生微信小程序全流程(基础知识+项目全流程)

    小程序文件类型 小程序主要提供了 4 种文件类型: 类型名称 作用 是否必须存在 .wxml 用于页面的布局结构,相当于网页中 .html 文件 是 .wxss 用于页面的样式,相当于网页中的 .css 文件 否 .js 用于页面的逻辑 是 .json 用于页面的配置 否 文件作用 文件名 作用 是否必须存在 ap

    2024年02月10日
    浏览(38)
  • 说说微信小程序的登录流程?

    传统的 web 开发实现登陆功能,一般的做法是输入账号密码、或者输入手机号及短信验证码进行登录 服务端校验用户信息通过之后,下发一个代表登录态的 token 给客户端,以便进行后续的交互,每当 token 过期,用户都需要重新登录 而在微信小程序中,可以通过微信官方提供的

    2024年02月20日
    浏览(32)
  • 微信小程序的登录流程——代码详解

    小程序登录流程图(具体详情可看官网链接): https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。 前端开发者需要做的任务是从小程序到开发者服务器

    2024年02月09日
    浏览(34)
  • 微信小程序三种授权登录以及授权登录流程讲解

    🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《 微信小程序开发实战 》。🎯🎯 👉点击这里,就可以查看我的主页啦!👇👇 Java方文山的个人主页 🎁如果感觉还不错的话请给我点赞吧!🎁🎁 💖期待你

    2024年02月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包