小程式如何獲取code

達叔小生發表於2018-11-16

小程式如何獲取code

<button open-type="getUserInfo" hover-class='none' bindgetuserinfo="getUserInfoFun">.</button> 
wx.login({
      success: function (res) {
        var code = res.code;
        if (code) {
          console.log('獲取使用者登入憑證:' + code);

          // --------- 傳送憑證 ------------------
          wx.request({
            url: 'https://www.my-domain.com/wx/onlogin',
            data: { code: code }
          })
          // ------------------------------------

        } else {
          console.log('獲取使用者登入態失敗:' + res.errMsg);
        }
      }
    });

登入的時候需要拿到token值,需要跟後端配合才能拿到

小程式呼叫wx.login() 獲取 臨時登入憑證code ,並回傳到開發者伺服器

開發者伺服器以code換取 使用者唯一標識openid 和 會話金鑰session_key

// 登入
wx.login({
    success: res => {
        // 傳送 res.code 到後臺換取 openId, sessionKey, unionId
        // console.log(res)
        if (res.code) {
            //發起網路請求
            wx.request({
                url: 'url',
                method: 'POST',
                data: {
                    // x: '',
                    // y: ''
                    code: res.code //將code發給後臺拿token
                },
                header: {
                    'content-type': 'application/json' // 預設值
                },
                success: function(res) {
                    // 存token
                    console.log('token=' + res.data.data.token)
                    that.globalData.token = res.data.data.token; //拿到後將token存入全域性變數  以便其他頁面使用
                }
            })
        } else {
            console.log('獲取使用者登入態失敗!' + res.errMsg)
        }
    }
})
// 檢驗、登入
wx.checkSession({
    success: function() {
       //session_key 未過期,並且在本生命週期一直有效
    },
    fail: function() {
        //session_key 已經失效,需要重新執行登入流程
        wx.login({
            success: (res) => {
                if (res.code) {
                    //發起網路請求
                    wx.request({
                        //開發者伺服器通過code換取使用者唯一標識openid 和 會話金鑰session_key。
                        url: 'https://test.com/onLogin',                  
                        data: {
                            // 臨時登入憑證code,並回傳到開發者伺服器
                            code: res.code
                        },
                        success: function(result) {
                            //返回業務資料,前後端互動身份識別
                        }
                    })
                } else {
                    console.log('登入失敗!' + res.errMsg)
                }
            }
        });
    }
})

授權獲取使用者資訊

// 可以通過 wx.getSetting 先查詢一下使用者是否授權了 "scope.record" 這個 scope
wx.getSetting({
    success(res) {
        if (!res.authSetting['scope.record']) {
            wx.authorize({
                scope: 'scope.record',
                success() {
                    // 使用者已經同意小程式使用錄音功能,後續呼叫 wx.startRecord 介面不會彈窗詢問
                    wx.startRecord()
                }
            })
        }
    }
})
wx.authorize({scope: "scope.userInfo"}),無法彈出授權視窗,請使用 
<button open-type="getUserInfo"></button>
wx.getSetting({
    success: (res)=>{
        if (res.authSetting['scope.userInfo']) {
            // 已經授權,可以直接呼叫 getUserInfo 獲取頭像暱稱
            wx.getUserInfo({
              withCredentials: true,
              success: (res) => {
                  console.log(res);
              }                           
            })
        }
    }
});

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

授權和登入的意義
session_key 的作用
unionId 的作用,有哪些獲取途徑
在應用中如何儲存使用者登入態

新版api已廢棄wx.authorize()

wx.getUserInfo(Object object)
呼叫前需要 使用者授權 scope.userInfo。
注意:wx.authorize({scope: "scope.userInfo"}),無法彈出授權視窗,請使用

<button open-type="getUserInfo"/>

一個使用者相對於不同的微信應用會存在不同的openId

在這裡插入圖片描述

儲存使用者登入態

兩種解決方案:前端儲存和後端儲存

