Facebook api不会返回访问令牌

时间:2015-11-15 23:15:11

标签: php facebook facebook-graph-api facebook-php-sdk

我的要求:在我的网络应用程序中对表单进行子设置时,自动在Facebook粉丝页面中发布链接。

所以我有以下代码(从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,但保留了错误。

3 个答案:

答案 0 :(得分:1)

根据Facebook文档:

  

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

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

答案 1 :(得分:0)

该代码用于登录facebook。

发布粉丝页面作为管理员尝试类似:

$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;
 }
}

答案 2 :(得分:0)

我遇到了访问令牌的问题。我不确定是否是同样的问题。

我的Facebook登录失败导致$accessToken = $helperget->AccessToken(); 错误时返回(代码401)。

要更正我的代码,我需要在我的AccessToken()添加我的回调网址。 (与facebook开发者网站中的URI配置相同)。

$accessToken = $helper->getAccessToken('www.domain.com/callback');