2015-11-15 93 views
0

我的需求:当表单在我的web应用程序中被submmited时,自动发布Facebook粉丝页面中的链接。Facebook api不返回访问令牌

所以我有以下代码(从facebook suggestion复制/粘贴)

 $appId = "..."; 
     $appSecret = "..."; 


     $fb = new Facebook\Facebook([ 
      'app_id' => $appId, 
      'app_secret' => $appSecret, 
     ]); 

     $helper = $fb->getRedirectLoginHelper(); 

     try { 
      $accessToken = $helper->getAccessToken(); 
     } catch (Facebook\Exceptions\FacebookResponseException $e) { 
      // When Graph returns an error 
      echo 'Graph returned an error: ' . $e->getMessage(); 
      exit; 
     } catch (Facebook\Exceptions\FacebookSDKException $e) { 
      // When validation fails or other local issues 
      echo 'Facebook SDK returned an error: ' . $e->getMessage(); 
      exit; 
     } 

     if (!isset($accessToken)) { 
      if ($helper->getError()) { 
       header('HTTP/1.0 401 Unauthorized'); 
       echo "Error: " . $helper->getError() . "\n"; 
       echo "Error Code: " . $helper->getErrorCode() . "\n"; 
       echo "Error Reason: " . $helper->getErrorReason() . "\n"; 
       echo "Error Description: " . $helper->getErrorDescription() . "\n"; 
      } else { 
       header('HTTP/1.0 400 Bad Request'); 
       echo 'Bad request'; 
      } 
      exit; 
     } 

// Logged in 
     echo '<h3>Access Token</h3>'; 
     var_dump($accessToken->getValue()); 

// The OAuth 2.0 client handler helps us manage access tokens 
     $oAuth2Client = $fb->getOAuth2Client(); 

// Get the access token metadata from /debug_token 
     $tokenMetadata = $oAuth2Client->debugToken($accessToken); 
     echo '<h3>Metadata</h3>'; 
     var_dump($tokenMetadata); 

// Validation (these will throw FacebookSDKException's when they fail) 
     $tokenMetadata->validateAppId($config['app_id']); 
// If you know the user ID this access token belongs to, you can validate it here 
// $tokenMetadata->validateUserId('123'); 
     $tokenMetadata->validateExpiration(); 

     if (!$accessToken->isLongLived()) { 
      // Exchanges a short-lived access token for a long-lived one 
      try { 
       $accessToken = $oAuth2Client->getLongLivedAccessToken($accessToken); 
      } catch (Facebook\Exceptions\FacebookSDKException $e) { 
       echo "<p>Error getting long-lived access token: " . $helper->getMessage() . "</p>"; 
       exit; 
      } 
      echo '<h3>Long-lived</h3>'; 
      var_dump($accessToken->getValue()); 
     } 

     $_SESSION['fb_access_token'] = (string) $accessToken; 

但输出Bad request。我尝试了另一个appId但保持错误。

+0

我建议从岗位 –

+0

该删除API ID和API的秘密是后备页面,重定向的login.php,你已经登录.PHP?它返回任何错误? –

+0

我不明白。用户不应该登录Facebook。 –

回答

1

根据Facebook的文档:

的FacebookRedirectLoginHelper利用会话存储CSRF 价值。在调用getLoginUrl()方法之前,您需要确保已启用会话。这通常会在大多数 Web框架中自动完成,但如果您未使用Web框架,则可以添加 session_start();到login.php的顶部& login-callback.php 脚本。您可以覆盖默认的会话处理 - 请参阅下面的 可扩展性点。

确保有一个有效的会话,或者在脚本的顶部使用session_start()。

+0

我不需要任何登录。我只需要从我的web应用程序自动发布链接到我的粉丝页面。 –

+0

通过“张贴链接”你的意思是共享一个链接? https://developers.facebook.com/docs/sharing/web –

+0

这个问题看起来类似于你问的,可能会帮助你:http://stackoverflow.com/questions/7818667/simple-example-to-post对Facebook的粉丝页通过PHP –

0

该代码是用Facebook登录的。

用于张贴到的fanpage作为管理员尝试类似:

$appid = 'XXX'; //your app id 
$appsecret = 'XXX'; //your app secret 
$pageId = 'XXX'; //your page id 
use Facebook\FacebookRequest; 
require 'your_path/Facebook/autoload.php'; 
$facebook = new Facebook(array(
    'appId' => $appid, 
    'secret' => $appsecret, 
    'cookie' => false, 
)); 

$user = $facebook->getUser(); 

if ($user) { 
    try { 
    $page_info = $facebook->api("/$pageId?fields=access_token"); 
    if (!empty($page_info['access_token'])) { 
     $args = array(
     'access_token' => $page_info['access_token'], 
     'message' => 'www.test.com' /example 
    ); 

     $postId = $facebook->api("/$pageId/feed", "post", $args); 
    } 
    } catch (FacebookApiException $e) { 
    error_log($e); 
    $user = null; 
} 
} 
+0

'Facebook'的Facebook实例没有'getUser()'方法。我正在使用SDK V5 –