我正在使用php sdk开发一个facebook应用程序,并试图从JavaScript SDK中获取Access Tokens。但问题是javascript SDK需要花时间加载和我的PHP代码运行之前javascript SDK完全加载这就是为什么我不能获得访问令牌。 这是我的代码。
<script>
window.fbAsyncInit = function() {
FB.init({
appId : '{app-id}',
cookie : true,
version : 'v2.4'
});
};
(function(d, s, id){
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
</script>
<?php
require __DIR__ . '/Facebook/autoload.php';
$fb = new Facebook\Facebook([
'app_id' => '............',
'app_secret' => '..................',
'default_graph_version' => 'v2.4',
]);
if(!isset($_SESSION["AccessToken"])) {
$helper = $fb->getJavaScriptHelper();
try {
$accessToken = $helper->getAccessToken();
if(isset($accessToken)) {
$_SESSION["AccessToken"]= (string)$accessToken;
}
} catch(Facebook\Exceptions\FacebookResponseException $e) {
// When Graph returns an error
echo 'AccessGraph returned an error: ' . $e->getMessage();
session_destroy();
exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
// When validation fails or other local issues
echo 'Facebook SDK returned an error: ' . $e->getMessage();
session_destroy();
exit;
}
}
echo $_SESSION["AccessToken"];
?>
如果我重新加载页面代码正常工作,我成功获得了访问令牌,因为JavaScript SDK已经加载。 请告诉我我是如何解决这个问题的?
答案 0 :(得分:2)
通常,您的php文件将被执行,结果将由浏览器显示。
这意味着您的 php代码将在脚本生成的任何javascript 之前运行,甚至会传送到浏览器执行。
如果你真的必须在js代码之后运行php代码,那么你应该在你的js的所有必要库被加载之后立即使用javascript加载php代码。
使用jquery可以这样做。
<div id="success"></div>
<div id="error"></div>
<script>
$( "#success" ).load( "/my-file.php", function( response, status, xhr ) {
if ( status == "error" ) {
var msg = "Error occured while loading my script: ";
$("#error").html( msg + xhr.status + " " + xhr.statusText );
}
});
</script>
这个加载my-file.php
,在div#success
中显示它的输出,如果出现任何问题,会在div#error
中显示错误消息。