Jex’s Note

PHP 微博登入 Oauth

申請

  • 微博申請非常的麻煩, 需要負責人的身份證件等等, 過關後才可以申請網站服務

  • 在申請前最好先了解 “我的應用” 及 “我的網站” 的差異, 再申請適合你網站的服務

1) 如果你的網站純粹只是要串接微博登入, 就選擇我的網站 2) 我的應用是給如手機登入或是如 facebook app 那樣的去申請

申請我的網站

[1] 申請

  • 開發平台頁面 點擊 管理中心 -> 我的網站 -> 添加網站 (接下來審核的步驟可以先略過)
  • 網站名稱可以先隨便寫,而網站域名必須為已經註冊的域名 (EX : www.example.com 以下均用此 domain 當例子)
  • 添加網站成功後,會得到 App Key 和 App Secret ,這兩個程式裡所需要的參數

[2] 網站信息 -> 高級信息, 在安全設置裡面,填寫網站的域名: www.example.com 及 IP: 127.0.0.1

[3] 網站信息 -> 測試賬號, 設置一個管理賬號

[4] 將域名綁定到 127.0.0.1

  • 因為在做 Oauth 回來後會導向你自己設定的 callback_url, 而這個 callback_url 的域名也是你在步驟 [1] 所申請的, 如果你沒有將這個域名在本機導向 127.0.0.1 的話, 就沒辦法完成剩下的步驟

  • 在本機的 C:\Windows\System32\Drivers\etc\host 檔案加上 127.0.0.1 www.example.com

[5] 審核

  • 如果網站還在開發階段, 可以先不用認證, 在本機開發不會有問題
  • 如果你的網站準備要開始上線了, 就可以送出認證了, 大概要3天左右

申請我的應用

在開發階段要記得在 管理中心 -> 應用信息 -> 測試帳號 新增帳號, 否則在 Oauth 時會得到 applications over the unaudited use restrictions 這樣的錯誤

注意:修改後約半小時左右時間生效

管理中心->應用信息->高級信息設置好授權回調頁(連結要與 callback_url 一樣)

否則會得到 error:redirect_uri_mismatch 這樣的錯誤訊息

補充申請手機 app

  • 資料可先隨便填
  • 記得加回調頁 (高級信息) : https://api.weibo.com/oauth2/default.html
  • 測試帳號也要加上自已的微博帳號
  • 手機只需用 APP Key 就可以從 weibo login 取得 token, 然後可以傳給 server, 而 server 可以直接使用網站的 App Key 及 Secret 做登入判別, 也就是說從 weibo 建立 app 不管是網站還是手機, 取得的 token 是可以相通的

在做之前先了解登入 Oauth 流程

[1] 在頁面上放置一個登入按鈕, 而按鈕的 link 導向你自己的某一隻程式 [2] 判斷是否己登入過 (檢查 token), 如果未登入就導向微博 Oauth 頁面, 成功後即可取得 token [3] 就可以利用 token 拿你想拿的使用者資料

開始動手做 (程式碼部份)

首先下載微博 php sdk github

設定好 config 方便開發 :

$config['app_id']           = (填上 app_id)
$config['secret']           = (填上 secret)
$config['callback_url']     = (填上 callback_url)

此頁檢查 token 是否存在, 如果沒有代表未登入

引入微博 PHP SDK, 並建立物件:

require 'saetv2.ex.class.php';
$weiboOauth = new SaeTOAuthV2($config["app_id"], $config["secret"]);

取得登入及授權 url, 並且導向過去:

$weiboOauth->getAuthorizeURL($config["callback_url"])

User 會被要求登入及授權, 如果通過的話, 會導向 callback_url, 並且網址後面會帶 GET : code=一串亂數

callback_url 網址的那一隻程式

取得 token :

require 'saetv2.ex.class.php';
$weiboOauth = new SaeTOAuthV2($config["app_id"], $config["secret"]);

$code = $_GET['code'];
if ($code)
{
    $keys = array();
    $keys['code'] = $code;
    $keys['redirect_uri'] = $config["callback_url"];
    try
    {
        $token = $weiboOauth->getAccessToken('code', $keys);
    }
    catch (OAuthException $e)
    {
        log_message('info', $e->getMessage());
    }
}

建議將 token 存到 SESSION, 方便下次判斷是否已登入及授權

取得 user 資料 (將 token 帶入):

if (is_array($token))
{
    $weiboClient = new saeTClientV2($config["app_id"], $config["secret"], $token['access_token']);
    $user_data = $weiboClient->show_user_by_id($token['uid']);
    if ( ! empty($user_data['error']))
    {
        log_message('info', "Weibo Error: {$user_data['error']}");
    }
}

