微信小程序用户登录功能探究

简介: 微信小程序用户登录功能探究

登录模块基础知识


用户登录是微信小程序必不可少的环节,一个完整的登录功能还包括用户的信息获取、登录的状态判定等。下图为未登录和已登录页面效果图。


比如下图是未登录状态



登陆后会显示详情信息



前导知识:


小程序通过微信官方提供的,获取微信提登录能力供的用户身份标识,建立用户体系。

用户登录流程时序图(下图所示):



用户登录流程需要小程序、开发者服务器和微信接口服务3个角色的参与,

下面介绍这3个角色的作用:


  • 小程序:用户使用的客户端,由于小程序运行在微信之上,因此小程序可以通过API获取微信用户的身份信息。


  • 开发者服务器:小程序的后端服务器,用于为小程序用户提供服务。


  • 微信接口服务:微信为开发者服务器提供的接口。


这三者通力合作才能完成上述图中过程


登录流程具体细节:


  1. 小程序获取code。


  1. 小程序将code发送给开发者服务器。


  1. 开发者服务器通过微信接口服务校验登录凭证。


  1. 开发者服务器自定义登录态。


另外还要用到 小程序数据缓存机制,可以参考另一篇博客:


https://yangyongli.blog.csdn.net/article/details/115388965


服务器搭建


由于这次的服务器代码比较多,我放到了另一篇博客中:登录功能服务器搭建 ←←点击查看查看


客户端搭建


在小程序启动时自动执行登录操作。


app.js


