9

我正在尝试按照示例从此处创建到 Facebook 的服务器端登录,但没有运气。在第 7 步中,当我尝试使用令牌交换代码并将其存储在会话中以供以后使用时,我总是收到此错误:

  file_get_contents(): failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request

我知道这已经问过很多次了,但我仍然无法解决这个问题,根据这个问题,我尝试使用 cURL,但它仍然不起作用,它只是返回 false。

其他问题告诉我使用 PHP SDK,但我不知道使用哪种方法。所以我完全迷失在这里。


这是我调用登录表单的代码:

<a href="<?php echo LOGIN_URL; ?> ?>" class="btn btn-primary">Login with Facebook</a>

其中 LOGIN_URL 定义为:

define("LOGIN_URL", $facebook->getLoginUrl(array("redirect_uri" => APP_URL . "fb_login")));

在 fb_login 中,我有以下代码:

$app->get("/fb_login", function() use($app, $facebook)
{
    $code = $_REQUEST["code"];

    $token_url = "https://graph.facebook.com/oauth/access_token?"
       . "client_id=" . APP_ID . "&redirect_uri=" . APP_URL . $_SESSION["request_uri"] // Previous URL
       . "&client_secret=" . APP_SECRET . "&code=" . $code;

    $response = file_get_contents($token_url); // Doesn't work
    $params = null;
    parse_str($response, $params);

    $_SESSION["access_token"] = $params["access_token"];

    // Let's try with cURL...
    // $ch = curl_init();
    // curl_setopt($ch, CURLOPT_URL, $token_url);
    // curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    // $output = curl_exec($ch); // Returns false
    // curl_close($ch);

    $graph_url = "https://graph.facebook.com/me?access_token="
      . $params["access_token"];

    $user = json_decode(file_get_contents($graph_url));
    echo("Hello " . $user->name);

    var_dump($code); die();
});

任何帮助表示赞赏。之前谢谢。

4

2 回答 2

6

要直接回答这个问题,问题很可能是您没有urlencode(确保 URL 传输安全)重定向 URL。最快的修复将是:

$token_url = "https://graph.facebook.com/oauth/access_token?"
   . "client_id=" . APP_ID . "&redirect_uri=" . urlencode(APP_URL . $_SESSION["request_uri"])
   . "&client_secret=" . APP_SECRET . "&code=" . $code;

但是,我还建议您查看 Facebook SDK,因为它可以为您完成这一切。

于 2012-11-26T23:23:57.410 回答
3

您是否检查过 PHP SDK 上的文档...它非常广泛和不错..您只需要按以下方式设置您的 Facebook SDK

$facebook = new Facebook(array(
                'appId' => 'your app id',
                'secret'=> 'your app secret'));

然后您可以将登录 URL 检索为

$loginURL = $facebook->loginUrl(array(
                'scope' => 'read_stream',
                'redirect_uri' => 'http://yourdomain/path/to/page'));

此外,SDK 可能会更好地描述由它处理的错误,这可能是由于重定向 URI 与应用程序的配置不匹配或应用程序 ID 或机密或完全不同的东西错误。从这里下载 SDK

于 2012-11-26T05:53:28.170 回答