User data 的值如下 :

array (
  'id' => 3865801255,                    #用戶UID
  'idstr' => '3865801255',
  'class' => 1,
  'screen_name' => 'jex_lin',            #微博暱稱
  'name' => 'jex_lin',                   #友好顯示名稱,同微博暱稱
  'province' => '400',                   #省份編碼(參考省份編​​碼表)
  'city' => '4',                         #城市編碼(參考城市編碼表)
  'location' => '海外 俄罗斯',            #所在地
  'description' => '',                   #個人描述
  'url' => '',                           #用戶博客地址
  'profile_image_url' => 'http://tp4.sinaimg.cn/3865801255/50/0/1',      #自定義圖像
  'profile_url' => 'u/3865801255',
  'domain' => '',                        #用戶個性化URL
  'weihao' => '',
  'gender' => 'm',                       #性別,m--男,f--女,n--未知
  'followers_count' => 15,               #粉絲數
  'friends_count' => 23,                 #關注數
  'statuses_count' => 0,                 #微博數
  'favourites_count' => 0,               #收藏數
  'created_at' => 'Mon Oct 21 11:48:34 +0800 2013',                      #創建時間
  'following' => false,                  #是否已關注(此特性暫不支持)
  'allow_all_act_msg' => false,
  'geo_enabled' => true,
  'verified' => false,                   #加V標示,是否微博認證用戶
  'verified_type' => -1,
  'remark' => '',
  'ptype' => 0,
  'allow_all_comment' => true,
  'avatar_large' => 'http://tp4.sinaimg.cn/3865801255/180/0/1',
  'avatar_hd' => 'http://tp4.sinaimg.cn/3865801255/180/0/1',
  'verified_reason' => '',
  'follow_me' => false,
  'online_status' => 1,
  'bi_followers_count' => 1,
  'lang' => 'zh-cn',
  'star' => 0,
  'mbtype' => 0,
  'mbrank' => 0,
  'block_word' => 0,
)
  • Fb 帳號若沒有 active, 會直接在 fb 頁面顯示錯誤訊息, 微博則無法判斷
  • 如果你的基本資料所在地填國外(Ex: 俄羅斯), 但返回的 lang 並不是 ru-ru, 因為 lang 並不是指你的所在地, 而是你微博頁面顯示的語言, 例如調成繁體中文, 帶回來的 ‘lang’ => ‘zh-tw’
  • 注意!! 選擇英文, ‘lang’ => ‘en’, 並不是我們熟悉的 en-us
  • FB 在這方面也一樣, 會依照網頁上顯示的語言帶不同的語言碼回來, ex : 語言選日語 ‘locale’ => ‘ja_JP’

登出微博 :

以下連結加上 token ($token[‘access_token’])

https://api.weibo.com/2/account/end_session.json?access_token=2.00JVVcNE0O_NXn3b7d524c0cl3ekeD

會返回同 get_user_data 的基本資料

使用不同帳號登入

如果使用者已登入過微博並且也已經 Oauth 過了, 程式將使用者導到登入 Oauth 的頁面, 如果 token 沒過期, 微博並不會再次要求登入 Oauth, 因為它會當你已經認證過了, 而直接導到帶入的 callback_url, 這是正常的, 但是有時候需要讓使用者直接切換帳號登入 Oauth 的話, 如果要求使用者先到微博登出, 那不就太不方便了嗎?

微博提供的作法是只要在授權連結上添加forcelogin參數,將forcelogin參數設置為true, 就可以達到強制再次做登入 Oauth

$weiboOauth->getAuthorizeURL($config["callback_url"]) . '&forcelogin=true';

ref : http://open.weibo.com/wiki/Direct_messages/new 官方 Q&A - 接口問題 http://www.oooink.com/blog/find/c/47 http://open.weibo.com/qa/index.php?qa=1457&qa_1=%E8%AF%B7%E9%97%AE%EF%BC%8C%E5%A6%82%E4%BD%95%E5%9C%A8%E6%9C%AC%E5%9C%B0%E6%B5%8B%E8%AF%95%E6%96%B0%E6%B5%AA%E7%9A%84%E7%99%BB%E5%BD%95%E6%8C%89%E9%92%AE%E7%99%BB%E5%BD%95%E7%AC%AC%E4%B8%89%E6%96%B9%E7%BD%91%E7%AB%99%EF%BC%9F

Comments