一、登录态维护
官方的文档地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html#wxloginobject
通过 wx.login() 获取到用户登录态之后,需要维护登录态。开发者要注意不应该直接把 session_key、openid 等字段作为用户的标识或者 session 的标识,而应该自己派发一个 session 登录态(请参考登录时序图)。对于开发者自己生成的 session,应该保证其安全性且不应该设置较长的过期时间。session 派发到小程序客户端之后,可将其存储在 storage ,用于后续通信使用。
登录时序图
从上图可以看出。当我们通过wx.login()获取code的后,发送给我们的服务器,然后去请求微信服务器换取得到对应的openid与session_key,openid是该用户在小程序中的唯一标识用于模板通知之类的。session_key就是用来解密用户的敏感信息。unionid之类的。unionid是微信用户在所有微信平台下的唯一标识。下面我会讲解一下如何得到
以上就是我的实现方法。调用wx.login()得到code后请求服务器获取openid与session_key缓存在服务器当中。其中生成一个随机数为key,value为openid与session_key。然后返回到小程序通过wx.setStorageSync(‘LoginSessionKey’,得到的随机数key)缓存在小程序当中。每当我们去请求服务器时带上LoginSessionKey即可给服务器读取从而判断用户是否在登录。是不是很简单呢?
二、用户数据的加解密
通过wx.login()登录之后。我们可以通过wx.getUserInfo()获取用户信息。其中一些不敏感的信息在返回的 result中的userInfo里。如想要获取敏感信息。openid,unionid之类的。则需要从密文中去解密得到。
而密文则在encryptedData这个字段当中。我们去请求我们服务器去解密然后得到敏感信息后则可以保存起来。
加密数据解密算法
接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和unionId ),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据( encryptedData )进行对称解密。 解密算法如下:
- 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
- 对称解密的目标密文为 Base64_Decode(encryptedData),
- 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节
- 对称解密算法初始向量 iv 会在数据接口中返回。
转载于 https://blog.csdn.net/yelin042/article/details/71773636/
瞎写的
getUserInfo: function (e) {
wx.getSetting({
success(res) {
let that = this;
wx.login({
success(res) {
console.log(res);
if (res.code) {
wx.request({
// url: 'https://xcx.yaojiesong.com/SK_B2BAPI/JieKou/User/CX_UserLogin.ashx',
url: 'http://47.105.206.10:8074/JieKou/User/CX_UserLogin.ashx',
data: {
code: res.code,
},
success(request) {
console.log('授权aaaa', request);
console.log('授权aaaa', request.data.Message);
if (request.data.Message === '授权成功') {
// resolve(request.data)
if (request.data.Source.unionid == null) {
console.log('授权我错了');
wx.setStorageSync('unionid', '');
} else {
wx.setStorageSync('unionid', request.data.Source.unionid);
}
wx.setStorageSync('openid', request.data.Source.openid);
wx.setStorageSync('session_key', request.data.Source.session_key);
console.log('unionid', wx.getStorageSync('unionid'));
console.log('session_key', wx.getStorageSync('session_key'));
console.log('openid', wx.getStorageSync('openid'));
wx.getUserInfo({//getUserInfo流程
success: function (res2) {//获取userinfo成功
console.log('wx.getUserInfo', res2);
console.log('avatarurl', res2.userInfo.avatarUrl);
console.log('nickName', res2.userInfo.nickName);
// var encryptedData = encodeURIComponent(res2.encryptedData);//一定要把加密串转成URI编码
var encryptedData = res2.encryptedData;//一定要把加密串转成URI编码
var iv = res2.iv;
console.log('aaaaaaaaaaaa',iv, wx.getStorageSync('unionid'), wx.getStorageSync('openid'), res2.userInfo.nickName, res2.userInfo.avatarUrl, wx.getStorageSync('session_key'));
wx.request({
// url: 'https://xcx.yaojiesong.com/SK_B2BAPI/JieKou/User/CX_UserAdd.ashx',
url: 'http://47.105.206.10:8074/JieKou/User/CX_UserAdd.ashx',
data: {
iv: iv,
encryptedData: encryptedData,
unionid: wx.getStorageSync('unionid'),
opendid: wx.getStorageSync('openid'),
nickname: res2.userInfo.nickName,
imgurl: res2.userInfo.avatarUrl,
session_key: wx.getStorageSync('session_key')
},
success(request) {
console.log('授权aaaab', request);
wx.setStorageSync('Birthday', request.data.Source[0].Birthday);
wx.setStorageSync('CX_OpendId', request.data.Source[0].CX_OpendId);
wx.setStorageSync('CardNumber', request.data.Source[0].CardNumber);
wx.setStorageSync('ImgUrl', request.data.Source[0].ImgUrl);
wx.setStorageSync('Integral', request.data.Source[0].Integral);
wx.setStorageSync('Name', request.data.Source[0].Name);
wx.setStorageSync('Phone', request.data.Source[0].Phone);
wx.setStorageSync('Sex', request.data.Source[0].Sex);
wx.setStorageSync('userid', request.data.Source[0].UserId);
app.globalData.userid = request.data.Source[0].UserId
wx.setStorageSync('WeixinName', request.data.Source[0].WeixinName);
that.setData({
showbologinshouquan: true,
showlogin: true
})
}
})
}
})
} else {
// reject(request.data)
wx.showToast({
title: request.data.Message,
icon: 'none',
duration: 1000
})
}
},
})
console.log(res.code, 'code')
//发起网络请求
console.log('登陆成功' + res)
} else {
wx.showToast({
title: '登录失败!',
icon: 'none',
duration: 1000
})
}
}
});
}
})
},