如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。所以我们有时候需要获取这个UnionID
登录流程
![b60eee1da919828429337ff0b05542a8.png](https://i-blog.csdnimg.cn/blog_migrate/7cde9d3ccbd45d87cfa1b8024fcc2a3d.jpeg)
流程解析
1. 客户端获得code,并将code传给第三方服务端(后台)
微信小程序端调用wx.login,获取登录凭证(code),并调用接口,将code发送到第三方客户端
2. 第三方服务端用code换session_key和openid
小程序端将code传给第三方服务器端,第三方服务器端调用接口,用code换取session_key和 openid (后台服务器带着前端发送的code去访问微信后台的接口)
3. 第三方服务端生成新的session_key和 openid
第三方服务器端拿到请求回来的session_key和openid,发送到客户端
4. 正常请求
小程序每次请求都将openid 放在请求头里,第三方服务端解析判断合法性,并进行正常的逻辑处理
小程序 wx.checkSession 校验登陆态
- success :接口调用成功,session_key未过期;
- fail :接口调用失败,session_key已过期;
代码演示
代码分两种演示:第一种自己启动了本地的后台 访问微信公共平台 另外一个会给大家提供一个模拟演示的接口 获取session_key openid
登录页.wxml
可以只是一个简单的按钮 点击 button去登录
登录页.js
这样就登录完成了。
再次进入页面 自动登录
如果没有后台转换的接口 又想要模拟登录 后台返回的openid和session_key 代码如下:
bindGetUserInfo: function (e) {
if (e.detail.userInfo) {
var that = this;
//点击按钮就是授权了 可以获取用户头像 昵称
console.log(e.detail.userInfo);
wx.login({
success: res => {
// 获取到用户的 code 之后:res.code
console.log("用户的code:" + res.code)
// 可以传给后台,再经过解析获取用户的 openid
// 或者可以直接使用微信的提供的接口直接获取 openid ,方法如下:
wx.request({
url: 'https://api.weixin.qq.com/sns/jscode2session', //接口地址
data: {
appid: '注册的appid',
secret: '生成的sercret',
js_code: res.code,
grant_type: 'authorization_code'
},
header: {
'content-type': 'application/json' //默认值
},
success: function (res) {
console.log(res.data)
OPEN_ID = res.data.openid;//获取到的openid
SESSION_KEY = res.data.session_key;//获取到session_key
//获取数据后 把登录的信息 存储在本地 存储--再次进入判断是否有存储 有直接请求login 没有引导授权
//如果返回成功,则将OPEN_ID和SESSION_KEY提交请求给服务器
wx.request({
url: 'xxxx/login.jsp',
data: {
open_id: OPEN_ID,
session_key: SESSION_KEY,
gender: GENDER
},
header: {
'content-type': 'application/json' //默认值
},
method: 'GET'
})
}
});
}
});
that.setData({
isHide: false,
});
} else {
//用户按了拒绝按钮
wx.showModal({
title: '警告',
content: '您点击了拒绝授权,将无法进入小程序,请授权之后再进入!!!',
showCancel: false,
confirmText: '返回授权',
success: function (res) {
// 用户没有授权成功,不需要改变 isHide 的值
if (res.confirm) {
console.log('用户点击了“返回授权”');
}
}
});
}
}