如何使用PHP使用PHP SDK将用户数据从Facebook Canvas插入数据库

时间:2015-03-14 23:39:38

标签: php facebook facebook-graph-api canvas facebook-php-sdk

我真的希望有人能够帮助我,因为我已经被困在这3天了,无论我尝试什么,似乎无法让它工作。 :(

我正在制作一个Facebook画布游戏,我正在尝试编写一个PHP脚本,在运行时,会将播放器的Facebook用户ID插入我的数据库,以及事件发生时间的时间戳。我希望每次运行脚本时都会发生这种情况,理想情况下,如果播放器激活此脚本说5次,那么数据库表将记录其ID 5次以及5个不同的时间戳。

我已经尝试按照Facebook开发人员网站上有关PHP SDK和Graph API的说明,我发现这里的答案很棒,我已经尝试过每一个我见过的关联对我的问题,但我仍然无法让它工作。我想我错过了一些非常简单的东西,因为我是Facebook SDK和PHP的初学者。

如果我理解正确,我需要在PHP代码中创建一个GraphAPI会话,创建一个链接到$ facebook-> api('/ me')的变量,然后请求我需要的任何用户数据,然后使用SQL INSERT语句将数据放入数据库?

我现在的代码会将当前时间发布到数据库中,因此连接工作正常,但我尝试连接到Facebook是大量在线搜索的结果,目前无法正常工作(不是提到它真的很乱!)。我真的需要一步一步的说明,将PHP代码放在哪里以便连接到GraphAPI,获取并将播放器的详细信息发布到数据库。

PHP代码(自我第一次提出问题后更新):

<?php

session_start();

require_once '/facebook-php-sdk-v4-4.0-dev/autoload.php';

use Facebook\Entities\AccessToken;
use Facebook\Entities\SignedRequest;

use Facebook\HttpClients\FacebookCurl;
use Facebook\HttpClients\FacebookCurlHttpClient;
use Facebook\HttpClients\FacebookHttpable;
use Facebook\HttpClients\FacebookStream;
use Facebook\HttpClients\FacebookStreamHttpClient;

use Facebook\FacebookAuthorizationException;
use Facebook\FacebookCanvasLoginHelper;
use Facebook\FacebookClientException;
use Facebook\FacebookJavaScriptLoginHelper;
use Facebook\FacebookOtherException;
use Facebook\FacebookPageTabHelper;
use Facebook\FacebookPermissionException;
use Facebook\FacebookRedirectLoginHelper;
use Facebook\FacebookRequest;
use Facebook\FacebookRequestException;
use Facebook\FacebookResponse;
use Facebook\FacebookSDKException;
use Facebook\FacebookServerException;
use Facebook\FacebookSession;
use Facebook\FacebookSignedRequestFromInputHelper;
use Facebook\FacebookThrottleException;

use Facebook\GraphAlbum;
use Facebook\GraphLocation;
use Facebook\GraphObject;
use Facebook\GraphPage;
use Facebook\GraphSessionInfo;
use Facebook\GraphUser;
use Facebook\GraphUserPage;

FacebookSession::setDefaultApplication('MYAPPID','MYAPPSECRET');

$helper=new FacebookCanvasLoginHelper();

try
{
$session=$helper->getSession();
} 
catch(FacebookRequestException $ex) 
{
  //Handle Error
}
catch(\Exception $ex)
{
  //Handle Error
}

if(!isset($session)) //Redirect to Login Dialog
{ ?>
  <script>
    top.location.href="https://www.facebook.com/dialog/oauth?client_id=<?php echo 'MYAPPID'; ?>&redirect_uri=<?php echo 'https://apps.facebook.com/MYAPPADDRESS'; ?>";
  </script> <?php

 exit();
}

$facebook_data=(new FacebookRequest($session,'GET','/me'))->execute()->getGraphObject(GraphUser::className());

$user_info['AccessToken']=$session->getToken();
$user_info['UserID']=$facebook_data->getId();

//Database:
$servername = "localhost";
$username = "MYUSERNAME";
$password = "MYPASSWORD";
$dbname = "MYDATABASE";

// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$sql = "INSERT INTO table1 (facebook_id, entry_timestamp) VALUES ({$user_info['UserID']}, '".date("Y-m-d H:i:s")."')";

if (mysqli_query($conn, $sql)) {
    echo "New record created successfully";
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
mysqli_close($conn);
?>

我在localhost上使用phpMyAdmin(WAMP),我的php版本是5.6.5,MySQL 5.6.12和Apache 2.4.12。

我应该提一下,我有“FacebookCanvasLoginHelper();”包含在该代码中,但是这个PHP脚本只会在游戏后期的某个时刻运行,当玩家已经登录并且已经提供了所有必需的权限时,所以我不确定是否有必要在这里执行此检查?

对此的任何帮助都将非常感谢! :)


更新

嗨@Phillip再次感谢您的回复,我一直在尝试使用您给我的代码,但它仍然给我一个错误,我希望您能再次提供帮助。

我在FacebookSession :: setDefaultApplication旁边输入了我的AppID和Secret。并再次输入我的AppID和我的游戏的Facebook URL在脚本中为“if(!isset($ session))//重定向到登录对话框”。

在你定义$ user_info ['AccessToken']和$ user_info ['UserID]后,我编写了一个SQL Insert语句将UserID放入我的数据库,因为获取“UserID”的$变量是我需要的,但是当我运行时在PHP页面中,它只是重定向到我游戏的主页(到我上面输入的URL)。

如果我正确理解代码,它就是这样做的,因为它没有$ session /没有连接到GraphAPI上的用户信息并且认为用户没有登录,所以它将它们重定向到我的家要登录的页面?那是对的吗?

这可能是最佳实践,但我想知道是否包含必要的重定向,因为我正在寻找一个PHP脚本,我可以调用它来执行获取用户的信息+在游戏中的某个点插入我的数据库操作当用户肯定会登录时(即,我将调用此脚本的页面是用户在登录并授予权限后才能访问的页面,因此有必要执行登录检查/启动FacebookCanvasLoginHelper?)无论如何,它目前将我重定向到我游戏主页的事实是否意味着获取用户数据的连接不成功?

让我感到困惑的是,我一直在使用Facebook的FriendSmash示例,他们已经建立了一个GraphAPI连接(我认为使用Javascript SDK),如果我在其中包含.js文件在页面顶部,我可以用HTML编写一些内容:

<div id="welcome"><p>Player's address: <span class="link"></p>  

这将给我输出“玩家的地址:(我的(目前已登录)Facebook帐户的网址)”。但我不能使用PHP Insert语句将“链接”放入我的数据库中,也许我期望PHP SDK使用的Javascript SDK连接中的变量也是如此,这是不可能的,也许我需要使用PHP SDK启动一个全新的连接才能用PHP执行Insert语句?

我不明白为什么你给我的代码会将我重定向到我的游戏页面,并且当我已经登录时似乎没有建立连接。我确定我错过了很多东西基本在这里。 :■ 我真的很感谢你的帮助! :)

1 个答案:

答案 0 :(得分:0)

由于您已经关闭,我只会发布我使用的内容。请务必阅读文档以确保您知道发生了什么。另外,使用Facebook提供的自动加载器。

<?php

session_start();

require_once '/facebook-php-sdk-v4-4.0-dev/autoload.php';

use Facebook\Entities\AccessToken;
use Facebook\Entities\SignedRequest;

use Facebook\HttpClients\FacebookCurl;
use Facebook\HttpClients\FacebookCurlHttpClient;
use Facebook\HttpClients\FacebookHttpable;
use Facebook\HttpClients\FacebookStream;
use Facebook\HttpClients\FacebookStreamHttpClient;

use Facebook\FacebookAuthorizationException;
use Facebook\FacebookCanvasLoginHelper;
use Facebook\FacebookClientException;
use Facebook\FacebookJavaScriptLoginHelper;
use Facebook\FacebookOtherException;
use Facebook\FacebookPageTabHelper;
use Facebook\FacebookPermissionException;
use Facebook\FacebookRedirectLoginHelper;
use Facebook\FacebookRequest;
use Facebook\FacebookRequestException;
use Facebook\FacebookResponse;
use Facebook\FacebookSDKException;
use Facebook\FacebookServerException;
use Facebook\FacebookSession;
use Facebook\FacebookSignedRequestFromInputHelper;
use Facebook\FacebookThrottleException;

use Facebook\GraphAlbum;
use Facebook\GraphLocation;
use Facebook\GraphObject;
use Facebook\GraphPage;
use Facebook\GraphSessionInfo;
use Facebook\GraphUser;
use Facebook\GraphUserPage;

FacebookSession::setDefaultApplication('APP_ID','APP_SECRET');

$helper=new FacebookCanvasLoginHelper();

try
{
  $session=$helper->getSession();
} 
catch(FacebookRequestException $ex) 
{
  //Handle Error
}
catch(\Exception $ex)
{
  //Handle Error
}

if(!isset($session)) //Redirect to Login Dialog
{ ?>
  <script>
    top.location.href="https://www.facebook.com/dialog/oauth?client_id=<?php echo 'APP_ID'; ?>&redirect_uri=<?php echo 'https://apps.facebook.com/my_app/'; ?>";
  </script> <?php

  exit();
}

$facebook_data=(new FacebookRequest($session,'GET','/me'))->execute()->getGraphObject(GraphUser::className());

$user_info['AccessToken']=$session->getToken();
$user_info['UserID']=$facebook_data->getId();

?>