2013-03-12 120 views
0

我已經搜索了很多這個問題,並沒有發現這個問題的具體解決方案。我見過很多例子和所謂的解決方案,但他們都沒有工作。 最重要的是,我正在通過phpacademy觀看視頻並按照視頻進行輸入。

人之前將此標記爲重複我的唯一的問題是

這是因爲我在本地機器上測試這個? 因爲我的設置和視頻之間的唯一區別在於該教程是實時託管的,我正在我的本地計算機中測試該教程。

如果是這樣的話我該如何在我的本地機器上測試PHP的facebook SDK?

這裏是我完整的代碼 這是我的主控制器

if (!defined('BASEPATH')) 
    exit('No direct script access allowed'); 

class Fbapp extends MX_Controller { 


    function __construct() { 
     $this->load->library('fbconnect'); 
     parent::__construct(); 
    } 
    function index() { 


     echo "<a href='" . base_url() . "fbapp/gotofb'>Go To Facebook</a>"; 
    } 

    function gotofb(){ 

     $data = array(
      'redirect_uri' => base_url() . "fbapp/redirected", 
      'scope' => "email,photo_upload" 
     ); 
     $url = $this->fbconnect->getLoginUrl($data); 

    redirect($url); 
    } 

    function redirected(){ 
     $user_id= $this->fbconnect->getUser(); 
     echo $user_id; 

    } 
} 

這是我的庫文件,我有一個名爲「fbconnect.php」,包括圖書館內SDK文件和庫incuded和我創建一個facebook.php裏面的配置存儲appId和祕密,我已經加載爲$配置。

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 


require_once(APPPATH . 'libraries/facebook/src/facebook.php'); 
class Fbconnect extends Facebook{ 

    public $user = null; 

    function __construct() { 
     $ci =& get_instance(); 

     $ci->load->config("facebook", true); 
     $config = $ci->config->item('facebook'); 

     parent::__construct($config); 
    } 

} 

步驟: 1.I訪問我的網址。我點擊鏈接。 2.讓我到facebook的登錄頁面。我登錄。 3.它將我重定向到uri並打印0.

注意:我正在開發codeigniter。 在此先感謝。 任何幫助超級讚賞!

+0

本地主機上的Facebook是一個挑戰。您是否嘗試將代碼上傳到域以將其隔離到本地主機? – 2013-03-12 05:20:41

+0

謝謝!我沒有一個域名尚未主辦我的網站live.I嘗試heroku,但它顯示500內部服務器錯誤。我想因爲codeigniter需要啓用mod_rewrite。代碼在我的本地機器中正常加載。我創建了支持票等待回覆。 – developernaren 2013-03-12 05:27:57

回答

0

