網站添加第三方登錄(PHP版)

  這兩週正在寫畢業設計,我作的是一個問答網站。先介紹一下這個網站:這是一個關於大學生在線問答的網站,相似知乎和百度知道,不過功能沒有人家多,畢竟這個網站我一我的在作。網站部署在阿里雲,網站包括API,Web,IOS,三大模塊,如今沒有找到人幫忙寫安卓,唉...  網站API已經寫完了,Web端正在完善開發中,畢業答辯以前會吧基本功能上線,小夥伴們能夠訪問看看增長人氣,不過沒有寫完,而且看着不咋好看,由於沒人寫前端,我又不擅長寫頁面因此有點低端。域名是:http://www.olas.cnjavascript

  上面說的一點題外話,今天要說的是一個你們比較熟悉的東西:第三方登陸,由於個人這個畢業設計要用到,因此就順便加了一下,第三方登錄仍是頗有用的,這個是如今應用級網站的必備,如今的用戶通常都不會去主動去你的註冊,通常都是經過第三方的社交帳號去登錄,這樣免得之後去記密碼,並且也比較安全,因此添加第三方登陸仍是比較好的。下面我結合這個網站的添加過程寫點東西。php

  第三方登錄,顧名思義:用其餘媒體的帳號登錄一些網站,如今比較流行的第三方帳號通常是:QQ,微博,微信。其餘的平臺也有,好比:人人,百度貼吧等,感受這幾個沒有前面那三個出名,也沒有前面那三個用的多,因此今天就說當前最爲經常使用的微博和QQ的登錄方法。html

微博登錄前端

  先說使用新浪微博帳號登錄個人網站,微博登錄我理解是有兩種:一種是經過前臺JS調用不涉及後端的代碼就能夠實現登錄的功能,另外一種是經過SDK進行本身寫頁面和彈出確認框,本身處理邏輯,下面我會將這兩種方法都寫一下(其實也不算是兩種,只是大致上稱爲前端和後端 - SDK不同嘛):java

第一種:thinkphp

  一、先登錄微博的開放平臺:http://open.weibo.com,在個人應用中添加本身的網站或者是應用,網站的話域名必須是備案過的域名,不備案的域名禁止添加。我添加是 "答疑之家",等待審覈,審經過添加成功以後,點擊應用進去以後會看到左邊的導航裏面有個導航:部署微連接 ->微博登錄 ->微博登錄詳細介紹裏面就是微博登錄涉及到的文檔的添加的步驟。數據庫

2.放置登錄按鈕,邏輯大體以下:windows

經過WBML方式後端

 1 <!--沒有回調函數的登陸按鈕-->                 
 2 <wb:login-button type="3,2" ></wb:login-button>
 3  
 4 <!--有回調函數的登陸按鈕-->      
 5 <wb:login-button type="3,2" onlogin="login" onlogout="logout" ></wb:login-button>
 6 
 7 // 如需添加回調函數,請在wbml標籤中添加onlogin="login" onlogout="logout",並定義login和logout函數。
 8 function login(o) {
 9     alert(o.screen_name)
10 }
11  
12 function logout() {
13     alert('logout');
14 }

經過Js的方式:api

 1 <div id="wb_connect_btn" ></div>
 2 
 3 WB2.anyWhere(function (W) {
 4     W.widget.connectButton({
 5         id: "wb_connect_btn",
 6         type: '3,2',
 7         callback: {
 8             login: function (o) { //登陸後的回調函數
 9                 alert("login: " + o.screen_name)
10             },
11             logout: function () { //退出後的回調函數
12                 alert('logout');
13             }
14         }
15     });
16 });

添加必要的Js文件:

在HTML標籤中增長XML命名空間

1 <html xmlns:wb="http://open.weibo.com/wb">

在HEAD頭中引入WB.JS

1 <script src="http://tjs.sjs.sinajs.cn/open/api/js/wb.js?appkey=4121744546" type="text/javascript" charset="utf-8"></script>

在須要部署登陸按鈕的位置粘貼WBML代碼

1 <wb:login-button type="3,2" onlogin="login" onlogout="logout">登陸按鈕</wb:login-button>

這樣就能夠,點擊按鈕就能夠經過回調的方式吧用戶受權後的信息拿到,好比頭像暱稱等。

第二種:經過PHP-SDK的方式

這種感受符合個人須要,能夠直接在PHP端處理登錄後的邏輯,前端能夠寫本身想要的受權打開方式,因此我改用的這一種,首先你須要看一下文檔:http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6

