【发布时间】:2014-07-20 20:31:10
【问题描述】:
新的 php-sdk 出现了一些奇怪的问题,我似乎无法解决。
我有一个 phalconphp 应用程序,如果用户当前未登录,我会在其中向用户显示注册视图,无论我显示此视图的 url 是什么(不重定向 url)
当我设置我的 FacebookRedirectLoginHelper 时,我会传入 http 主机和请求 uri,以便我可以将用户重定向回他们最初尝试访问的同一页面,例如
Facebook\FacebookRedirectLoginHelper('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
不幸的是,这不起作用。我总是收到一个 SDK 异常,告诉我 redirect_uri 不是传入的。即使我在主页上也是如此,例如
var_dump($_SERVER['REQUEST_URI']);
returns "/"
但是,如果我明确地放入斜杠而不是 request_uri,那么它可以正常工作。例如
Facebook\FacebookRedirectLoginHelper('http://'.$_SERVER['HTTP_HOST'].'/');
我什至比较了 2 个生成的 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>';
}
实际的例外是:
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
【问题讨论】:
-
您是否在 Facebook 应用设置中设置了主机 url 或基本 url?
-
是的,我的网站网址设置为该网站的当前实时版本,并且我的应用程序域部分列出了本地主机版本。尽管如此,我的简单示例设置了所有正确的 localhost url,例如 simple.localhost 是站点 url,而我的应用程序域只包含 simple.localhost。如果你不添加它,facebook 总是在网站 url 中附加 /
-
你能把fb异常也贴在这里吗?
-
我已经用它更新了问题
-
我解决了,答案贴在下面
标签: php facebook facebook-php-sdk