随著(zhe)聊天工具的(de)不斷發展,如今在衆多(duō)的(de)聊天工具中微信一騎絕塵,也(yě)就是基本每個(gè)人(rén)的(de)手機都會有微信軟件,所以微信掃碼登錄網頁端比新浪,QQ等第三方平台登錄使用(yòng)都更加廣泛。
微信掃碼網頁端實現登錄的(de)原理(lǐ),是利用(yòng)公衆号頁面的(de)微信登錄功能,不過會一些代碼的(de)增加和(hé)改動,使手機端與PC端能形成數據的(de)聯動,下(xià)面就著(zhe)重講一下(xià)改動和(hé)增加代碼的(de)内容。
第一步,生成一個(gè)二維碼,如下(xià)圖所示:
即用(yòng)手機掃碼該二維碼後,首次登錄需獲取用(yòng)戶的(de)信息,然後網頁直接登錄,二維碼是一個(gè)跳轉的(de)URL鏈接地址,内容如下(xià):
//随機字符串,用(yòng)于聯運PC與手機的(de)媒介
$rand_code = 'M'.time().rand('100001','999999');
//登錄後返回的(de)地址
$REDIRECT_URI = '域名/Weixin/login_return?rand_code='.$rand_code;
//微信登錄地址,也(yě)是二維碼地址
$scope='snsapi_userinfo';//表示需要授權
$url='https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$APPID.'&redirect_uri='.urlencode($REDIRECT_URI).'&response_type=code&scope='.$scope.'&state=1#wechat_redirect';//登錄驗證
vendor("phpqrcode.phpqrcode");//調用(yòng)二維碼類
$level = 'L';// 點的(de)大(dà)小:1到10,用(yòng)于手機端4就可(kě)以了(le)
$size = 7;/* 二維碼的(de)大(dà)小,下(xià)面注釋了(le)把二維碼圖片保存到本地的(de)代碼,如果要保存圖片,用(yòng)$fileName替換第二個(gè)參數false*/
$fileName ='Uploads/qcode/2.png'; // 生成的(de)文件名
$QRcode = new \QRcode();
$QRcode->png($url, $fileName, $level, $size);//生成二維碼
$this->qrcode = .'/'.$fileName;//二維碼路徑
$this->rand_code = $rand_code;//将随機數傳遞到掃碼的(de)頁面
如上所示,$url就是二維碼的(de)内容,掃碼後手機就浏覽$url,手機确認授權登錄後,就會返回$REDIRECT_URI的(de)地址,方法如下(xià):
function login_return(){
$rand_code = I('get.rand_code','');//PC生成的(de)随機數
$appid = C('APPID');
$secret = C('SECRET');
$code = $_GET["code"];
//獲取用(yòng)戶的(de)access_token和(hé)openid
$get_token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$secret.'&code='.$code.'&grant_type=authorization_code';
$data = fopen($get_token_url, "rb");
$data = stream_get_contents($data);
@fclose($data);
$json_obj = json_decode($data,true);
//根據openid和(hé)access_token查詢用(yòng)戶信息
$access_token = $json_obj['access_token'];
$openid = $json_obj['openid'];
$get_user_info_url = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN';
$data2 = fopen($get_user_info_url, "rb");
$data2 = stream_get_contents($data2);
@fclose($data2);
//解析json
$info = json_decode($data2,true); //$info即是用(yòng)戶信息的(de)數組
}
上面是代碼,原理(lǐ):手機掃碼登錄後,獲取用(yòng)戶的(de)信息,如果昵稱,頭像,地區(qū)等,最重要的(de)是openid,根據openid查詢會員(yuán)表有沒有存在,如果存在則将随機數$rand_code更新到會員(yuán)表member的(de)rand_code裏,如果不存在,則添加一行會員(yuán)信息,添加的(de)内容是用(yòng)戶的(de)昵稱,頭像,openid, rand_code,因爲rand_code已經保存在會員(yuán)表的(de),所以PC網頁端用(yòng)定時(shí)執行的(de)函數,每隔幾秒查詢會員(yuán)表中是否存在rand_code,如果存在則登錄成功,并且獲取該會員(yuán)的(de)信息,PC端的(de)JS如下(xià):
微信登錄的(de)功能比較簡單,主要是知道原理(lǐ)是怎麽實現的(de)就可(kě)以了(le)。