微信小程序 获取用户信息并保存登录状态

一、登录态维护

官方的文档地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html#wxloginobject

通过 wx.login() 获取到用户登录态之后,需要维护登录态。开发者要注意不应该直接把 session_key、openid 等字段作为用户的标识或者 session 的标识,而应该自己派发一个 session 登录态(请参考登录时序图)。对于开发者自己生成的 session,应该保证其安全性且不应该设置较长的过期时间。session 派发到小程序客户端之后,可将其存储在 storage ,用于后续通信使用。

登录时序图

微信小程序 获取用户信息并保存登录状态_第1张图片
从上图可以看出。当我们通过wx.login()获取code的后,发送给我们的服务器,然后去请求微信服务器换取得到对应的openid与session_key,openid是该用户在小程序中的唯一标识用于模板通知之类的。session_key就是用来解密用户的敏感信息。unionid之类的。unionid是微信用户在所有微信平台下的唯一标识。下面我会讲解一下如何得到

微信小程序 获取用户信息并保存登录状态_第2张图片

以上就是我的实现方法。调用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 )进行对称解密。 解密算法如下:

  1. 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
  2. 对称解密的目标密文为 Base64_Decode(encryptedData),
  3. 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节
  4. 对称解密算法初始向量 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
                })
              }
            }
          });
      }
     })
  },

你可能感兴趣的:(微信小程序 获取用户信息并保存登录状态)