關(guān)于接入微博登錄的代碼實(shí)現(xiàn)

今天嘗試使用了微博登錄的接口浆竭,也是即將使用接入微信登錄胁出,QQ登錄迫悠,手機(jī)號登錄谆趾、用戶名登錄等支持多種操作的問題

微博的接口特別簡單明了携添,文檔也挺清晰的嫁盲。

采用了OAuth2.0 的方式

請求授權(quán) - 獲取code - 使用token獲取access_token+uid - 使用access_token+uid 獲取用戶的信息

操作流程如下:

  1. 申請網(wǎng)站接入

    http://open.weibo.com/connect - 立即創(chuàng)建 - 應(yīng)用地址填寫你的本地測試的地址即可,其他都是正常操作

  2. 使用文檔操作

    http://open.weibo.com/wiki/%E9%A6%96%E9%A1%B5 - 文檔中心

    http://open.weibo.com/wiki/Connect/login - 微博登錄詳情

    http://open.weibo.com/wiki/2/users/show - 獲取用戶信息接口

  3. 代碼實(shí)現(xiàn)

    我這里沒有使用自帶的微博 phpsdk

    使用了https://github.com/guzzle/guzzle 來模擬請求

    為了可擴(kuò)展性接入其他支付烈掠,我公用了一個配置文件

     return [
         'log' => [
             'file' =>storage_path('logs/login/'.date('Y-m-d') . '.php')
         ],
        'weibo' => [
            // 微博登錄相關(guān)key
            'w_key' => ENV('W_KEY',''),
            'w_secret' => ENV('W_SECRET',''),
            'w_get_code_url' => 'https://api.weibo.com/oauth2/authorize?client_id=%d&response_type=code&redirect_uri=%s',
            'w_get_access_token_url' => 'https://api.weibo.com/oauth2/access_token?client_id=%d&client_secret=%s&grant_type=authorization_code&redirect_uri=%s&code=%s',
            'w_user_url' => 'https://api.weibo.com/2/users/show.json'
        ]
     ];
    

    相關(guān)配置url 采用sprintf的方式進(jìn)行拼接


    核心代碼如下:

    控制器代碼 -

     namespace App\Http\Controllers\Auth;
    
     use App\Http\Traits\LoginWeiboHandler;
     use Illuminate\Http\Request;
     
     class LoginWeiboController extends BaseController
     {
         use LoginWeiboHandler;
     
         /**
          * 微博登錄
          * 調(diào)起微博登錄 - 獲取code - 攜帶code請求accessToken - 攜帶token獲取用戶信息
          */
         public function login(Request $request)
         {
             $code = $request->code;
             if (!$code) {
                 return $this->getCode();
             }
             $result = $this->setGetWbAccessToken($code);
             $access_token = $result['access_token'];
             $uid = $result['uid'];
             return $this->user($access_token,$uid);
             // 獲取用戶信息
     
         }
     
         public function user($access_token,$uid)
         {
             $userInfo = $this->getUserInfo($access_token,$uid);
             // 執(zhí)行登錄操作
             $this->store($uid,'weibo',$userInfo);
         }
     
     }
    

    實(shí)現(xiàn)類代碼 -

     namespace App\Http\Traits;
     use GuzzleHttp\Client;
     use GuzzleHttp\Exception\ClientException;
     use App\Exceptions\LoginException;
     
     /**
      * 處理微博登錄邏輯
      * Class LoginWeiboHandler
      * @package App\Http\Traits
      */
     trait LoginWeiboHandler
     {
         private $key;
         private $secret;
         private $getCodeUrl;
         private $getAccessTokenUrl;
         private $host;
         private $client;
     
         public function __construct()
         {
             $this->client = new Client();
             $this->key = config('login.weibo.w_key');
             $this->secret = config('login.weibo.w_secret');
             $this->getCodeUrl = config('login.weibo.w_get_code_url');
             $this->getAccessTokenUrl = config('login.weibo.w_get_access_token_url');
             $this->host = route('login.weibo');
         }
     
         /**
          * 設(shè)置 獲取 code的url
          * @return string
          */
         public function setWbCodeUrl()
         {
             $url = sprintf($this->getCodeUrl,$this->key,$this->host);
             return $url;
         }
     
         /**
          * @param $code string 授權(quán)后取得的code值
          */
         public function setGetWbAccessToken($code)
         {
             if( !$code ) {
                 throw new LoginException([
                     'message' => 'CODE不存在'
                 ]);
             }
             $url = sprintf($this->getAccessTokenUrl,$this->key,$this->secret,$this->host,$code);
             try{
                 $res = $this->client->request('POST',$url)->getBody();
             }catch (ClientException $e){
                 // 處理錯誤
                 throw new LoginException([
                     'message' => 'CODE已經(jīng)失效'
                 ]);
             }
             return json_decode($res,true);
         }
     
         /**
          * 獲取code
          * @return \Illuminate\Http\RedirectResponse
          */
         public function getCode()
         {
             $getCodeUrl = $this->setWbCodeUrl();
             return redirect()->away($getCodeUrl);
         }
     
         /**
          * 獲取用戶信息接口
          * @param $access_token
          * @param $uid
          * @return mixed
          * @throws LoginException
          * @throws \GuzzleHttp\Exception\GuzzleException
          */
         public function getUserInfo($access_token,$uid)
         {
             $arr = [
                 'access_token' => $access_token,
                 'uid' => $uid
             ];
     
             $url = config('login.weibo.w_user_url') . '?' .http_build_query($arr);
             $res = $this->client->request('GET',$url);
             try{
                 $res = $this->client->request('GET',$url)->getBody();
             }catch (ClientException $e){
                 // 處理錯誤
                 throw new LoginException([
                     'message' => '請求微博客戶端出現(xiàn)問題羞秤,請選擇更換登錄方式'
                 ]);
             }
             return json_decode($res,true);
     
         }
     }
    
  4. 代碼分析

    控制器代碼中,方法 getCode 用來調(diào)去微博登錄左敌,他會進(jìn)入到請求授權(quán)的界面瘾蛋,當(dāng)你授權(quán)第一次后或者保持登錄后,會直接忽略授權(quán)頁面矫限,直接返回code哺哼。

    代碼中有個邏輯,一個是喚起登錄叼风;一個是處理code取董,再次調(diào)用獲取access_token + uid

    當(dāng)code不存在時,表明當(dāng)前需要請求授權(quán)无宿,使用getCode方法茵汰,這個方法采用的是GET請求,會自動返回一個string信息孽鸡,通過你傳遞的 redirect_uri 來決定返回到哪個頁面(redirect_uri再我的應(yīng)用-應(yīng)用信息-高級信息中可以看到) 蹂午,
    所以需要使用重定向的方式來獲取數(shù)據(jù)

    code存在時,使用 setGetWbAccessToken 方法獲取 access_token + uid的值彬碱,setGetWbAccessToken 方法采用post請求画侣,返回的是一個json參數(shù),需要自己轉(zhuǎn)義堡妒,不會自動重定向配乱,直接返回?cái)?shù)據(jù)

    access_token 、code 是動態(tài)的 uid是唯一的

    獲取 access_token 請求用戶信息接口皮迟,getUserInfo搬泥,使用GET方法傳遞兩個值即可,如果請求報(bào)錯伏尼,容易出現(xiàn)錯誤忿檩,期待使用錯誤捕獲


