微信小程序使用wx.login()獲取用戶的openid和session_key(示例後端使用Thinkphp)

開發需求:

我們在開發微信小程序過程中,需要綁定微信用戶的信息到數據庫裏,那麼就需要獲得用戶的唯一標識openid,而微信爲了安全,禁止小程序直接訪問https://api.weixin.qq.com 的接口,因此不能直接拿到用戶的openid。

解決方案:

1、先通過wx.login獲取一個臨時憑證code

wx.login(OBJECT)

調用接口獲取登錄憑證(code)進而換取用戶登錄態信息,包括用戶的唯一標識(openid) 及本次登錄的 會話密鑰(session_key)。用戶數據的加解密通訊需要依賴會話密鑰完成。

2、然後我們拿這個code去自己的服務器換取用戶openid和session_key

code 換取openid和session_key

​ 這是一個 HTTPS 接口,開發者服務器使用登錄憑證 code 獲取 session_key 和 openid。其中 session_key 是對用戶數據進行加密簽名的密鑰。爲了自身應用安全,session_key 不應該在網絡上傳輸。

一、微信小程序前端代碼(app.js) 

//app.js
App({
  onLaunch: function() {
    // 展示本地存儲能力
    var logs = wx.getStorageSync('logs') || []
    logs.unshift(Date.now())
    wx.setStorageSync('logs', logs)
    /*
    * 獲取用戶openid
    * 示例說明:微信爲了安全,禁止小程序訪問https://api.weixin.qq.com 的接口,因此不能直接拿到用戶的openid
    * 解決方案:
    * 1、先通過wx.login獲取一個臨時憑證code
    * 2、然後我們拿這個code去自己的服務器換取用戶openid
    */
    var that=this;
    wx.login({
      success: function (res) {
        var code = res.code;//發送給服務器的code
        wx.getUserInfo({
          success: function (res) {
            var userNick = res.userInfo.nickName; //用戶暱稱
            var avataUrl = res.userInfo.avatarUrl;//用戶頭像地址
            var gender = res.userInfo.gender;     //用戶性別
            if (code) {
              wx.request({
                url: 'https://後端網址/getOpenid.html',
                data: {
                  code: code,
                  nick: userNick,
                  avaurl: avataUrl,
                  sex: gender,
                },
                header: {
                  'content-type': 'application/json'
                },
                success: function (res) {
                  console.log('獲取到的用戶openid爲:' + res.data.openid);
                  //可以把openid保存到本地緩存,方便以後調用
                  wx.setStorageSync('openid', res.data.openid);
                }
              })
            }
            else {
              console.log("獲取用戶登錄態失敗!");
            }
          }
        })
      },
      fail: function (error) {
        console.log('login failed ' + error);
      }
    })    
  },
  /**
   * 全局屬性
   */
  globalData: {
    userInfo: null
  }
})

二、後端Thinkphp代碼

public function getOpenid(){
		
 if(!isset($_GET['code'])||!isset($_GET['nick'])||!isset($_GET['avaurl'])||!isset($_GET['sex'])){
            header("Content-type: text/html; charset=utf-8"); 
            echo '參數錯誤.';
            exit;
 }
		//微信小程序appid
		$appid='小程序的APPID';
		//微信小程序secret
                $secret='小程序的SECRET';
		$code = $_GET['code'];		//小程序傳來的code值
		$nick = $_GET['nick'];		//小程序傳來的用戶暱稱
		$imgUrl = $_GET['avaurl'];	//小程序傳來的用戶頭像地址
		$sex = $_GET['sex'];		//小程序傳來的用戶性別
		$url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.$appid.'&secret='.$secret.'&js_code=' . $code . '&grant_type=authorization_code';
		$info = file_get_contents($url);//發送HTTPs請求並獲取返回的數據,推薦使用curl
		$json = json_decode($info);//對json數據解碼
		$arr = get_object_vars($json);
		$openid = $arr['openid'];
		$session_key = $arr['session_key'];
		echo json_encode($arr);
	}

這裏說明一下,小程序的APPID和SECRET需要使用小程序賬號登錄微信公衆號平臺獲取。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章