PHP實現微信掃碼登錄功能的兩種方式總結
官方文檔
微信掃碼登錄目前有兩種方式:
1:在微信作用域執行 ,就是條一個新頁面
前端點擊一個按鈕,請求後端接口條微信作用域
後端php代碼如下:
$redirect_uri="http://你的微信開放平臺綁定域名下處理掃碼事件的方法"; $redirect_uri=urlencode($redirect_uri);//該回調需要url編碼 $appID="你的appid"; $scope="snsapi_login";//寫死,微信暫時隻支持這個值 //準備向微信發請求 $url = "https://open.weixin.qq.com/connect/qrconnect?appid=" . $appID."&redirect_uri=".$redirect_uri ."&response_type=code&scope=".$scope."&state=STATE#wechat_redirect"; //請求返回的結果(實際上是個html的字符串) $result = file_get_contents($url); //替換圖片的src才能顯示二維碼 $result = str_replace("/connect/qrcode/", "https://open.weixin.qq.com/connect/qrcode/", $result); return $result; //返回頁面
最終跳轉頁面如下:
2:內嵌js,在當前頁面顯示登錄二維碼
第一種操作實現起來比較簡單,但是個人感覺用戶體驗稍微差一點。
最好還是在當前頁面就是顯示微信登錄的二維碼,直接掃描就好。
微信也為我們提供瞭這種方式。
(1):引入js
<script src="https://res.wx.qq.com/connect/zh_CN/htmledition/js/jquery.min.js"></script> <script src="http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script>
(2):html部分
<div id="wx_login_container"></div>
(3):js示例
<script> $(document).ready(function() { var obj = new WxLogin({ self_redirect: true, id:"wx_login_container", appid: "appid", scope: "snsapi_login", redirect_uri: "回調地址",//這裡的回調地址可以寫後端的接口,也可以寫前端的頁面地址,我這裡寫的是前端的頁面地址 state: "", style: "black", href: "", //https://某個域名下的css文件 }); }); // 將方法掛載到window主鏈上 // 從iframe中獲取到回調函數中獲取的微信返回的code window.jumpTop = function(code){ console.log(code); var data = { code: code }; console.log(data); self.axios .post("/index.php/xxx/wxlogin_notice", data) .then(result => { if(result.data.code > 0) { Message.success(result.data.msg); if(result.data.type == 0) {// 跳學生首頁 self.$router.push("/manager/student/reportList"); } else if(result.data.type == 1 || result.data.type == 9) {// 跳選擇身份頁 self.$router.push("/manager/teacher/index"); } } }) .catch(err => {});//*/ }; </script>
註意其中href裡指向的css文件必須放在https協議下才能引用的到,大體上不需改變默認樣式,浪費腦細胞,可以針對div 來改變二維碼的大小和位置,裡邊是內嵌一個iframe
整理的實現邏輯如下圖所示:
微信的二維碼嵌入在一個iframe中,微信掃碼成功,手機點擊確定後,回調地址接收到微信給我們的參數code,這裡微信使用的是get傳參,因此我們隻需要在回調地址的頁面中獲取當前頁面的URL中的code參數傳給上一層(父級),上一層接收到code參數再請求後端接口執行登錄邏輯即可。
回調地址:
https://www.xxx.xxx/lims/web/wechat/login.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="https://res.wx.qq.com/connect/zh_CN/htmledition/style/impowerApp45a337.css" rel="external nofollow" > <link href="https://res.wx.qq.com/connect/zh_CN/htmledition/images/favicon3696b4.ico" rel="external nofollow" rel="Shortcut Icon"> </head> <body style="color: rgb(55, 55, 55);"> <div style=""> <div class="main impowerBox"> <div class="loginPanel normalPanel"> <div>微信登錄</div> <div class="waiting panelContent"> <div> <img class="qrcode lightBorder" src="./img.jpg%20"> </div> <div> <div class="status status_succ js_status js_wx_after_scan" style="display: block;" id="wx_after_scan"> <i class="status_icon icon38_msg succ"></i> <div> <h4>掃描成功</h4> <p>請在微信中點擊確認即可登錄</p> </div> </div> </div> </div> </div> </div> </div> <script src="https://www.mools.net/lims/web/common/common.js"></script> <script> if (parent) { // 將從url中解析出來的參數傳到iframe的父級(調用父級方法) parent.jumpTop(ml.get("code")); } </script> </body> </html>
PHP回調代碼:(上邊的兩種掃碼方式都可用)
/** * @name: 微信掃碼登陸回調(不跳頁二維碼) * @author: camellia * @date: 2020-12-25 11:47:17 */ public function wxlogin_notice(Request $request) { $code = $request->input("code"); if (!empty($code)) { $jsonResult = ''; if($jsonResult == '') { //通過code獲得 access_token + openid $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . $this->appid . "&secret=" . $this->appsecret . "&code=" . $code . "&grant_type=authorization_code"; $jsonResult = file_get_contents($url); } // 對象轉數組 $resultArray = json_decode($jsonResult, true); $access_token = $resultArray["access_token"]; $openid = $resultArray["openid"]; //通過access_token + openid 獲得用戶所有信息,結果全部存儲在$infoArray裡,後面再寫自己的代碼邏輯 $infoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" . $access_token . "&openid=" . $openid; $infoResult = file_get_contents($infoUrl); $infoArray = json_decode($infoResult, true); // 沒有unionid ,跳官網 if (!isset($infoArray['unionid'])) { // echo "<script >alert('登錄失敗,用戶信息錯誤!')</script>";die; $result['code'] = -1; $result['msg'] = '登錄失敗,用戶信息錯誤!'; return $result; } // 獲取unionid $unionid = $infoArray['unionid']; $userinfo = DB::table('user')->where('unionid', $unionid)->first(); $userinfObj = json_decode(json_encode($userinfo), true); if ($userinfo) { // 存session $request->session()->put('userinfo', $userinfObj); // $session = $this->getSession($request); // var_dump($session);die; // 教師跳頁 if (($userinfo->type == 9) || ($userinfo->type == 1 && $userinfo->islogin == 9)) { // echo "<script> top.location.href='https://www.xxxx.net/'; </script>";die; $result['code'] = 1; $result['msg'] = '登錄成功'; $result['type'] = $userinfo->type; return $result; } else if ($userinfo->type == 1 && $userinfo->islogin >= 3) { // 學生跳頁 // echo "<script> top.location.href='https://www.xxxx.net/'; </script>";die; $result['code'] = 2; $result['msg'] = '登錄成功'; $result['type'] = $userinfo->type; return $result; } else if($userinfo->type == 0) { // echo "<script> top.location.href='https://www.xxxx.net/'; </script>";die; $result['code'] = 3; $result['msg'] = '登錄成功'; $result['type'] = $userinfo->type; return $result; } else { // 無效用戶跳至官網 // echo "<script> top.location.href='https://www.xxxx.net'; </script>";die; $result['code'] =-2; $result['msg'] = '用戶身份有誤!'; return $result; } } else { // echo "<script >alert('登錄失敗,用戶信息錯誤~')</script>";die; $result['code'] = -3; $result['msg'] = '用戶身份有誤!'; return $result; } } else { // echo "<script >alert('登錄失敗,請重試!')</script>";die; $result['code'] = -4; $result['msg'] = '登錄失敗,請重試!'; return $result; } }
到此這篇關於PHP實現微信掃碼登錄功能的兩種方式總結的文章就介紹到這瞭,更多相關PHP微信掃碼登錄內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 微信公眾號網頁授權登錄的超簡單實現步驟
- Java微信授權登陸的實現示例
- uni-app 微信小程序授權登錄的實現步驟
- H5微信公眾號授權的簡單實現步驟
- 微信小程序登錄方法之授權登陸及獲取微信用戶手機號