微信小程序用户的授权分为几种方式,一种是对不同scope的授权,比如userInfo,需要用户手动点击允许才能获取,另一种是通过wx.login静默方式获取code,在与后台服务器交互,访问微信的api来得到会话sessionkey,我这里是两者进行结合,用户授权信息可以获取到微信用户的基本信息,但是用户的openid是存放于userinfo的encryptedData加密数据对象中,还是需要进行后台请求sessionkey进行解密,所以后台请求交互直接通过微信api的code2Session进行一次Get请求获取到openid,下面来进行具体步骤的讲解
1.判断用户是否对个人信息授权,通过wx.getSetting函数调用,查看scope域中是否包含userinfo
wx.getSetting({
success(res) {
if (res.authSetting['scope.userInfo']) {
}
}
})
如果用户没有授权,这时候我们就需要引导用户进行授权,但是微信小程序2018.4.1更新说明,不再提供可以直接弹出用户信息授权的窗口,必须要通过<button open-type="getUserInfo"/>按钮的方式,让用户进行交互操作,所以我们需要在用户未授权时,弹出一个全窗口的模态窗口,让用户进行点击,类似于一个欢迎使用的界面,点击开始使用按钮则弹出用户授权,只有授权后才能显示主页面,需要注意的是,在欢迎使用页面需要通过wx.hideTabBar({})函数将tabbar隐藏,防止用户可以操作其他界面
2.用户同意授权后,调用wx.login方法,获取登陆code,与后台交互,初始化管理平台用户到数据库与微信用户的openid进行绑定,然后回写到本地缓存数据中,这里我封装了一个方法大家可以参考一下
var network = require('network.js');
function initWXAccount(url,page){
wx.getSetting({
success(res) {
if (res.authSetting['scope.userInfo']) {
wx.getUserInfo({
success(res) {
const userInfo = res.userInfo
wx.login({
success(res) {
if (res.code) {
userInfo["code"] = res.code;
//请求后端初始化后台系统的微信账号
network.postRequestLoading(url, userInfo, function success(res) {
if (res.isSuccess) {
var openid = res.result;
//存入本地缓存
wx.setStorage({
key: 'openid',
data: openid
})
console.log("初始化openid到lcoalstorage成功")
//写入全局变量
page.globalData.openid = openid
console.log("初始化openid到globalData成功")
wx.showTabBar({
})
}
}, function fail(res) {
console.log(res)
})
} else {
console.log('登录失败!' + res.errMsg)
}
}
})
}
})
}
}
})
}
module.exports = {
initWXAccount: initWXAccount
}
这里需要注意以下,如果用户拒绝授权,我可已通过按钮绑定事件中的e.detail.rawData来判断,授权失败,则该对象为undefined
3.需要注意的是,本地缓存可能会被人为清除或者缓存存储量达到上限被自动清楚,所以我们需要在小程序启动时,进行判断,如果缓存不存在且用户已经授权,就需要与后台再次交互,获取到openid写入到本地
onLaunch: function() {
//查找用户的本地openid
var app = this;
var wxuseriniturl = app.globalData.rooturl + "/wx//user/initAccount";
wx.getStorage({
key: 'openid',
success(res) {
//写入global
var openid = res.data
app.globalData.openid = openid;
console.log("读取到本地openid:" + openid);
},
fail(res) {
//未找到openid,有两种情况
//1.用户未授权,不用管,用户授权后会自动初始化
//2.用户授权额,但是微信本地缓存被清了,需要重新请求写入
wx.getSetting({
success(res) {
if (res.authSetting['scope.userInfo']) {
console.log("未读取到本地openid,用户已授权,进行重新初始化到本地");
wxauth.initWXAccount(wxuseriniturl, app);
}
}
})
}
})
}