Facebook API - 持久数据中缺少必需的参数“状态”

时间:2016-08-18 03:35:30

标签: php facebook facebook-graph-api

我知道这个问题与另一个问题重复,但是在搜索Google和Stack Overflow之后,我还没有找到解决方案。

我有一些代码调用Facebook API来获取登录URL。但是,我是以一种间接的方式做到这一点。基本上这里是服务器流程:

  1. 客户选择使用FB
  2. 登录应用
  3. 客户网站(A)向中间网站(B)发送HTTP GET请求
  4. 网站B返回网站B上的登录URL,其中包括2个回调:使用fb-> getLoginUrl()生成的FB的登录URL以及对网站A的回调。
  5. 网站A重定向到网站B上的登录页面,该页面重定向到FB上的登录页面
  6. 用户登录并授予FB网站上应用的权限
  7. FB重定向到获取访问代码的网站B上的回调。
  8. 网站B重定向到网站将访问代码作为$ _GET变量
  9. 传递的回调
  10. 网站A按需使用访问令牌
  11. 非常复杂,我只包括流程,可能会回答这个问题并更容易理解PHP中的代码。

    PHP 网站代码:

    if (!isset($_GET['code'])) {
      $callback = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
      $request_url = "http://embocorp.com/factory/api.php/facebook/login?callback=".$callback;
      header("Location: ".implode(json_decode(callAPI("GET", $request_url), true)['body']['data']));
    } else {
      echo $_GET['code'];
    }
    

    网站B代码: api.php

    if (!session_id()) {
      session_start();
    }
    
    require_once("vendor/autoload.php");
    
    $method = $_SERVER['REQUEST_METHOD'];
    $request = explode('/', trim($_SERVER['PATH_INFO'],'/'));
    $input = $_SERVER['PATH_INFO'];
    $table = array_shift($request);
    $key = array_shift($request);
    parse_str($_SERVER['QUERY_STRING'], $query_array);
    
    $callback = "http://embocorp.com/factory/api.php/facebook/callback?call=";
    
    function returnData($data, $options = "") {      
      $response = [
        "data"=>$data
      ];
      return json_encode($response, $options);
    }
    function getFacebookConnection($appid, $appsecret) {
      return new Facebook\Facebook(['app_id' => $appid,'app_secret' => $appsecret,'default_graph_version' => 'v2.5',    'persistent_data_handler'=>'session']);
    }
    function facebookHandleRequest($request, $connection, $details = null) {
      switch($request) {
        case "login":
          $callback_url = $GLOBALS["callback"].$GLOBALS['query_array']['callback'];
          echo returnData("http://embocorp.com/factory/login.php?fb=".getFacebookLoginURL($connection, $callback_url), JSON_UNESCAPED_SLASHES);
          break;
        case "callback":
          if (!empty($GLOBALS["query_array"])) {
            foreach ($_COOKIE as $k=>$v) {
              if(strpos($k, "FBRLH_")!==FALSE) {
                $_SESSION[$k]=$v;
              }
            }
            $access = getFacebookAccessCode($connection);
            $called = $GLOBALS['query_array']['called'];
            header("location: ".$called."?code=".$access);
          } else {
            echo returnError(400, "Bad Request, missing authorization");
          }
          break;
        case "me":
          if (!empty($GLOBALS["query_array"]) &&  array_key_exists("accessToken", $GLOBALS["query_array"]) == true) {
            $response = $connection->sendRequest('GET', '/me', [], $GLOBALS["query_array"]["accessToken"], 'eTag', 'v2.2');
            $user = $response->getGraphUser();
            echo returnData($user);
          } else {
            echo returnError(400, "Bad Request, missing authorization");
          }
          break;
        default:
          echo returnError(404, "Request URI Not Found");
          break;
      }
    }
    function getFacebookLoginURL($connection, $callback_url) {
      $helper = $connection->getRedirectLoginHelper();
      $permissions = ['manage_pages', 'publish_pages', 'read_insights'];
      $loginUrl = $helper->getLoginUrl($callback_url, $permissions);
      foreach ($_SESSION as $k=>$v) {                    
        if(strpos($k, "FBRLH_")!==FALSE) {
          if(setcookie($k, $v)) {
            $_COOKIE[$k]=$v;
          }
        }
      }
      return $loginUrl;
    }
    function getFacebookAccessCode($fb){
      if (!session_id()) {
        $accessToken = $_SESSION['facebook_access_token'];
        return $accessToken;
      } else {
        $helper = $fb->getRedirectLoginHelper();
        try {
          $accessToken = $helper->getAccessToken();
        } catch(Facebook\Exceptions\FacebookResponseException $e) {
          echo 'Graph returned an error: ' . $e->getMessage();
          exit;
        } catch(Facebook\Exceptions\FacebookSDKException $e) {
          echo 'Facebook SDK returned an error: ' . $e->getMessage();
          exit;
        }
        if (isset($accessToken)) {
          $_SESSION['facebook_access_token'] = (string) $accessToken;
          return (string) $accessToken;
        } else {
          return false;
        }
      }
    } 
    
    switch ($table) {
      case "facebook":
        $fb = getFacebookConnection($appid, $appsecret);
        facebookHandleRequest($key, $fb);
        break;
      case "twitter":
        echo "no";
        break;
      default:
        exit();
        break;
    }
    
    session_write_close();
    
    ?>
    

    的login.php

    if (!session_id()) {
      session_start();
    }
    if (isset($_GET['fb'])) {
      $redirect = str_replace("fb=", "", $_SERVER['QUERY_STRING']);
      header("Location: ".$redirect);
    } else {
      echo "ni";
    }
    

    再次感谢您的帮助,这让我疯狂了72个小时。

1 个答案:

答案 0 :(得分:-1)

添加,

if (!session_id()) {
    session_start();
}

启动两个文件。