摘要:關于接入微博登錄的代碼實現今天嘗試使用了微博登錄的接口,也是即將使用接入微信登錄,登錄,手機號登錄用戶名登錄等支持多種操作的問題微博的接口特別簡單明了,文檔也挺清晰的。
關于接入微博登錄的代碼實現
今天嘗試使用了微博登錄的接口,也是即將使用接入微信登錄,QQ登錄,手機號登錄、用戶名登錄等支持多種操作的問題
微博的接口特別簡單明了,文檔也挺清晰的。
采用了OAuth2.0 的方式
請求授權 - 獲取code - 使用token獲取access_token+uid - 使用access_token+uid 獲取用戶的信息
操作流程如下:
1) 申請網站接入
http://open.weibo.com/connect - 立即創建 - 應用地址填寫你的本地測試的地址即可,其他都是正常操作
2) 使用文檔操作
http://open.weibo.com/wiki/%E... - 文檔中心
http://open.weibo.com/wiki/Co... - 微博登錄詳情
http://open.weibo.com/wiki/2/... - 獲取用戶信息接口
3) 代碼實現
我這里沒有使用自帶的微博 phpsdk
使用了https://github.com/guzzle/guzzle 來模擬請求
為了可擴展性接入其他支付,我公用了一個配置文件
return [ "log" => [ "file" =>storage_path("logs/login/".date("Y-m-d") . ".php") ], "weibo" => [ // 微博登錄相關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" ] ];
相關配置url 采用sprintf的方式進行拼接
核心代碼如下:
控制器代碼 -
namespace AppHttpControllersAuth; use AppHttpTraitsLoginWeiboHandler; use IlluminateHttpRequest; class LoginWeiboController extends BaseController { use LoginWeiboHandler; /** * 微博登錄 * 調起微博登錄 - 獲取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); // 執行登錄操作 $this->store($uid,"weibo",$userInfo); } }
實現類代碼 -
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"); } /** * 設置 獲取 code的url * @return string */ public function setWbCodeUrl() { $url = sprintf($this->getCodeUrl,$this->key,$this->host); return $url; } /** * @param $code string 授權后取得的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已經失效" ]); } 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){ // 處理錯誤 throw new LoginException([ "message" => "請求微博客戶端出現問題,請選擇更換登錄方式" ]); } return json_decode($res,true); } }
4) 代碼分析
控制器代碼中,方法 getCode 用來調去微博登錄,他會進入到請求授權的界面,當你授權第一次后或者保持登錄后,會直接忽略授權頁面,直接返回code。
代碼中有個邏輯,一個是喚起登錄;一個是處理code,再次調用獲取access_token + uid
當code不存在時,表明當前需要請求授權,使用getCode方法,這個方法采用的是GET請求,會自動返回一個string信息,通過你傳遞的 redirect_uri 來決定返回到哪個頁面(redirect_uri再我的應用-應用信息-高級信息中可以看到) ,
所以需要使用重定向的方式來獲取數據
code存在時,使用 setGetWbAccessToken 方法獲取 access_token + uid的值,setGetWbAccessToken 方法采用post請求,返回的是一個json參數,需要自己轉義,不會自動重定向,直接返回數據
access_token 、code 是動態的 uid是唯一的
獲取 access_token 請求用戶信息接口,getUserInfo,使用GET方法傳遞兩個值即可,如果請求報錯,容易出現錯誤,期待使用錯誤捕獲
關于用戶表的設計,以及多字段登錄的方式和方法我會再明天發出來
轉載請聯系本人,唯一原創
來自于: http://surest.cn/article/46
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29592.html
摘要:本人長期出售超大量微博數據旅游網站評論數據,并提供各種指定數據爬取服務,。如果用戶傳入偽造的,則新浪微博會返回一個錯誤。 PS:(本人長期出售超大量微博數據、旅游網站評論數據,并提供各種指定數據爬取服務,Message to YuboonaZhang@Yahoo.com。由于微博接口更新后限制增大,這個代碼已經不能用來爬數據了。如果只是為了收集數據可以咨詢我的郵箱,如果是為了學習爬蟲,...
摘要:本人長期出售超大量微博數據旅游網站評論數據,并提供各種指定數據爬取服務,。如果用戶傳入偽造的,則新浪微博會返回一個錯誤。 PS:(本人長期出售超大量微博數據、旅游網站評論數據,并提供各種指定數據爬取服務,Message to YuboonaZhang@Yahoo.com。由于微博接口更新后限制增大,這個代碼已經不能用來爬數據了。如果只是為了收集數據可以咨詢我的郵箱,如果是為了學習爬蟲,...
摘要:微博登錄是最常用的第三方賬號登錄之一。當前狀態是未提交審核,待你開發完了上線后,提交微博審核,審核通過后即可正常使用。集成微博登錄首先簡介一下,第三方登錄開發的流程。文件是首頁,其實他的唯一作用就是產生一個微博登錄跳轉鏈接。 微博登錄是最常用的第三方賬號登錄之一。由于其網站用戶量大,可操作接口功能多,所以受到很多開發者的青睞。 既然是第三方,如果想使用它們的賬號進行登錄,那么第一步就應...
閱讀 1166·2021-11-11 16:55
閱讀 3052·2021-08-16 11:00
閱讀 2895·2019-08-30 15:56
閱讀 3435·2019-08-30 11:24
閱讀 3416·2019-08-30 11:05
閱讀 3531·2019-08-29 15:15
閱讀 2615·2019-08-26 13:57
閱讀 2554·2019-08-23 18:17