小程序中的授权登录,实际上是分为两部分:
- 授权获取用户信息;
- 小程序登录;
一、授权获取用户信息
小程序中提供了一个wx.getUserProfile()方法来弹出授权窗口,获取用户信息。Page({getUserProfile() {wx.getUserProfile({desc: '用于完善个人资料',success: (res) => {console.log(res.userInfo)},fail: (err) => {}})},})
二、小程序登录
小程序登录,实际上是需要从微信的服务器中获取到每一个用户的 openid。1、获取 code
小程序中提供了wx.login()方法用来获取 code:Page({getCode() {wx.login({success: (res) => {console.log(res.code)}})}})
2、获取 token
需要将 code 发送给后端,用来获取 token:
请求参数说明:Page({getToken() {wx.request({url: 'http://47.98.128.191:3001/users/wxLogin',method: 'POST',data: {code,appId: 'wxded7871137340bad',appSecret: '5e86d485eac69fe0e237331a6d2892e1',userInfo: this.data.userInfo},success: ({ data }) => {console.log(data);}})}})
- code:是必须的;
- appId 和 appSecret:实际开发中,不需要传递,这里练习时我们传递自己的 appId 和 appSecret;
- userInfo:是当前项目的服务器中需要该数据
3、保存 token
token获取成功后,我们可以使用小程序中提供了“数据缓存”方法,将 token 保存到本地存储:Page({getToken() {wx.request({// ...success: ({ data }) => {if(data.code) {wx.setStorage({key: 'token',data: data.token})}}})}})
三、渲染用户信息
渲染用户信息要分为两种情况:
- 用户之前没有登录,在授权登录成功后渲染用户信息;
- 用户之前已经登录过,直接渲染用户信息;
1、授权登录后渲染
前面我们在授权获取用户信息,就已经将获取成功的用户信息保存到了页面的 data 中,所以可以直接通过 data 中的 userInfo 进行判断渲染。
页面参考代码如下:
同时,考虑到除了当前页面外,我们在其他页面也有可能要使用用户信息,我们还可以在获取到用户信息后,将其保存成全局变量。<view class="userInfo"><block wx:if="{{userInfo}}"><image class="avatar" src="{{userInfo.avatarUrl}}"></image><text>{{userInfo.nickName}}</text></block><block wx:else><image class="avatar" src="/assets/default.jpeg"></image><text bindtap="getUserProfile">未登录</text></block></view>
我们对之前的getUserProfile方法再稍作修改:Page({getUserProfile() {wx.getUserProfile({desc: '用于完善个人资料',success: (res) => {this.setData({userInfo: res.userInfo})// 全局保存用户信息getApp().globalData.userInfo = res.userInfo;this.getCode();},fail: (err) => {console.log(err);}})},})
2、用户已经登录过
如果用户之前已经授权登录过当前小程序,那么再次进入小程序时,不需要再重新登录,应该直接渲染用户信息。
所以,我们会在 app.js 中判断本地是否有 token,如果有 token,就发送请求到后端获取数据库中之前保存的用户信息:
用户信息保存到全局后,当用户再进入其他需要渲染用户信息的页面,我们就可以在App({onLaunch() {this.getUserInfo();},getUserInfo() {// 判断本地是否有 tokenconst token = wx.getStorageSync('token');if (token) {wx.request({url: 'http://47.98.128.191:3001/users/getUserInfo',header: {Authorization: token},success: ({data}) => {if(data.code) {// 将用户信息保存到全局this.globalData.userInfo = data.userInfo;}}})}}})
onLoad生命周期中获取全局数据,并保存到页面自己的 data 中。
例如我们进入个人中心页面时:
注意:要查看效果,需要将小程序回到“普通编译”模式中,用户刷新时先进入首页,再切换到其他页面。Page({onLoad(options) {this.setData({userInfo: getApp().globalData.userInfo})}})