App({
  data:{
    titleList: [],    //資料
    wxa_session: '',  // 金鑰 
    openid: '',
    scene: ''
  },
  onLaunch: function () {   
    try {
      // 同步清理本地資料快取
      console.log('clear');
      wx.clearStorageSync()
    } catch (e) {
      // Do something when catch error
    }
 },
// 定義登入函式
userLogin:function(cb){
  var that = this
  wx.login({
    success: function (res) {
      if (res.code) {
        //發起網路請求
        wx.request({
          url: 'https://mp.weixin.qq.com/wxaintp/common?action=login&codetype=invoicediscern',
          data: {
            // 通過傳遞code獲取openID 和 金鑰
            code: res.code
          },
          success: function (res) {
            // console.log(res);
            if (res.data.base_resp.ret == 0){

              // 使用者唯一標識openid 和 會話金鑰session_key
              that.data.wxa_session = res.data.session_key;
              that.data.openid = res.data.openid;
              console.log(that.data.wxa_session);
            
              cb();   // 後續操作         
            }
            else {
              // 引數有誤
              wx.showToast({
                image: '/static/images/icon_fail@3x.png',
                title: res.data.base_resp.err_msg,
              })
              
            }               
          }
        })
      } else {
        console.log('獲取使用者登入態失敗!' + res.errMsg)
      }
    }
  });  
  globalData:{
      userInfo:null
  },
  onShow: function(options) {
        console.log('app onShow');
        console.log(options);
        var that = this;
        if(options){
          that.data.scene = options.scene;  //場景
        }    
  }  
})
App({
  // 獲取token
  getToken: function() {
    var that = this;
    if (wx.getStorageSync("token") == null || wx.getStorageSync("token") == "") {
      console.log("請使用者授權獲取token");
      wx.redirectTo({
        url: '/pages/welcome/welcome',
      })
    } else {
      wx.switchTab({
        url: '/pages/index/index',
      })
    }
  },
  // 當小程式初始化完成時,會觸發 onLaunch(全域性只觸發一次)
  onLaunch: function() {
    // 獲取小程式更新機制相容
    if (wx.canIUse('getUpdateManager')) {
      const updateManager = wx.getUpdateManager()
      updateManager.onCheckForUpdate(function(res) {
        // 請求完新版本資訊的回撥
        if (res.hasUpdate) {
          updateManager.onUpdateReady(function() {
            wx.showModal({
              title: '更新提示',
              content: '新版本已經準備好,是否重啟應用?',
              success: function(res) {
                if (res.confirm) {
                  // 新的版本已經下載好,呼叫 applyUpdate 應用新版本並重啟
                  updateManager.applyUpdate()
                }
              }
            })
          })
          updateManager.onUpdateFailed(function() {
            // 新的版本下載失敗
            wx.showModal({
              title: '已經有新版本了喲~',
              content: '新版本已經上線啦~,請您刪除當前小程式,重新搜尋開啟喲~',
            })
          })
        }
      })
    } else {
      // 如果希望使用者在最新版本的客戶端上體驗您的小程式,可以這樣子提示
      wx.showModal({
        title: '提示',
        content: '當前微信版本過低,無法使用該功能,請升級到最新微信版本後重試。'
      })
    }

    var that = this;
    that.getToken();
  },
  // 當小程式啟動,或從後臺進入前臺顯示,會觸發 onShow
  onShow: function(options) {

  },
  // 當小程式從前臺進入後臺,會觸發 onHide
  onHide: function() {

  },
  // 當小程式發生指令碼錯誤,或者 api 呼叫失敗時,會觸發 onError 並帶上錯誤資訊
  onError: function(msg) {

  },
  globalData: {
    "avatarUrl": null,
    "nickName": null,
    // userId: 使用者編號
    "userId": null,
    // organId: 所屬單位
    "organId": null,
    // idType:身份型別  
    "idType": null,


    "uncheckedNUM": null,
    "attendNum": null,
    "beLateNum": null,
    "leaveNum": null,

    "token": null,
    "studentNo": null,
  }
})
// 獲取全域性變數
const app = getApp();
Page({
  // 頁面的初始資料
  data: {
    progress_txt: '點選賬號繫結...',
  },
  // 按鈕
  drawProgressbg: function() {
    // 使用 wx.createContext 獲取繪圖上下文 context
    var ctx = wx.createCanvasContext('canvasProgressbg')
    ctx.setLineWidth(4); // 設定圓環的寬度
    ctx.setStrokeStyle('#20183b'); // 設定圓環的顏色
    ctx.setLineCap('round') // 設定圓環端點的形狀
    ctx.beginPath(); //開始一個新的路徑
    ctx.arc(110, 110, 100, 0, 2 * Math.PI, false);
    //設定一個原點(100,100),半徑為90的圓的路徑到當前路徑
    ctx.stroke(); //對當前路徑進行描邊
    ctx.draw();
  },
  // 授權登入
  doAuthorization: function(e) {
    var that = this;
    console.log("呼叫了 doAuthorization 授權");
    // 授權 只為獲取token
    wx.login({
      success: function(res) {
        console.log("login: code", res.code);
        // 傳送至伺服器
        wx.request({
          url: '',
          method: 'POST',
          header: {
            Authorization: "",
            'Content-Type': 'application/x-www-form-urlencoded',
          },
          data: {
            mobile: 'wxecd372cca9b110e3@' + res.code,
            grant_type: 'mobile',
          },
          success: function(res) {
            // 進行判斷
            console.log("button 成功", res.data);
            console.log("button token 成功", res.data.access_token);
            if (res.data.access_token == null || res.data.access_token == "") {
              wx.showModal({
                title: '提示',
                content: '請到公眾號平臺進行繫結賬號',
                showCancel: false,
                success: function(res) {
                  console.log("請繫結賬號");
                }
              })
            } else {
              wx.setStorageSync("token", res.data.access_token);
              wx.showToast({
                title: '成功',
                icon: 'succes',
                duration: 1000,
                mask: true
              })
              setTimeout(function() {
                // 授權跳轉 index
                wx.switchTab({
                  url: '/pages/index/index',
                })
                wx.hideToast()
              }, 2000)
            }
          },
          // 失敗
          fail: function(err) {
            console.log("token 失敗", err);
            wx.showModal({
              title: '提示',
              content: '請到公眾號平臺進行繫結賬號',
              showCancel: false,
              success: function(res) {      
                if (res.confirm) {        
                  wx.navigateBack({          
                    delta: 0        
                  })      
                }    
              }
            })
          }
        })
      }
    })
  },
  // 生命週期函式--監聽頁面載入
  onLoad: function(options) {

  },
  // 生命週期函式--監聽頁面初次渲染完成
  onReady: function() {
    this.drawProgressbg();
  },
  // 生命週期函式--監聽頁面顯示
  onShow: function() {

  },
  // 生命週期函式--監聽頁面隱藏
  onHide: function() {

  },
  // 生命週期函式--監聽頁面解除安裝
  onUnload: function() {

  }
})

相關文章