2013-08-21 127 views
2

我一直在嘗試了幾天,現在成功地發佈到他們的網站客戶端的Facebook頁面牆時200。我需要能夠做到這一點,而無需登錄的用戶,這點我是能夠實現與要在文檔中提供的URL生成擴展的訪問令牌。Facebook的PHP SDK - 錯誤#試圖用setExtendedAccessToken

我所試圖做的是使用PHP SDK在這個問題來獲取擴展標記 - Facebook PHP SDK: getting "long-lived" access token now that "offline_access" is deprecated,但是我收到以下錯誤: (#200) The user hasn't authorized the application to perform this action

由圖形生成的身份驗證令牌的調試API資源管理器顯示自己的用戶,包括必要的manage_pagesstatus_update範圍。不知道這是相關的 - 但是,如果我跑me/accounts,該perms陣列不會有問題的網頁下的數據列出來。

這裏是我試圖使用的代碼:

$facebook = new Facebook(array('appId' => 'xxxxxxx', 'secret' => 'xxxxxx')); 
    $pageID = 'xxxxxxxx'; 
    $facebook->setExtendedAccessToken(); 
    $accessToken = $facebook->getAccessToken(); 
    try { 
     $page_info = $facebook->api("/$pageID?fields=access_token"); 
     print_r ($page_info); 
    } catch (FacebookApiException $e) { 
      echo $e->getMessage(); 
    } 
    if(!empty($accessToken)) { 
     $args = array(
      'access_token' => $accessToken, 
      'message'  => "Catch phrase!" 
     ); 
     $facebook->api("/$pageID/feed","post",$args); 
    } else { 
     // Handle error 
    } 

UPDATE 我發現,如果我呼應的getAccessToken()輸出端的結果是應用程序ID,並通過|分離的祕密 - 這是我應該接受的嗎?對我來說似乎很奇怪,因爲我看到的所有其他代幣都是隨機的,而且更長。

任何幫助都將不勝感激,我至今浪費在這那麼多時間。它似乎只適用於其他人。

UPDATE 2 嗨,沃倫!看起來你是這些零件的新手,歡迎!感謝您對此的研究,是否需要將這些標記保存到數據庫表中,並檢查每次嘗試發佈時它們是否已過期?我只是張貼到頁面的頁面,顯然這需要在頁面access_token而不是什麼我假設是用戶access_token。我相信我也會在某處閱讀頁面訪問令牌永不過期,但如果我刷新Graph API Explorer頁面或請求新的用戶令牌,它將發生變化。十分不解..不知道是不是我甚至需要處理在此應用程序獲得新令牌或只使用一個頁面access_token出現工作?

+0

嗨我沒有答案,因爲我太尋找相同的解決方案。我發現這使我覺得現在不可能。 https://developers.facebook.com/roadmap/offline-access-removal/如果用戶已經登錄,我可以得到這個工作,但是如果你需要確保它在用戶註銷時工作。 –

回答

0

也只是看base_facebook.php文件,並有以下功能:

/** 
    * Returns the access token that should be used for logged out 
    * users when no authorization code is available. 
    * 
    * @return string The application access token, useful for gathering 
    *    public information about users and applications. 
    */ 
    protected function getApplicationAccessToken() { 
    return $this->appId.'|'.$this->appSecret; 
    } 

顯示你所遇到的功能setExtendedAccessToken()調用getAccessToken()調用它上面的函數裏面做setExtendedAccessToken以下:

$access_token_response = $this->_oauthRequest(
     $this->getUrl('graph', '/oauth/access_token'), 
     $params = array(
      'client_id' => $this->getAppId(), 
      'client_secret' => $this->getAppSecret(), 
      'grant_type' => 'fb_exchange_token', 
      'fb_exchange_token' => $this->getAccessToken(), 
     ) 
    ); 

此函數的返回是然後{ 「錯誤」:{ 「消息」: 「未指定用戶訪問令牌」, 「類型」: 「OAuthException」, 「代碼」:1}},但因爲沒有access_token函數只是返回假

的fb_exchange_token不能是應用程序ID和應用相結合的祕密。

0

我已經做了一些測試,什麼我發現是,如果你讓用戶登錄,你可以到那裏訪問令牌。如果您將此令牌傳遞給setAccessToken,則運行setExtendedToken。如果通過運行getAccessToken保存了toke,則可以在用戶註銷後再使用該令牌。

$facebook->setAccessToken($facebook->getAccessToken()); 
$facebook->setExtendedAccessToken(); 

$access_token = $facebook->getAccessToken(); // save this for later use 

您需要讓用戶登錄才能詢問他們是否有權訪問該帳戶。如果您需要訪問Facebook頁面,請確保他們是管理員並要求提供manage_page權限。

希望這有助於

+0

沃倫,你可以檢查我的問題的更新?感謝您對此的幫助:) – NightMICU

0

從我迄今發現當用戶登錄不會過期,只要你不回來Unix時間戳,所以你就沒有辦法知道時,返回的擴展標記何時到期。

這就是我在我的應用程序中所做的。

要求用戶登錄Facebook並訪問權限除外。使用getAccessToken獲取當前的訪問令牌。通過這個,我傳入getExtendedAccessToken,然後再次運行getAccessToken,最終獲得我存儲在數據庫中的擴展訪問令牌以供以後使用。

0
$facebook = new Facebook(array(
        'appId' => 'YOURAPPID', 
        'secret' => 'YOURSECRET', 
      )); 
$params = array(
         'scope'=>'publish_stream,manage_pages' 

       ); 
$loginUrl = $facebook->getLoginUrl($params); // Use this to request them to login in then when they are do the following you will need them to return to your app 

$facebook = new Facebook(array(
        'appId' => 'YOURAPPID', 
        'secret' => 'YOURSECRET', 
      )); 
$facebook->setAccessToken($facebook->getAccessToken()); 
$facebook->setExtendedAccessToken(); 
$access_token = $facebook->getAccessToken(); // store $access_token for later use