我收到了同樣的問題,天˚F搜索我解決它以兩種方式後,如果您能夠確保所有的配置...我認爲你必須要嘗試的解決方案: 1-在虛擬主機服務器上託管你的應用程序,並嘗試使用你將獲得的域名。 2 - 利用javascript SDK,獲取隨後的access_token它傳遞到PHP SKD,像這樣:

   window.fbAsyncInit = function() { 
      FB.init({ 
       appId  : 'appId', // App ID 
       channelUrl : 'channel.html', // Channel File 
       status  : true, // check login status 
       cookie  : true, // enable cookies to allow the server to access the session 
       xfbml  : true // parse XFBML 
      }); 
      // Additional init code here 

      FB.Event.subscribe('auth.login', function(response) { 
      var accessToken = response.authResponse.accessToken; 
      window.location.href = "http://page_to_read_process_the _request?"accessToken="+accessToken; 
     }); 

在PHP你只shoudl這樣做:

$facebook->setAccessToken($accessToken); 
$facebook->getUser(); 

如果這解決您的問題:請不要忘記投票:D

+0

我試圖設置accesstoken和請求,但沒有幫助我在php中做了這個,我用getAccessToken詢問了accesstoken並將它傳遞給了setAccessToken,正如你所提到的,並嘗試了getUser()。仍然沒有運氣..感覺就像我將不得不主持它現場測試正確,無論如何感謝您的幫助。如果這有助於投票你:D – developernaren 2013-03-12 13:21:33

+0

親愛的他們你做了什麼都不會有幫助,我告訴你獲得訪問令牌使用javascript sdk然後傳遞給php頁面,然後從請求中讀取它,最後使用setAccessToken分配它,在這之後你可以詢問有關用戶的任何信息。 – user1028 2013-03-12 16:12:33

+0

我現在確定這是因爲訪問令牌,因爲我傳遞了從開發者網站獲得的靜態訪問令牌,它的工作完美無瑕,但我遇到了問題......這是一個愚蠢的問題..但是,如何觸發FB.Event.subscribe – developernaren 2013-04-14 17:34:37

0

喜@developernaren嘗試在你的庫使用下面的代碼:

<?php 
    if (!defined('BASEPATH')) exit('No direct script access allowed'); 

include(APPPATH.'libraries/facebook/src/facebook.php'); 

class Fb_connect extends Facebook { 

    //declare protected variables 
    protected $user  = NULL; 
    protected $user_id = FALSE; 
      protected $friends  = NULL; 

      //constructor method. 
    public function __construct() 
    { 
       $CI = & get_instance(); 
       $CI->config->load("facebook",TRUE); 
       $config = $CI->config->item('facebook'); 
       parent::__construct($config); 
       $this->user_id = $this->getUser(); 
       if ($this->user_id) { 
        log_message('Info','Userid is fetched!'); 
        try { 
         $this->user = $this->api('/me'); 
         $this->friends = $this->api('/me/friends'); 
        } catch (FacebookApiException $e) { 
         error_log($e); 
        } 
       } 
    } 
      //Use this function to fetch the fb_uid. Function call: $this->fb_connect->user_id(); 
      public function user_id() 
      { 
       if(!empty($this->user_id)) 
        return $this->user_id; 
       else 
        return FALSE; 
      } 
      //Use this function to fetch the user details from fb. Function call: $this->fb_connect->user(); 
      public function user() 
      { 
       if(!empty($this->user)) 
        return $this->user; 
       else 
        return NULL; 
      }} 
+0

我沒有看到這段代碼與我寫的代碼有什麼不同。你剛剛發現了一個異常,並且增加了一堆受保護的變量。它與我的代碼有什麼不同,它有什麼變化?請你解釋一下嗎? – developernaren 2013-03-12 13:00:21

+0

在這個庫中要注意的主要事項是使用「日誌」。使用日誌找出確切的錯誤並進行調試。它會幫助你瞭解真正的問題,而不是想知道爲什麼在遵循所有步驟後它不工作! 而那些受保護的變量,功能只是爲了確保封裝和抽象的地方。只要忘記,如果只是你正在開發和專注於使用日誌。 – 2013-03-12 17:14:26

0

您可以嘗試爲本地機器創建某種測試環境。

您需要了解Facebook如何將數據發送到您的應用程序,然後才能創建您的環境。

  1. Facebook正在(通過POST)發送請求到你的頁面,您的網頁接收這個數據,你需要接受的數據並對其進行處理。

  2. 嘗試創建一個在線應用程序(我使用PHP,所以我會以這種方式編寫)和var_dump簽名的請求。

  3. 在var_dump之後,您可以看到從Facebook發送的已簽名請求。

  4. 創建帶有輸入字段的PHP文件,您可以在其中放置本地應用程序,並按鈕將POST數據輸入到輸入頁面。在表單中,您將隱藏名爲「signed_request」的輸入,其中包含步驟2中的數據。

  5. 將數據發送到您的頁面後,頁面將處理已簽名的請求,就像它應該在線執行一樣。

我知道,這是一個漫長的過程如何使它,但一旦你這樣做,你將有測試環境,在今後的所有其他應用程序。

此外,嘗試幾種情況下創建幾種形式:

    不喜歡
  1. Facebook頁面標籤
  2. Facebook頁面標籤喜歡
  3. 公認的許可盒Facebook頁面標籤
  4. 等...