微信第三方二維碼掃描登入
阿新 • • 發佈:2019-01-07
微信二維碼掃描登入
最近做了微信二維碼掃描登入的工作。實則非常簡單。
其實就是各種介面互相呼叫,收取引數跳頁的過程。不過不熟練
的情況下,會比較麻煩,無從下手。從查閱開發文件到工作的完成,現
在總結以下步驟。
原理步驟
1,展示微信使用者需要掃描的二維碼 2,微信使用者掃碼,以及確認登入(分兩種情況,一種已經註冊,另一種沒有註冊) 3,通過確認登入的過程,驗證密匙,接受資料,處理資料(可分辨出是否註冊) 1>使用者已註冊: 查詢使用者詳細資訊,然後加入session直接登入 2>使用者未註冊: 將接收到的使用者詳細資訊插入資料表,存如session,直接登 錄 ( 注意:意義不大,通常是跳到使用者微信繫結頁面,獲取 使用者電話號碼等詳細資訊 ) 附帶啟用頁面:(繫結手機等) 如果跳到了啟用頁面,輸入使用者資訊,提交註冊即可。
準備工作
在微信開放平臺(open.weixin.qq.com)申請appid和appsecret.
程式碼實現
1,展示二維碼
有兩種方式可供選擇: 1,點選微信登入,跳頁展示二維碼。 配合自己申請的引數跳如下連結即可: https://open.weixin.qq.com/connect/qrconnect? appid=APPID&redirect_uri=REDIRECT_URI&response_type=code& scope=SCOPE&state=STATE#wechat_redirect 引數 是否必須 說明 ------------------------------------------------------------------------------- appid 是 應用唯一標識(申請) ------------------------------------------------------------------------------- redirect_uri 是 請使用urlEncode對連結進行處理(使用者確認後需要跳的頁面url 需要使用url_encode編碼) ------------------------------------------------------------------------------- response_type 是 填code即可 ------------------------------------------------------------------------------- scope 是 寫snsapi_login即可 ------------------------------------------------------------------------------- state 否 自定義密匙,防攻擊。用 該引數可用於防止csrf攻擊(跨站請求偽造攻擊) ,建議第三方帶上該引數,可設定為 簡單的隨機數加session進行校驗 ------------------------------------------------------------------------------- 2,把需要掃描的二維碼直接展示在登入頁 html頁面中操作: 1,引入html頁面: <script src="http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script> 2,html下面加入這段js物件 <script type="text/javascript"> var obj = new WxLogin({ id:"login_container", appid: "", scope: "", redirect_uri: "", state: "", style: "",//樣式 href: "" //樣式 樣式查閱開發文件即可 }); </script> 3,需要展示二維碼的地方加入如下標籤(注意id和js物件的id要一致) <div class="login_fast" id="login_container">
2,掃描二維碼及處理
跳到redirect_uri網址,帶上code和state引數。如果使用者不允許登入,只帶state引數。 這裡只討論使用者允許登入的情況下。 --------------------------------------------------------------------- 1,根據code,以及申請的appid,secret來獲取access_token 例如: https://api.weixin.qq.com/sns/oauth2/access_token? appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code 重新整理access_token 例如: https://api.weixin.qq.com/sns/oauth2/refresh_token? appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN 注意: access_token 為使用者授權第三方應用發起介面呼叫的憑證(相當於使用者登入態),儲存 在客戶端 --------------------------------------------------------------------- 2,獲取使用者個人資訊 http請求方式: GET https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
3,程式碼示例
<?php
session_start();
//檢查state引數,如果不同,禁止頁面向下執行
if($local_state != $_GET['state']){
return false;
exit('state有誤');
}
//獲取access_token
$appid = "appid";
$secret = "secret";
$code = $_GET['code'];
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appid."&secret=".$secret."&code=".$code."&grant_type=authorization_code";
$ch = curl_init();
$timeout = 0;
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_USERAGENT , "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)");
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$res = curl_exec($ch);
curl_close($ch);
//get_object_vars()獲取$object物件中的屬性,組成一個數組
$array=get_object_vars(json_decode($res));
//獲取使用者資訊利用open_id和access_token
$access_token=$array['access_token'];
//授權使用者唯一標識
$openid=$array['openid'];
$url="https://api.weixin.qq.com/sns/userinfo?access_token=".$access_token."&openid=".$openid;
$ch = curl_init();
$timeout = 0;
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_USERAGENT , "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)");
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$res = curl_exec($ch);
curl_close($ch);
$callback_data= json_decode($res);
$array=get_object_vars($callback_data);
/*獲取到使用者資訊就可以進行查詢使用者的註冊資訊
以及獲得如何跳頁,如何處理等等
*/