微信小程序登錄流程及解析用戶openid session_key,獲取用戶信息


為優化用戶體驗,使用 wx.getUserInfo 接口直接彈出授權框的開發方式將逐步不再支持。從2018年4月30日開始,小程序與小游戲的體驗版、開發版調用 wx.getUserInfo 接口,將無法彈出授權詢問框,默認調用失敗。正式版暫不受影響。開發者可使用以下方式獲取或展示用戶信息:

UnionID 機制說明

如果開發者擁有多個移動應用、網站應用、和公眾帳號(包括小程序),可通過 UnionID 來區分用戶的唯一性,因為只要是同一個微信開放平台帳號下的移動應用、網站應用和公眾帳號(包括小程序),用戶的 UnionID 是唯一的。換句話說,同一用戶,對同一個微信開放平台下的不同應用,unionid是相同的。所以我們有時候需要獲取這個UnionID

 

這個圖簡單的可以看做三部分

1.微信小程序客戶端

2.微信官方服務器

3.第三方服務器(這個可以看做是自己的)

具體步驟如下;

1. 客戶端獲得code,並將code傳給第三方服務端

微信小程序端調用wx.login,獲取登錄憑證(code),並調用接口,將code發送到第三方客戶端

2. 第三方服務端用code換session_key和openid

小程序端將code傳給第三方服務器端,第三方服務器端調用接口,用code換取session_key和openid

3. 第三方服務端生成新的session(3rd_session)

第三方服務器端拿到請求回來的session_key和openid,先留着,不能給客戶端;然后用操作系統提供的真正隨機數算法生成一個新的session,叫3rd_session

4. 第三方服務端建立對應關系,並存儲

將3rd_session作為key,微信服務端返回的session_key和openid作為值,保存起來

5. 第三方服務端將3rd_session發送到客戶端

客戶端只拿到3rd_session就夠了,大人說話小孩別插嘴,小程序不需要知道session_key和openid

6. 正常請求

小程序每次請求都將3rd_session放在請求頭里,第三方服務端解析判斷合法性,並進行正常的邏輯處理

好了,廢話不多說了,直接上代碼:

1 <!--index.wxml-->
2 <view class='content'>
3   <button open-type='getUserInfo' type='primary' size='default' bindtap="getUserInfo">登錄</button>
4 </view>
//index.js
//獲取應用實例
const app = getApp()
var OPEN_ID = ''//儲存獲取到openid  
var SESSION_KEY = ''//儲存獲取到session_key
var AVATARURL = ''
var NICKNAME = ''
var GENDER = ''
var PROVINCE = ''
var CITY = ''
Page({

  /**
   * 頁面的初始數據
   */
  data: {
    //判斷小程序的API,回調,參數,組件等是否在當前版本可用。
    canIUse: wx.canIUse('button.open-type.getUserInfo'),
    isHide: false,
  },


  /**
   * 生命周期函數--監聽頁面加載
   */

  onLoad: function () {
    var that = this;
    var nickName ='';
    var avatarUrl =''
    // 查看是否授權
    wx.getSetting({
      success: function (res) {
        
        if (res.authSetting['scope.userInfo']) {
          wx.getUserInfo({
            success: function (res) {
              // 用戶已經授權過,不需要顯示授權頁面,所以不需要改變 isHide 的值
              that.setData({
                nickName:res.userInfo.nickName,
                avatarUrl:res.userInfo.avatarUrl
              })
            }
          });
        
        } else {
          // 用戶沒有授權
          // 改變 isHide 的值,顯示授權頁面
          that.setData({
            isHide: true,
          });
        }
      }
    });
  },

  /**
   * 生命周期函數--監聽頁面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函數--監聽頁面顯示
   */
  onShow: function () {

  },

  /**
   * 生命周期函數--監聽頁面隱藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函數--監聽頁面卸載
   */
  onUnload: function () {

  },

  /**
   * 頁面相關事件處理函數--監聽用戶下拉動作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 頁面上拉觸底事件的處理函數
   */
  onReachBottom: function () {

  },

  /**
   * 用戶點擊右上角分享
   */
  onShareAppMessage: function () {

  },
  bindGetUserInfo: function (e) {
    if (e.detail.userInfo) {
      //用戶按了允許授權按鈕
      var that = this;
      // 獲取到用戶的信息了,打印到控制台上看下
      console.log("用戶的信息如下:");
      console.log(e.detail.userInfo);
      NICKNAME = e.detail.userInfo.nickname;
      GENDER = e.detail.userInfo.gender;
      PROVINCE = e.detail.userInfo.province;
      CITY = e.detail.userInfo.city;

      //授權成功后,通過改變 isHide 的值,讓實現頁面顯示出來,把授權頁面隱藏起來
      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  
              console.log(OPEN_ID)
              console.log(SESSION_KEY)
              //如果返回成功,則將OPEN_ID和SESSION_KEY提交請求給本地服務器
              wx.request({
                url: 'http://127.0.0.1:8080/wxapplogin/login.jsp',
                data: {
                  open_id: OPEN_ID,
                  session_key: SESSION_KEY,
                  gender: GENDER,
                  province: PROVINCE,
                  city: CITY
                },
                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('用戶點擊了“返回授權”');
          }
        }
      });
    }
  }
})

 

當點擊按鈕之后出發getUserInfo()函數,我們在這個函數里面定義:

通過發送臨時的code請求到微信的服務器,我們通過獲取這個code再來解析用戶的openid和session_key

請求地址url為:

https://api.weixin.qq.com/sns/jscode2session

appid為注冊小程序時給定的,每一個微信小程序的appid也是唯一的,secret也會生成

當請求成功之后會從服務器返回openid和session_key,這里也可以寫成

https://api.weixin.qq.com/sns/jscode2session?appid='自己的appid'&secret='自己的密鑰'

完成之后我們來獲取從服務器返回的值,如果請求成功,先打印出來,再傳到自己的服務器上

 

OK,下面這個圖是當點擊按鈕之后自動生成的code,在控制台答打印一下,每一次的都不一樣

 

可以從控制台看到返回的數據,下面咱們再把這個數據放到自己的服務器上保留以后用

 

 這個url是自己的服務器地址,為了方便測試,我們先用本地主機試一下,代碼后續如果全部完成,再部署到服務器

這個地方有個主意事項,如果在開發者工具控制台出現以下錯誤:

顯示。。。不在request合法域名列表中,可以在微信公眾后台添加該域名,也可以在開發者工具里面臨時測驗:點擊不校驗域名就OK了

 

 

所以如果點擊index.wxml后控制台打印code並請求微信服務器,接着請求自己的服務器,就是這么個流程:

我們后端用java接受一下:

 

先打印到控制台,OK了,可以啊看到值傳過去了,下面可以啊將值傳到數據庫里面,我就不用多寫了,呀呀呀,有啥問題可以隨時評論留言討論

 


免責聲明!

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



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