login: function() {
    wx.login({
      url: 'http://127.0.0.1:3000/login',
      method: 'post',
      data: { code: res.code },
      success: res => {
       console.log('token: ' + res.data.token)
        // 将token保存为公共数据(用于在多页面中访问)
         this.globalData.token = res.data.token
         // 将token保存到数据缓存(下次打开小程序无需重新获取token)
         wx.setStorage({ key: 'token', data: res.data.token })
       }
      success: res => {
        console.log('login code: ' + res.code)
        wx.request({ // 请求login登录接口 })
      }
    })
  },


小程序控制台打印



服务器控制台打印出login code和session的值。



token注意事项


判断数据缓存中是否存在token如果存在,取出数据缓存中的token值,不用再执行登录操作。需要注意的是,token有可能会过期,需要重新登录,这就需要从数据缓存中取出token后,先验证token是否过期,再使用token。


检查函数


进入app.js中编写checkLogin()函数,判断token是否存在。


checkLogin: function(callback) {
  var token = this.globalData.token
  if (!token) { 
    token = wx.getStorageSync('token') // 从数据缓存中获取token
    if (token) {
      this.globalData.token = token;
      wx.request({
        url: 'http://127.0.0.1:3000/checklogin',
        data: { token: token },
        success: res => {
          callback({ is_login: res.data.is_login })
        }
    })
  }
  else {   
    callback({ is_login: false })
    return
  }}
  // 如果token存在,请求服务器,判断是否有效
}


修改app.js中onLaunch()函数,用于在小程序启动后检查用户是否已经登录,如果没有登录则执行登录操作。


onLaunch: function() {
  this.checkLogin(res => {
    console.log('is_login: ', res.is_login)
    if (!res.is_login) {
      this.login()
    }
  })
}


获取用户信息


获取用户信息的两种常用方式如下:


1.使用组件来获取


特点:不需要用户授权,可以直接显示用户的头像、昵称、性别等,适合只用来展示信息的情况。


// 示例代码:
<!-- 用户头像 -->
<open-data type="userAvatarUrl"></open-data>
<!-- 用户昵称 -->
<open-data type="userNickName"></open-data>
<!-- 用户性别 -->
<open-data type="userGender" lang="zh_CN"></open-data>


2.单击按钮提示授权的方式


用法:如果“!hasUserInfo”值为true,表示没有获取到用户信息,显示“获取头像昵称”按钮;如果值为false,则将用户信息显示在页面中。


<button wx:if="{{!hasUserInfo}}" open-type="getUserInfo"
     bindgetuserinfo="getUserInfo"> 获取头像昵称 </button>


js中getUserInfo函数


data: { 
  userInfo: {}, 
  hasUserInfo: false 
},
getUserInfo: function(e) {
if (e.detail.userInfo) {
    this.setData({
      userInfo: e.detail.userInfo,
      hasUserInfo: true
    })
  }
}


判断之前是否授权


在app.js文件的onLaunch()函数中,编写如下代码,在下次启动时判断是否已经授权。


wx.getSetting({
  success: res => {
    if (res.authSetting['scope.userInfo']) {
      wx.getUserInfo({      // 表示用户已经授权,可以直接获取到用户信息
        success: res => { 
          this.globalData.userInfo = res.userInfo 
        }
    // 将res.userInfo保存到公共数据中,以便在其他页面可以调用 
    })
    }
 }
})


用法:在app.js文件的globalData中增加userInfo,编写如下代码。


globalData: {
  userInfo: null, // 增加代码
  token: null
}


调用:在其他页面通过app.globalData.userInf获取到用户信息。


案例:用户登录



wxml


<!--pages/index/index.wxml-->
<button bindtap="credit">获取用户的积分</button>
<!-- 用户头像 -->
<open-data type="userAvatarUrl"></open-data>
<!-- 用户昵称 -->
<open-data type="userNickName"></open-data>
<!-- 用户性别 -->
<open-data type="userGender" lang="zh_CN"></open-data>
<!-- 单击按钮提示授权 -->
<view class="container">
  <view class="userinfo">
    <button wx:if="{{!hasUserInfo}}" open-type="getUserInfo"
     bindgetuserinfo="getUserInfo"> 获取头像昵称 </button>
    <block wx:else>
      <!-- 用户头像 -->
      <image class="userinfo-avatar" src="{{userInfo.avatarUrl}}"
       mode="cover"></image>
      <!-- 用户昵称 -->
      <text class="userinfo-nickname">{{userInfo.nickName}}</text>
      <!-- 用户所在城市 -->
      <text class="userinfo-nickname">{{userInfo.city}}</text>
      <!-- 用户性别 -->
      <open-data type="userGender" lang="zh_CN"></open-data>
    </block>
  </view>
</view>
<!-- 开放数据加密与解密 -->
<button bindtap="sendUserInfo">将用户信息发给服务器</button>


js


const app = getApp()
Page({
  data: {
    userInfo: {},
    hasUserInfo: false
  },
  credit: function () {
    wx.request({
      url: 'http://127.0.0.1:3000/credit',
      data: { 
        token: app.globalData.token 
      },
      success: res => {
        console.log(res.data)
      }
    })
  },
  getUserInfo: function (e) {
    console.log("getUserInfo函数");
    console.log(e.detail.userInfo)
    if (e.detail.userInfo) {
      this.setData({
        userInfo: e.detail.userInfo,
        hasUserInfo: true
      })
    }
  },
  onLoad: function () {
    console.log("onLoad函数");
    if (app.globalData.userInfo) {
      this.setData({
        userInfo: app.globalData.userInfo,
        hasUserInfo: true
      })
    } else {
      app.userInfoReadyCallback = res => {
        this.setData({
          userInfo: res.userInfo,
          hasUserInfo: true
        })
      }
    }
  },
  sendUserInfo: function () {
    console.log("sendUserInfo函数");
    var token = app.globalData.token
    wx.getUserInfo({
      success: res => {
        wx.request({
          url: 'http://127.0.0.1:3000/userinfo?token=' + token,
          method: 'post',
          data: {
            rawData: res.rawData,
            signature: res.signature,
            encryptedData: res.encryptedData,
            iv: res.iv
          }
        })
      }
    })
  }
})



相关文章
|
16天前
|
移动开发 小程序 前端开发
几千怎么部署搭建校园服务平台,校园圈子论坛系统小程序搭建,校园系统源码,多种功能一体的综合性校园平台
校园圈子论坛是一款集交友、二手市场、聊天等多功能于一体的校园社交平台,支持App、小程序和H5三端交付。学生可处理闲置物品、结识新朋友,通过算法匹配兴趣相投的用户。平台提供分享邀请机制,支持自动绑定推荐关系,并设有奖励机制。开发过程中需注重数据安全与系统稳定性,确保功能兼容及性能优化。
58 5
|
16天前
|
移动开发 小程序 前端开发
使用php开发圈子系统特点,如何获取圈子系统源码,社交圈子运营以及圈子系统的功能特点,圈子系统,允许二开,免费源码,APP 小程序 H5
开发一个圈子系统(也称为社交网络或社群系统)可以是一个复杂但非常有趣的项目。以下是一些关键特点和步骤,帮助你理解如何开发、获取源码以及运营一个圈子系统。
91 3
|
19天前
|
小程序 安全 搜索推荐
陪玩小程序的搭建解析与功能需求
陪玩小程序是为玩家提供专业陪玩服务的应用,嵌入社交或游戏平台,具备智能匹配、实时聊天、预约服务等功能,支持便捷高效的游戏体验。源码交付时需提供详细文档、技术支持及定制开发服务,确保客户能顺利维护和升级。选择陪玩小程序时应关注功能需求、用户体验、安全性和成本效益,以确保最佳使用效果。
38 0
|
16天前
|
小程序 安全 网络安全
清晰易懂!陪玩系统源码搭建的核心功能,陪玩小程序、陪玩app的搭建步骤!
陪玩系统源码包含多种约单方式、实时语音互动、直播间与聊天室、大神申请与抢单、动态互动与社交及在线支付与评价等核心功能。搭建步骤包括环境准备、源码上传与解压、数据库配置、域名与SSL证书绑定、伪静态配置及后台管理。注意事项涵盖源码安全性、二次开发、合规性和技术支持。确保平台安全、合规并提供良好用户体验是关键。
|
2月前
|
小程序 数据挖掘 UED
开发1个上门家政小程序APP系统,都有哪些功能?
在快节奏的现代生活中,家政服务已成为许多家庭的必需品。针对传统家政服务存在的问题,如服务质量不稳定、价格不透明等,我们历时两年开发了一套全新的上门家政系统。该系统通过完善信用体系、提供奖励机制、优化复购体验、多渠道推广和多样化盈利模式,解决了私单、复购、推广和盈利四大痛点,全面提升了服务质量和用户体验,旨在成为家政行业的领导者。
|
3月前
|
存储 自然语言处理 小程序
微信小程序多语言切换神器:简繁体切换功能完全指南
随着全球化的发展,支持多种语言的应用程序愈发重要。本文介绍了如何在微信小程序中实现简体与繁体字体之间的切换功能,以满足不同地区用户的需求。通过创建utils文件夹并编写相应的转换函数,开发者可以方便地实现语言切换,从而提升用户体验。文章中还附带了示例代码和效果图,帮助读者更好地理解和应用这一功能。
128 0
微信小程序多语言切换神器:简繁体切换功能完全指南
|
3月前
|
小程序 Linux Python
查找首字母与Python相关的的英文词汇小程序的续篇---进一步功能完善
查找首字母与Python相关的的英文词汇小程序的续篇---进一步功能完善
33 1
|
4月前
|
算法 JavaScript 前端开发
切西瓜法实现微信抢红包功能
该文章介绍了使用“切西瓜法”和“栅栏法”两种算法来模拟微信抢红包的随机分配机制,并通过具体的JavaScript代码实现了红包金额的公平随机分配过程。
切西瓜法实现微信抢红包功能
|
4月前
|
人工智能 前端开发 JavaScript
MacTalk 测评通义灵码,实现“微信表情”小功能
墨问西东创始人池建强分享了团队使用通义灵码的经验。
|
4月前
|
小程序 API 开发工具
使用python 实现微信签到提醒功能
【9月更文挑战第4天】使用python 实现微信签到提醒功能
94 2
下一篇
开通oss服务