成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

wushuiyong / 444人閱讀

摘要:關(guān)于接入微博登錄的代碼實(shí)現(xiàn)今天嘗試使用了微博登錄的接口,也是即將使用接入微信登錄,登錄,手機(jī)號(hào)登錄用戶名登錄等支持多種操作的問題微博的接口特別簡(jiǎn)單明了,文檔也挺清晰的。

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

今天嘗試使用了微博登錄的接口,也是即將使用接入微信登錄,QQ登錄,手機(jī)號(hào)登錄、用戶名登錄等支持多種操作的問題

微博的接口特別簡(jiǎn)單明了,文檔也挺清晰的。

采用了OAuth2.0 的方式

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

操作流程如下:

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

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

2) 使用文檔操作

http://open.weibo.com/wiki/%E... - 文檔中心

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

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

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

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

使用了https://github.com/guzzle/guzzle 來模擬請(qǐng)求

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

    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 AppHttpControllersAuth;
   
    use AppHttpTraitsLoginWeiboHandler;
    use IlluminateHttpRequest;
    
    class LoginWeiboController extends BaseController
    {
        use LoginWeiboHandler;
    
        /**
         * 微博登錄
         * 調(diào)起微博登錄 - 獲取code - 攜帶code請(qǐng)求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 AppHttpTraits;
    use GuzzleHttpClient;
    use GuzzleHttpExceptionClientException;
    use AppExceptionsLoginException;
    
    /**
     * 處理微博登錄邏輯
     * Class LoginWeiboHandler
     * @package AppHttpTraits
     */
    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){
                // 處理錯(cuò)誤
                throw new LoginException([
                    "message" => "CODE已經(jīng)失效"
                ]);
            }
            return json_decode($res,true);
        }
    
        /**
         * 獲取code
         * @return IlluminateHttpRedirectResponse
         */
        public function getCode()
        {
            $getCodeUrl = $this->setWbCodeUrl();
            return redirect()->away($getCodeUrl);
        }
    
        /**
         * 獲取用戶信息接口
         * @param $access_token
         * @param $uid
         * @return mixed
         * @throws LoginException
         * @throws GuzzleHttpExceptionGuzzleException
         */
        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){
                // 處理錯(cuò)誤
                throw new LoginException([
                    "message" => "請(qǐng)求微博客戶端出現(xiàn)問題,請(qǐng)選擇更換登錄方式"
                ]);
            }
            return json_decode($res,true);
    
        }
    }

4) 代碼分析

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

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

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

code存在時(shí),使用 setGetWbAccessToken 方法獲取 access_token + uid的值,setGetWbAccessToken 方法采用post請(qǐng)求,返回的是一個(gè)json參數(shù),需要自己轉(zhuǎn)義,不會(huì)自動(dòng)重定向,直接返回?cái)?shù)據(jù)

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

獲取 access_token 請(qǐng)求用戶信息接口,getUserInfo,使用GET方法傳遞兩個(gè)值即可,如果請(qǐng)求報(bào)錯(cuò),容易出現(xiàn)錯(cuò)誤,期待使用錯(cuò)誤捕獲


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

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

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29592.html

相關(guān)文章

  • 利用新浪API實(shí)現(xiàn)數(shù)據(jù)抓取微博數(shù)據(jù)爬取微博爬蟲

    摘要:本人長(zhǎng)期出售超大量微博數(shù)據(jù)旅游網(wǎng)站評(píng)論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務(wù),。如果用戶傳入偽造的,則新浪微博會(huì)返回一個(gè)錯(cuò)誤。 PS:(本人長(zhǎng)期出售超大量微博數(shù)據(jù)、旅游網(wǎng)站評(píng)論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務(wù),Message to [email protected]。由于微博接口更新后限制增大,這個(gè)代碼已經(jīng)不能用來爬數(shù)據(jù)了。如果只是為了收集數(shù)據(jù)可以咨詢我的郵箱,如果是為了學(xué)習(xí)爬蟲,...

    liuyix 評(píng)論0 收藏0
  • 利用新浪API實(shí)現(xiàn)數(shù)據(jù)抓取微博數(shù)據(jù)爬取微博爬蟲

    摘要:本人長(zhǎng)期出售超大量微博數(shù)據(jù)旅游網(wǎng)站評(píng)論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務(wù),。如果用戶傳入偽造的,則新浪微博會(huì)返回一個(gè)錯(cuò)誤。 PS:(本人長(zhǎng)期出售超大量微博數(shù)據(jù)、旅游網(wǎng)站評(píng)論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務(wù),Message to [email protected]。由于微博接口更新后限制增大,這個(gè)代碼已經(jīng)不能用來爬數(shù)據(jù)了。如果只是為了收集數(shù)據(jù)可以咨詢我的郵箱,如果是為了學(xué)習(xí)爬蟲,...

    vslam 評(píng)論0 收藏0
  • Yii2集成第三方微博登錄(包含賬號(hào)申請(qǐng)、建表和常用業(yè)務(wù)邏輯全套流程)

    摘要:微博登錄是最常用的第三方賬號(hào)登錄之一。當(dāng)前狀態(tài)是未提交審核,待你開發(fā)完了上線后,提交微博審核,審核通過后即可正常使用。集成微博登錄首先簡(jiǎn)介一下,第三方登錄開發(fā)的流程。文件是首頁,其實(shí)他的唯一作用就是產(chǎn)生一個(gè)微博登錄跳轉(zhuǎn)鏈接。 微博登錄是最常用的第三方賬號(hào)登錄之一。由于其網(wǎng)站用戶量大,可操作接口功能多,所以受到很多開發(fā)者的青睞。 既然是第三方,如果想使用它們的賬號(hào)進(jìn)行登錄,那么第一步就應(yīng)...

    EdwardUp 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<