關(guān)于用戶表的設(shè)計(jì),以及多字段登錄的方式和方法我會再明天發(fā)出來

轉(zhuǎn)載請聯(lián)系本人爆阶,唯一原創(chuàng)

來自于: http://surest.cn/article/46

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末燥透,一起剝皮案震驚了整個濱河市沙咏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌班套,老刑警劉巖肢藐,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吱韭,居然都是意外死亡吆豹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門理盆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痘煤,“玉大人,你說我怎么就攤上這事猿规≈钥欤” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵姨俩,是天一觀的道長烦磁。 經(jīng)常有香客問我,道長哼勇,這世上最難降的妖魔是什么都伪? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮积担,結(jié)果婚禮上陨晶,老公的妹妹穿的比我還像新娘。我一直安慰自己帝璧,他們只是感情好先誉,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著的烁,像睡著了一般褐耳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上渴庆,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天铃芦,我揣著相機(jī)與錄音,去河邊找鬼襟雷。 笑死刃滓,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的耸弄。 我是一名探鬼主播咧虎,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼计呈!你這毒婦竟也來了砰诵?” 一聲冷哼從身側(cè)響起征唬,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茁彭,沒想到半個月后总寒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尉间,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年偿乖,在試婚紗的時候發(fā)現(xiàn)自己被綠了击罪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哲嘲。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖媳禁,靈堂內(nèi)的尸體忽然破棺而出眠副,到底是詐尸還是另有隱情,我是刑警寧澤竣稽,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布囱怕,位于F島的核電站,受9級特大地震影響毫别,放射性物質(zhì)發(fā)生泄漏娃弓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一岛宦、第九天 我趴在偏房一處隱蔽的房頂上張望台丛。 院中可真熱鬧,春花似錦砾肺、人聲如沸挽霉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侠坎。三九已至,卻和暖如春裙盾,著一層夾襖步出監(jiān)牢的瞬間实胸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工番官, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留童芹,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓鲤拿,卻偏偏與公主長得像假褪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子近顷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理生音,服務(wù)發(fā)現(xiàn)宁否,斷路器,智...
    卡卡羅2017閱讀 134,707評論 18 139
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,034評論 0 2
  • 在分布式環(huán)境中缀遍,如何支持PC慕匠、APP(ios、android)等多端的會話共享域醇,這也是所有公司都需要的解決方案台谊,用...
    安琪拉_4b7e閱讀 1,734評論 2 7
  • 人之所以活得累锅铅,是因?yàn)橄氲锰唷I眢w累不可怕减宣,可怕的是心累盐须。每個人都有被他人牽累,為自己負(fù)累的時候漆腌,只不過有些人會...
    哈哈樓哈哈閱讀 136評論 0 0
  • 咖啡之于我主要就是功能型飲料贼邓。一開始是為了提神,口味上喜歡喝牛奶和咖啡的交融口感闷尿,比如拿鐵和卡布奇諾塑径,不希望放糖。...
    William孫筱奇閱讀 930評論 1 4