一、为什么需要openid
在微信小程序的开发过程中,往往需要将用户信息录入自己的数据库中,就得有一个唯一标记区分用户,这个标记就是openid。当一个用户使用了某个微信小程序,微信后台会产生一个openid,并且是唯一的,所以可以通过这个来区分用户。
另一方面,我们通过微信小程序API并不能获取到更多用户私密信息,只能获取到昵称,性别,居住地等公开的信息,微信号这种私密信息是获取到的,而通过这些昵称或者居住地,是没办法保证用户表里的用户数据是唯一的。所以综合而言,如果不需要建立自己的用户数据库,就没必要使用openid;如果需要,就得获取openid。
顺便说一下,还有一个unionid的东西存在。现在同一家开发公司甲,既有微信小程序A,又有微信公众号B,都是用同一个开发平台账号开发的。同时微信小程序A有个用户的openid是X,微信公众号B有个用户的openid是Y,那么我们怎么判断这两个用户是不是同一个人呢?所以引入了unionid的概念。同一用户,对同一个微信开放平台下的不同应用,unionid是相同的 。什么意思呢?假如用户乙关注了这两个程序,那么乙在小程序A的应用中opendi是X,unionid是Z;同时乙在公众号B应用中的openid是Y,unionid是Z。
二、如何获取openid
获取openid主要是两个步骤:
1、wx.login()得到code
2、通过code以及appid,secret 得到openid
wx.login({
success: res => {
console.log(res.code); // 先login得到code
if (res.code) {
// 将url中的appid和secret换成自己的 (可以在开发平台查看)
var url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' + appid + '&secret=' + secret + '&js_code=' + res.code + '&grant_type=authorization_code';
wx.request({
url: url,
method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
success: function (res) {
// res.data.openid 即为所求openid
console.log(res.data.openid);
}
});
}
}
});
三、获取用户信息
既然要获取openid,那肯定就是要将用户录入数据库,那肯定也要获取用户信息。目前能通过wx.getUserInfo获取到的用户信息是例如昵称、性别这一类的公开信息。
1、用户授权
获取用户信息需要用户授权,那怎么授权呢?以前可以一进入页面就弹出授权框,现在不提倡了,文档建议使用button,设置open-type来授权。如下代码,点击button,如果没有授权会弹出授权框,如果拒绝了,那个e.detail.userInfo就是false,会执行else里代码块,如果接受,则执行if为true的操作;如果之前就已经有授权了,就不会弹出授权框,直接执行if为true的操作。
在开发时候,可以在开发者工具上方,点击“清缓存”按钮,这样就可以清除以前的授权信息,得重新授权。
.wxml
<button open-type='getUserInfo' bindgetuserinfo='checkPermission' id='bn_login'>使用微信登录</button>
.js
checkPermission:function(e){
if(e.detail.userInfo){
// 有授权的操作
}else{
// 没有授权的操作
}
}
2、获取用户信息
获取用户信息比较简单,调用wx.getUserInfo即可,这一块应该没什么好说的。
// 查看是否授权
wx.getSetting({
success(res) {
if (res.authSetting['scope.userInfo']) {
// 已经授权,可以直接调用 getUserInfo 获取头像昵称
wx.getUserInfo({
success(res) {
console.log(res.userInfo)
}
})
}
}
})