微信小程序開發用戶授權登錄


用wx.login獲取登錄憑證code

<!--pages/user/index.wxml-->
<view hidden='{{boolean}}'>
	<view wx:if="{{isLogin == 1}}">
		<!-- 個人信息 -->
		<view class='infomation'>
			<!-- 基本信息 -->
			<view class="gameTitle">
				<navigator hover-class="none" href=""><image src="{{dataList.head_photo}}"></image></navigator>
				<view>
					<view class="gameName"><navigator hover-class="none" href="">{{dataList.username}}</navigator></view>
					<view class="gameSummary" wx:if="{{dataList.title == ''}}"><navigator hover-class="none" href="">這個玩家很懶,什么也沒留下</navigator></view>
					<view class="gameSummary" wx:if="{{dataList.title != ''}}"><navigator hover-class="none" href="">{{dataList.title}}</navigator></view>
				</view>
			</view>
			
		</view>
		<!-- “我的”列表 -->
		<view class='myList'>
			<view class='list'>
			</view>
		</view> 
	</view>
	<view wx:if="{{isLogin == 2}}">
		<view class='bgBox'>
			
		</view>
		<view class="unLogin">

		</view>
	</view>
</view>

在這里插入圖片描述

wx.checkSession

  • 小程序 wx.checkSession 校驗登陸態

    • success :接口調用成功,session_key未過期;

    • fail :接口調用失敗,session_key已過期;

  1. 小程序端 wx.login 獲取code 並 wx.request 提交 code 給己方服務器
  2. 服務器 提交Appid + appSecret + code 到微信方服務器 獲取 session_key & openid
  3. 服務器 根據 session_key & openid 生成 3rd_session(微信方提出的基於安全性的考慮,建議開發者不要將openid等關鍵性信息進行數據傳輸) 並返回 3rd_session 到小程序端
  4. 小程序端 wx.setStorage 存儲 3rd_session 在后續用戶操作需要憑證時 附帶該參數
  5. 小程序端 wx.getUserInfo 獲取用戶信息 + wx.getStorage 獲取 3rd_session 數據后,一並 wx.request 提交給己方服務器
  6. 服務器 SQL 用戶數據信息更新
//用戶登陸
function userLogin() {
  wx.checkSession({
    success: function () {
      //存在登陸態
    },
    fail: function () {
      //不存在登陸態
      onLogin()
    }
  })
}
 
function onLogin() {
  wx.login({
    success: function (res) {
      if (res.code) {
        //發起網絡請求
        wx.request({
          url: 'Our Server ApiUrl',
          data: {
            code: res.code
          },
          success: function (res) {
            const self = this
            if (邏輯成功) {
              //獲取到用戶憑證 存儲 3rd_session 
              var json = JSON.parse(res.data.Data)
              wx.setStorage({
                key: "third_Session", 
                data: json.third_Session
              })
              getUserInfo()
            }
            else {
 
            }
          },
          fail: function (res) {
 
          }
        })
      }
    },
    fail: function (res) {
  
    }
  })
 
}
 
function getUserInfo() {
  wx.getUserInfo({
    success: function (res) {
      var userInfo = res.userInfo
      userInfoSetInSQL(userInfo)
    },
    fail: function () {
      userAccess()
    }
  })
}
 
function userInfoSetInSQL(userInfo) {
  wx.getStorage({
    key: 'third_Session',
    success: function (res) {
      wx.request({
        url: 'Our Server ApiUrl',
        data: {
          third_Session: res.data,
          nickName: userInfo.nickName,
          avatarUrl: userInfo.avatarUrl,
          gender: userInfo.gender,
          province: userInfo.province,
          city: userInfo.city,
          country: userInfo.country
        },
        success: function (res) {
          if (邏輯成功) {
            //SQL更新用戶數據成功
          }
          else {
            //SQL更新用戶數據失敗
          }
        }
      })
    }
  })
}

第三方服務器和微信服務器:
注意:session_key是微信服務器生成的針對用戶數據進行加密簽名的密鑰,不應該進行傳輸到客戶端.

生成3rd_session
用於第三方服務器和小程序之間做登錄態校驗.為了保證安全性,3rd_session應該長度夠長,一定有效時間, session_key + openid, key, 為 value, 寫入到session存儲.

3rd_session寫入storage:
后續用戶進入小程序,先從storage讀取3rd_session
根據請求,在session存儲中查找合法的session_key和openid

App({
  onLaunch: function() {
    wx.login({
      success: function(res) {
        var code = res.code;
        if (code) {
          console.log('獲取用戶登錄憑證:' + code);
        } else {
          console.log('獲取用戶登錄態失敗:' + res.errMsg);
        }
      }
    });
  }
})

唯一標識(openid)和會話密鑰(session_key)

