重定向uri的Facebook php sdk v4 oauth错误

重定向uri的Facebook php sdk v4 oauth错误,php,facebook,facebook-php-sdk,Php,Facebook,Facebook Php Sdk,我在新的PHPSDK中遇到了一个奇怪的问题,我似乎无法解决它 我有一个phalconphp应用程序,如果用户当前未登录,我将向他们提供注册视图,而不管我提供此视图的url是什么(无需重定向url) 当我设置FacebookRedirectLoginHelper时,我会传入http主机和请求uri,这样我就可以将用户重定向回他们最初试图访问的页面,例如 Facebook\FacebookRedirectLoginHelper('http://'.$_SERVER['HTTP_HOST'].$_

我在新的PHPSDK中遇到了一个奇怪的问题,我似乎无法解决它

我有一个phalconphp应用程序,如果用户当前未登录,我将向他们提供注册视图,而不管我提供此视图的url是什么(无需重定向url)

当我设置FacebookRedirectLoginHelper时,我会传入http主机和请求uri,这样我就可以将用户重定向回他们最初试图访问的页面,例如

  Facebook\FacebookRedirectLoginHelper('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
不幸的是,这不起作用。我总是收到一个SDK异常,告诉我重定向uri不是传入的。即使我在主页上也是如此,例如

  var_dump($_SERVER['REQUEST_URI']);
  returns "/"
但是,如果我显式地将尾部斜杠而不是请求uri放进去,那么它将正常工作。e、 g

 Facebook\FacebookRedirectLoginHelper('http://'.$_SERVER['HTTP_HOST'].'/');
我甚至比较了两个生成的URL(同样是在索引页上,因此路径只是“/”),它们完全相同。唯一的问题似乎是试图动态地生成这个。我一辈子都搞不清楚这里发生了什么。它似乎不是任何一种双重编码,我只是有点困惑,为什么这不起作用

起初我认为这可能与PhalconPHP和路由有关,但事实似乎并非如此,因为即使是一个简单的示例也失败了

下面是一个简单的php文件示例。您显然需要包含sdk并设置一个应用程序

 <?php
   ob_start();
   session_start();
   $appId = 'xxxxxxxxxxxxxxxxxxxxxxxx';
   $secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

   //require all the facebook stuff
   Facebook\FacebookSession::setDefaultApplication($appId,$secret);
   $helper = new Facebook\FacebookRedirectLoginHelper('http://'.$_SERVER['HTTP_HOST'] .'/'); //will work
   //$helper = new Facebook\FacebookRedirectLoginHelper('http://'.$_SERVER['HTTP_HOST'] .$_SERVER['REQUEST_URI']); //won't work


// see if a existing session exists
if ( isset( $_SESSION ) && isset( $_SESSION['fb_token'] ) ) {
// create new session from saved access_token
$session = new FacebookSession( $_SESSION['fb_token'] );

 // validate the access_token to make sure it's still valid
 try {
   if ( !$session->validate() ) {
     $session = null;
   }   
  } catch ( Exception $e ) {
  // catch any exceptions
  $session = null;
 }
 }  

if ( !isset( $session ) || $session === null ) {
// no session exists

try {
$session = $helper->getSessionFromRedirect();
} catch( FacebookRequestException $ex ) {
// When Facebook returns an error
// handle this better in production code
print_r( $ex );
} catch( Exception $ex ) {
// When validation fails or other local issues
// handle this better in production code
print_r( $ex );
}

}

// see if we have a session
 if ( isset( $session ) ) {

 // save the session
 $_SESSION['fb_token'] = $session->getToken();
  // create a session using saved token or the new one we generated at login
   $session = new FacebookSession( $session->getToken() );

  // graph api request for user data
   $request = new FacebookRequest( $session, 'GET', '/me' );
 $response = $request->execute();
  // get response
   $graphObject = $response->getGraphObject()->asArray();

  // print profile data
   echo '<pre>' . print_r( $graphObject, 1 ) . '</pre>';

  // print logout url using session and redirect_uri (logout.php page should destroy the session)
   echo '<a href="' . $helper->getLogoutUrl( $session, 'http://yourwebsite.com/app/logout.php' ) . '">Logout</a>';

} else {
  // show login url
  echo '<a href="' . $helper->getLoginUrl( array( 'email', 'user_friends' ) ) . '">Login</a>';
   }

我已经解决了这个问题。我真傻。当使用$\u SERVER['REQUEST\u URI']生成登录url时,它在第二次运行时明显返回为“/”,但这一次再次实例化它,但其中包含返回的查询字符串,因此helper类中设置的重定向URI不再与基本URI相同。基本上,我需要不带querystring的请求uri

所以现在我只使用


您是否在fb应用程序设置中设置了主机url或基本url?是的,我的网站url设置为网站的当前实时版本,并且“和我的应用程序域”部分列出了本地主机版本。尽管如此,我的简单示例已经设置了所有正确的localhost url,例如站点url和我的应用程序域只包含simple.localhost。facebook总是在网站url中添加/如果你不添加它,你也可以在这里粘贴fb例外吗?我已经用itI更新了这个问题,我已经解决了,答案发布在Hanks man下面。我也有同样的问题,这就解决了。我正在获取请求uri,当facbook返回应用程序时,它发送了code=xxxxx。。这与初始url不同。这就是错误的原因。:)
Facebook\FacebookAuthorizationException Object ( [statusCode:Facebook\FacebookRequestException:private] => 400 [rawResponse:Facebook\FacebookRequestException:private] => {"error":{"message":"Error validating verification code. Please make sure your redirect_uri is identical to the one you used in the OAuth dialog request","type":"OAuthException","code":100}} 

 [responseData:Facebook\FacebookRequestException:private] => Array ( [error] => Array ( [message] => Error validating verification code. Please make sure your redirect_uri is identical to the one you used in the OAuth dialog request [type] => OAuthException [code] => 100 ) ) [message:protected] => Error validating verification code. Please make sure your redirect_uri is identical to the one you used in the OAuth dialog request
  $_SERVER['HTTP_HOST']. strtok($_SERVER['REQUEST_URI'], '?')