1:下載PHP-SDK開發包(http://open.weibo.com/wiki/SDK),藉助於sdk能讓你減小好多沒必要考慮的東西,因此下載文檔仍是頗有必要的,不過牛逼的你能夠襲擊寫調用方式,畢竟那個文檔寫的也不咋滴,由於他的代碼風格並非按照PHP PSR(http://www.kancloud.cn/thinkphp/php-fig-psr/3140)規範去寫的,感受很不專業,畢竟是讓別人看的東西,規範是很重要的,至少不會挨那麼多罵,哈哈!題外話啊!下面看看他的代碼,你就該想吐槽了。。。。(換行方式,縮進,if 規範.. 不能忍)

值得注意的是你要記住本身的app id 與key,而後在sdk中換成本身的id

2:前端open登錄受權頁面,我是直接經過打開窗口的方式:

1 function oauthLogin() {
2      var A = window.open("http://***/public/tencentopen.html", "TencentLogin", "width=755, height=550,left=300px,top=60px,menubar=0,scrollbars=1,resizable=1,status=1,titlebar=0,toolbar=0,location=1");
3 }

請求地址的處理邏輯:

 1     /**
 2      * 微博打開登錄認證頁面
 3      * code:5000004
 4      * time:2016.4.28
 5      */
 6     public function weiboopen()
 7     {
 8         include_once('weiboOauth/config.php' );
 9         include_once('weiboOauth/saetv2.ex.class.php');
10 
11         $weiboObj = new \SaeTOAuthV2(WB_AKEY, WB_SKEY );
12         $code_url = $weiboObj->getAuthorizeURL(WB_CALLBACK_URL);
13 
14         header("Location:" . $code_url);
15     }

3:用戶點擊微博登錄後的認證返回邏輯:

    /**
     * 執行微博認證
     * code:5000005
     * time:2016.4.28
     */
    public function weibooauth()
    {
        include_once('weiboOauth/config.php' );
        include_once('weiboOauth/saetv2.ex.class.php' );

        $weiboObj = new \SaeTOAuthV2(WB_AKEY, WB_SKEY);

        if (isset($_REQUEST['code'])) {
            $keys = array();
            $keys['code'] = $_REQUEST['code'];
            $keys['redirect_uri'] = WB_CALLBACK_URL;
            try {
                $token = $weiboObj->getAccessToken('code', $keys) ;
            } catch (OAuthException $e) {}
        }

        $succ['code'] = '100';
        $succ['message'] = '受權成功';

        $erro['code'] = '101';
        $erro['message'] = '受權失敗';

        if(empty($token)) {
            $msg = $erro;
        } else {
            $saeObj = new \SaeTClientV2(WB_AKEY, WB_SKEY, $token['access_token']);
            $user_info = $saeObj->show_user_by_id($token['uid']);
            $ret = $this->oauthLogin($user_info, 'weibo');

            //受權失敗
            if(empty($ret)) {
                $msg = $erro;
            } else {
                session('olas_access_token', $token['access_token']);
                $msg = $succ;
            }
        }

        $this->assign('msg', $msg);
        $this->display('oauth');
    }

4:受權成功之後:

  成功之後,你會把用戶的信息寫入到數據庫,微博登錄會返回用戶的暱稱,頭像信息(各個版本大小的頭像),用戶的性別等等,還有很是用戶的用戶uid,這個很是重要的,下次登錄會檢查這個UID是否是經過微博登錄過。這個和騰訊的不同,騰訊的不反回UID而是一個openid,不過性質是同樣的,待會我會介紹。

以後返回打開窗口的狀態碼,刷新父頁面進行跳轉。

 1 $(document).ready(function(){
 2       if($.trim($("#code").val()) == '100') {
 3              $('#bodys').html("<div>受權成功,正在跳轉 . . .</div>");
 4              setTimeout("changewindows();", 800);
 5       } else {
 6               $('#bodys').html("<div style='color:red;'>受權失敗,請重試!</div>");
 7       }
 8 });
 9 function changewindows(){
10       window.opener.location.href = 'http://**';
11       window.close();
12 }

    能夠了經過SDK中SaeTClientV2中的show_user_by_id就能夠獲得用戶的信息了。你還能夠看到那個Sae***由於這個PHP版本是SAE部門維護的,因此只SAE開頭的。步驟挺簡單的,你們能夠認證閱讀他的開發文檔,反覆調試應該不成問題。我看SDK是對微博開發文檔的封裝:OAuth2/authorizeOAuth2/access_tokenOAuth2/get_token_infoOAuth2/revokeoauth2OAuth2/get_oauth2_token

若是你在接入中有什麼問題你能夠直接聯繫我

QQ登錄

  使用QQ登錄也是很常見的,畢竟使用QQ的人多啊!使用QQ就必須按照人家的規範來,否則人家不給受權啊!下面是步驟:

1:和微博同樣,首先要申請使用QQ互聯,網址:http://connect.qq.com/manage/index 。首先建立應用,審覈經過,不經過也可使用,不過有限制,好像只能使用你本身的帳號登錄,以下圖:

 

2:一旦經過審覈之後你就能夠添加和修改本身網站的一些登錄信息,點擊 應用基本信息,這裏要特別注意回調地址,由於一旦寫錯不能進行受權認證,因此回調地址要特別的注意,我在接入的時候就是一直報錯。還有一個要注意的是添加協做者,這個能夠用做測試,頗有用的。下面是我本身的網站添加的信息,你們能夠瞅瞅,不過關鍵信息我已經抹去了,隱私嘛。

3:上面的進行完以後,你就能夠下載sdk了(http://wiki.connect.qq.com/sdk%E4%B8%8B%E8%BD%BD),我下的是PHP-sdk,下載後把他放在根目錄就能夠了。而後本地訪問配置(主要是配置本身的應用信息),它上面有一個例子,直接能夠調用的那種

而後直接js打開受權頁,頁面地址請求到後臺的方法:

 1     /**
 2      * qq打開登錄認證頁面
 3      * code:5000006
 4      * time:2016.4.24
 5      */
 6  public function tencentopen()
 7  {
 8      include_once("tencentOauth/qqConnectAPI.php");
 9      $qc = new \QC();
10      $qc->qq_login();
11  }

受權成功之後要再次初始化那個sdk類:感受這是他的BUG,必須拿上一次登錄返回的acs和open_id去初始化QC從新獲得用戶的信息。

1  //申請開發$openid
2  $obj = new \QC();
3  $acs = $obj->qq_callback();
4  $openid = $obj->get_openid();
5 
6  //從新賦值,獲得用戶信息
7  $qc = new \QC($acs, $openid);
8  $user_info = $qc->get_user_info();

完整的代碼以下:

 1     /**
 2      * qq登錄認證邏輯
 3      * code:5000007
 4      * time:2016.4.24
 5      */
 6     public function oauth()
 7     {
 8         include_once("tencentOauth/qqConnectAPI.php");
 9 
10         //申請開發$openid
11         $obj = new \QC();
12         $acs = $obj->qq_callback();
13         $openid = $obj->get_openid();
14 
15         //從新賦值,獲得用戶信息
16         $qc = new \QC($acs, $openid);
17         $user_info = $qc->get_user_info();
18 
19         $succ['code'] = '100';
20         $succ['message'] = '受權成功';
21 
22         $erro['code'] = '101';
23         $erro['message'] = '受權失敗';
24 
25         $msg = [];
26         if(empty($user_info)) {
27             $msg = $erro;
28         } else {
29             $user_info['openid'] = $openid;
30             $user_info['appid'] = C('QQ_APPID');
31             $ret = $this->oauthLogin($user_info, 'tencent');
32             
33             //受權失敗
34             if(empty($ret)) {
35                 $msg = $erro;
36             } else {
37                 $msg = $succ;
38             }
39         }
40 
41         $this->assign('msg', $msg);
42         $this->display('oauth');
43     }

這裏要注意QQ和微博返回用戶的ID是不同的,微博返回的就是用戶在微博的真實id,可是QQ不是。他返回的是qq號對應的一個open_Id,感受騰訊有點扯淡,這直接致使,你沒法獲得登錄者的QQ號,有點悲哀,只獲得一個和QQ號一一對應的open_id,也算不錯了,哎!

好了,到這裏基本上把微博和QQ的登錄說完了,期間或遇到各類的問題,好比回調地址失敗,登錄以後刷新父頁面跳轉等等,設計到各類的用戶體驗。

若是你們在添加的時候遇到解決不了的問題能夠Q我,我會的我必定給你說,你們共同提升嘛,另外上面說的不對的您能夠經過評論告訴我,共同進步嘛。

注意:
一、本博客同步更新到個人我的網站:http://www.zhaoyafei.cn
二、本文屬原創內容,爲了尊重他人勞動,轉載請註明本文地址:
http://www.cnblogs.com/zyf-zhaoyafei/p/5449776.html
相關文章
相關標籤/搜索