前言
流程图概览

> 最近在做的一个使用美团团队开发的mpvue框架来做一个小程序商城,如今来分享一下小程序的授权登录流程。
> 小程序广泛使用的登录校验方式是获取用户在该小程序的openid,这是独一无二的一个标识符,不再像是浏览
器登录那样子直接使用用户名、密码来向服务器换取token来标识登录状态。
-
第一步
我们需要对用户进行权限校验,判断用户是否已经对小程序进行过权限设置,我们来看一下小程官方文档中对wx.getSetting()的定义,他接受一个Object参数,有三个回调函数,我们通常只用到success和fail参数

/* 封装了以后,接收三个参数,第一个传进来的auth,
* 在success回调函数中判断用户是否对"scope.userInfo": true 进行了授权,
* 已经授权则进行onSuccess回调,反之则onFail
*/
export function getSetting(auth, onSuccess, onFail) {
wx.getSetting({
success (res) {
console.log(res)
if (res.authSetting[`scope.${auth}`]) {
onSuccess(res)
} else {
onFail(res)
}
},
fail (res) {
console.log(res) // 直接抛出异常
}
})
}
调用wx.getSetting()校验权限,然我们来看下返回的数据吧,不出意料的authSetting返回了空

-
第二步
假设我们是第一次登录,首先进行了wx.getSetting()校验授权,不出意外的肯定是会返回一个onFail回调,这时候我们就需要弹授权面板,来让用户进行手都授权
这时候就需要用到小程序提供的open-type这一开放能力了
(注意:open-type需要挂载在button中) 让我们来看一下如何调用吧
// 这时候需要设置open-type="getUserInfo",并且监听getuserinfo
<button
open-type="getUserInfo"
@getuserinfo="getUserInfo"
class="auth-btn"
>
授权登陆
</button>
获得用户权限后我们再来看下wx.getSetting()返回的数据吧,authSetting下的scoped.userInfo 变为了true

-
第三步
让我们来看一下wx.getUserInfo()获取用户信息,也是拥有success、fail回调函数。该函数调用成功后顾名思义会返回用户的信息,包括头像、名称等

// 这是简单封装了的getUserInfo,在success回调函数中添加了两个函数
export function getUserInfo(onSuccess, onFail) {
wx.getUserInfo({
success(res) {
console.log(res)
let {userInfo} = res
if (userInfo) {
onSuccess(userInfo)
} else {
onFail(res)
}
},
fail(res) {
console.log(res) // 直接抛出异常
}
})
}
再来看看如何在页面中调用吧
getUserInfo () {
getUserInfo(
// 拿到了userinfo后,调用小程序提供的setStorageSync把数据存储在本地
(userInfo) => {
wx.setStorageSync('userInfo', userInfo)
// 判断是否已经获取过openId
const openId = wx.getStorageSync('openId')
if (!openId || openId.length === 0) {
console.log('请求openId')
getOpenId()
} else {
console.log('获得openId')
}
},
() => {
console.log('failed...') // 获取用户信息,抛出异常
}
)
},
-
第四步
如果在storage中找不到openId,则会进行调用wx.login()方法
调用接口获取登录凭证(code)。通过凭证进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session_key)等。用户数据的加解密通讯需要依赖会话密钥完成。更多使用方法详见
export function getOpenId () { wx.login({ success(res) { console.log(res) if (res.code) { var code = res.code; //返回code console.log(code); // 小程序的appId var appId = '...'; // 小程序的secretId,可在开发者中心中查看 var secret = '...'; wx.request({ url: 'https://api.weixin.qq.com/sns/jscode2session?appid=' + appId + '&secret=' + secret + '&js_code=' + code + '&grant_type=authorization_code', data: {}, header: { 'content-type': 'json' }, success: function (res) { var openid = res.data.openid //返回openid console.log('openid为' + openid); } }) } else { console.log(res) // 直接抛出异常 } }, fail(res) { console.log(res) // 直接抛出异常 } }) }
感谢各位能看到这里,讲得不好请多多谅解~