登录流程时序
说明:
- 前端调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
- 后端调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 和 会话密钥 session_key。
之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。
注意:
- 会话密钥
session_key
是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。 - 临时登录凭证 code 只能使用一次
前端登录授权代码:
wx.login({
success: res => {
// 发送 res.code 到后台换取 openId, sessionKey, unionId
var code = res.code
if (res.code) {
wx.getSetting({
success: res => {
if (res.authSetting['scope.userInfo']) {
// 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
wx.getUserInfo({
success: res => {
if (code && res.encryptedData && res.iv) {
console.log({ 'code': code, 'encryptedData': res.encryptedData, 'iv': res.iv })
console.log(res.encryptedData)
console.log(res.rawData)
wx.request({
url: 'http://**', // 自己后台的登录接口
method: 'POST',
data: {
'code': code,
'encryptedData': res.encryptedData,
'iv': res.iv
},
success:function(res){}
})
}
// 可以将 res 发送给后台解码出 unionId
this.globalData.userInfo = res.userInfo
// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
// 所以此处加入 callback 以防止这种情况
if (this.userInfoReadyCallback) {
this.userInfoReadyCallback(res)
}
}
})
}
}
})
}
}
})
后端需要做的就是发送请求到:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
文档说明:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html
openid是微信针对每个小程序给用户下发的个人认证