微信小程序如何获取用户信息及登录凭证

在小程序内,开发者可以通过 wx.login 接口直接获取用户的 openId 与 unionId 信息,实现微信身份登录,支持开发者在多个小程序或其它应用间匿名关联同一用户。

同时,为了满足部分小程序业务中需要创建用户的昵称与头像的诉求,平台提供了 wx.getUserProfile 接口,支持在用户授权的前提下,快速使用自己的微信昵称头像。

获取用户信息:wx.getUserProfile,页面产生点击事件(例如 button 上 bindtap 的回调中)后才可调用,每次请求都会弹出授权窗口,用户同意后返回用户的信息。

官方示例代码:https://developers.weixin.qq.com/s/tsJaq2mP7Mp4

前端:

{{userInfo.nickName}}

后端:

Page({

data: {

userInfo: {},

hasUserInfo: false,

canIUseGetUserProfile: false,

},

onLoad() {

if (wx.getUserProfile) {

this.setData({

canIUseGetUserProfile: true

})

}

},

getUserProfile(e) {

// 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认

// 开发者妥善保管用户快速填写的头像昵称,避免重复弹窗

wx.getUserProfile({

desc: '用于完善会员资料', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写

success: (res) => {

this.setData({

userInfo: res.userInfo,

hasUserInfo: true

})

}

})

},

getUserInfo(e) {

// 不推荐使用getUserInfo获取用户信息,预计自2021年4月13日起,getUserInfo将不再弹出弹窗,并直接返回匿名的用户个人信息

this.setData({

userInfo: e.detail.userInfo,

hasUserInfo: true

})

},

})

按官方示例验证后发现,这个 userInfo 中包含了用户的头像信息,但是是一个默认的灰色头像,用户昵称也获取不到。再查资料发现原来是它的规则改了。

按照新规则,更改代码,示例链接:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/userProfile.html

const defaultAvatarUrl = 'https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0'

Page({

data: {

avatarUrl: defaultAvatarUrl,

},

onChooseAvatar(e) {

const { avatarUrl } = e.detail

this.setData({

avatarUrl,

})

}

})

效果图:

用户登录:wx.login,调用接口获取登录凭证(code)。通过凭证进而换取用户登录态信息,包括用户在当前小程序的唯一标识(openid)、微信开放平台账号下的唯一标识(unionid,若当前小程序已绑定到微信开放平台账号)及本次登录的会话密钥(session_key)等。用户数据的加解密通讯需要依赖会话密钥完成。

wx.login({

success (res) {

if (res.code) {

//发起网络请求

wx.request({

url: 'https://example.com/onLogin',//你的后端URL

data: {

code: res.code

}

})

} else {

console.log('登录失败!' + res.errMsg)

}

}

})

说了这么多,实际上看示例就知道前端只返回一个code用户登录凭证,有效期5分钟,剩下的要在服务端处理获取session_key等。session_key 具有唯一性,在使用小程序时,同一用户在同一时刻仅有一个有效的 session_key。用户越久未使用小程序,用户登录态越有可能过期。反之如果用户一直在使用小程序,则用户登录态一直保持有效。

调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。

调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 、 用户在微信开放平台账号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台账号) 和 会话密钥 session_key。

对于初学者容易混淆,其实这里面有2个概念,一个是wx.login(),另一个是session_key。混淆点在于登录态失效过期和session_key失效过期需要重新获得session_key,这2个东西是什么关系?

调用wx.login()时,微信服务器会返回一个code,这时你是处于登录的状态,开发者拿着code,再发送请求到微信服务器去换取新的session_key;

因为session_key会过期,所以提供了wx.checkSession方法来验证session_key是否过期,那么sesssion_key过期怎么办,重新调用wx.login()方法获得新的code,因为拿到code才能去微信服务器获得新的session_key。用验证session_key是否过期的方法来表示登录是否过期,然而,只要session_key不过期,无需重新调用wx.login()。

wx.checkSession({

success () {

//session_key 未过期,并且在本生命周期一直有效

},

fail () {

// session_key 已经失效,需要重新执行登录流程

wx.login() //重新登录

}

})

如何获取用户信息和如何获取用户登录凭证就讲到这,觉得有用的小伙伴可以点赞收藏!

随便看看