關於thinkphp 與微信小程序授權登錄的心得,加上完整代碼


1.小程序端代

 

var app = getApp();
var url = 'http://shzujune.com/mianya/public/index/index/wxlogin';
var login = function (code, encryptedData, iv, signature, rawData) {
  var that = this
  //創建一個dialog提示
  wx.showToast({
    title: '正在登錄...',
    icon: 'loading',
    duration: 5000
  });
  wx.request({
    url: url,
    method: 'get',
    data: {
      code: code,
      encryptedData: encryptedData,
      iv: iv,
      signature:signature,
      rawData:rawData
    },
    header: {
      'Content-Type': 'application/json'
    },
    success: function (res) {
      wx.hideToast()
      //console.log('服務器返回' + res.data)
      app.globalData.userInfo = res.data
    },
    fail: function () {
      wx.showToast({
        title: '網絡錯誤!',
        duration: 2000
      })
    },
    complete: function () {
  
    }
  })
}
Page({
  data: {
    //判斷小程序的API,回調,參數,組件等是否在當前版本可用。
    canIUse: wx.canIUse('button.open-type.getUserInfo')
  },
  onLoad: function () {
    var that = this
    wx.login({
      success: function (res) { //登錄成功
        //console.log(res)
        if (res.code) {
          var code = res.code
          wx.getUserInfo({ //getUserInfo流程
            success: function (data) { //getUserInfo獲取用戶信息成功
              //console.log(data)
              //encryptedData加密密文,iv偏移向量,encodeURIComponent把加密字符串解密成URI字符串
              var encryptedData = encodeURIComponent(data.encryptedData);
              var iv = encodeURIComponent(data.iv);
              var signature = data.signature
              var rawData = data.rawData
              //請求自己的服務器
              login(code, encryptedData, iv, signature, rawData);
              //已經授權的用戶
              wx.switchTab({
                url: '../rec/rec',
              })
            }
          })
        } else {
          console.log('用戶沒有進行授權!' + res.errMsg)
        }
      }
    });
  },
  bindGetUserInfo: function (e) {
    //console.log(e)
    if (e.detail.userInfo) {
      //用戶按了允許授權的按鈕
      var that = this
      wx.login({
        success: function (res) {
          if (res.code) {
            var code = res.code
            wx.getUserInfo({
              success: function (data) {
                var encryptedData = encodeURIComponent(data.encryptedData);
                var iv = encodeURIComponent(data.iv);
                var signature = data.signature;
                var rawData = data.rawData;
                //請求自己的服務器
                login(code, encryptedData, iv, signature, rawData);
              }
            })
          }
        }
      })
      //授權成功后,跳轉進入小程序首頁
      wx.switchTab({
        url: '../rec/rec'
      })
    } else {
      //用戶按了拒絕按鈕
      wx.showModal({
        title: '警告',
        content: '您點擊了拒絕授權,將無法進入小程序,請授權之后再進入!!!',
        showCancel: false,
        confirmText: '返回授權',
        success: function (res) {
          if (res.confirm) {
            console.log('用戶點擊了“返回授權”')
          }
        }
      })
    }
  },
})

2.php 端代碼

<?php
namespace Home\Controller;
use Home\Common\CommonController;

/**
* 小程序登錄類
*/

class WxloginController extends CommonController
{
	public function httpGet($url) {
	    $curl = curl_init();
	    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
	    curl_setopt($curl, CURLOPT_TIMEOUT, 500);
	    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
	    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
	    curl_setopt($curl, CURLOPT_URL, $url);
	    $res = curl_exec($curl);
	    curl_close($curl);
	    return $res;
	}
	
	//解密微信用戶敏感數據
	public function login()
	{
	    // 接收參數
	    $data = $_GET;
	    //echo json_encode($data);
	    // 引入解密文件 在微信小程序開發文檔下載
	    vendor('Wx.wxBizDataCrypt');
	    vendor('Wx.errorCode');
	    $appid = "wx49b4769062bf";
	    $appsecret = "34d69fed605a49be9b6b0bc";
	    $grant_type = "authorization_code"; //授權(必填)
	    $code = $data['code'];    //有效期5分鍾 登錄會話
	    $encryptedData=urldecode($data['encryptedData']);
	    //echo json_encode($encryptedData);
	    $iv = urldecode($data['iv']);
	    //echo json_encode($iv);
	    $signature = $data['signature'];
	    $rawData = $data['rawData'];
	 
	    // 拼接url
	    $url = "https://api.weixin.qq.com/sns/jscode2session?"."appid=".$appid."&secret=".$appsecret."&js_code=".$code."&grant_type=".$grant_type;
	    $res = json_decode($this->httpGet($url),true);
	    $sessionKey = $res['session_key']; //取出json里對應的值
	    $signature2 = sha1(htmlspecialchars_decode($rawData).$sessionKey);
	    
	    // 驗證簽名
	    if ($signature2 !== $signature){
	      echo json_encode("驗簽失敗");
	    } 
	    // 獲取解密后的數據
	    $pc = new \WXBizDataCrypt($appid, $sessionKey);
	    $errCode = $pc->decryptData($encryptedData, $iv, $data);
	    if ($errCode == 0) {
	      echo json_encode($data);
	    } else {
	      echo json_encode($errCode);
	    }
	}


	 
}

  


免責聲明!

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



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