在這里插入圖片描述

wx.checkSession

檢測當前用戶登錄態是否有效

wx.checkSession({
  success: function(){
    //session 未過期,並且在本生命周期一直有效
  },
  fail: function(){
    //登錄態過期
    wx.login() //重新登錄
    ....
  }
})

服務端處理邏輯

wx.checkSession({
    success:function(res){
      //session_key未過期
    },
    fail:(res=>{
      // session_key已過期
      // 進行登錄操作
      wx.login({
        success: function(res) {
          const url = '接口地址'   //本次項目中是從后台獲取session_key的接口,可能流程不同,會有相應的變化
          const data = {
            //你要傳的數據
          }
          wepy.request({
            url: url,
            method: 'POST',
            data: data,
          }).then(res=>{
            if(res.data.code == 0){
              //拿到的openid和session_key存到緩存中

              //調用換取用戶id接口[需求不同,可能接口會有相應的變化]
              const url = '獲取用戶id的接口'
              const data = {'要傳的數據'}
              wepy.request({
                url: url,
                method: 'POST',
                data: data,
              }).then((res)=>{
                //該接口設計返回的參數包括換取的用戶ID和返回的用戶的微信中信息,也就是通過button獲取的那個userInfo[我們為了后續的處理,所以后台這塊返回用戶信息,如果用戶還未登錄,用戶信息,返回是空,反之則有值]
                //存儲用戶ID
                wx.setStorage({
                  key:'userId',
                  data:'獲取到的用戶ID'
                })
                //存儲用戶信息[userInfo]
                wx.setStorage({
                  key:'userInfo',
                  data:'獲取到的用戶信息'
                })
              })
            }
          })
        }
      });
    })
  })
onShow(){
    //從緩存中獲取session_key
    let skey = wx.getStorageSync('session_key');
    if (!skey) {
      //如果session_key不存在,再次執行登錄
      wx.login({
        //該處登錄同app.wpy[流程一樣]
      });
    }else{
      // session_key存在
    }
  }
  //我們假設這個頁面需要獲取用戶的信息,首先給一個button[open-type設置為getUserInfo],使用這個拿到用戶的信息,
  getUserInfo(e){
      this.userInfo = e.detail.userInfo;  //e.detail.userInfo攜帶的就是用戶的個人信息[包括頭像、昵稱等]
      if(e.detail.userInfo){
        wx.showToast({
          title: '授權成功',
          icon: 'success',
          duration: 1500
        })
        //這里做這樣的處理,是因為需求需要點擊購物車按鈕跳轉訂單待支付頁,在沒有獲取到用戶信息之前,跳轉購物車的按鈕隱藏,獲取用戶信息按鈕顯示,反之則返
        this.button = 'none';   //獲取用戶信息button
        this.myMenu = 'block';  //跳轉待支付訂單頁
        //更新緩存中的用戶信息
        wx.setStorage({
          key:'userInfo',
          data:this.userInfo
        })
      }else if(e.detail.errMsg == 'getUserInfo:fail auth deny'){
        wx.showModal({
          title: '提示',
          content: '若不授權微信登錄,則無法使用小程序。點擊"授權"按鈕並允許使用"用戶信息"方可正常使用。',
          showCancel:false,
          confirmText:'授權',
          success:(res=>{
            wx.openSetting({
              success: (res) => {
              }
            })
          })
        })
      }
    }

在這里插入圖片描述

在這里插入圖片描述

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

在這里插入圖片描述

在這里插入圖片描述

對稱解密的目標密文為 Base64_Decode(encryptedData)。
對稱解密算法初始向量 為Base64_Decode(iv),其中iv由數據接口返回。

signature = sha1( rawData + session_key )

//最終供外面調用的方法
function login(){
    console.log('logining..........');
    //調用登錄接口
    wx.login({
        success: function (e) {
            console.log('wxlogin successd........');
            var code = e.code;
            wx.getUserInfo({
                success: function (res) {
                    console.log('wxgetUserInfo successd........');
                    var encryptedData = encodeURIComponent(res.encryptedData);
                    thirdLogin(code,encryptedData,res.iv);//調用服務器api
                }
            })
        }
    });
}

function  thirdLogin(code,encryptedData,iv){
    var url = "eeee/xxx/login/ttttt";
    var params = new Object();
    params.code = code;
    params.encryptedData = encryptedData;
    params.iv =iv;

    buildRequest(new Object(),url,params,{
        onPre: function(page){},
        onSuccess:function (data){
            console.log('my  login successd........');
            console.log(data);
            getApp().globalData.session_id = data.session_id;
            getApp().globalData.uid = data.uid;
            getApp().globalData.isLogin = true;
        },
        onError : function(msgCanShow,code,hiddenMsg){
        }
    }).send();
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM