【发布时间】:2015-03-14 23:39:38
【问题描述】:
我真的希望这里有人能够帮助我,因为我已经坚持了 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 是大量在线搜索的结果,目前不起作用(不是提到它真的很乱!)。为了连接到 GraphAPI、获取玩家的详细信息并将其发布到数据库,我真的需要逐步说明将哪些 PHP 代码放在哪里。
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。并在“if(!isset($session)) //Redirect to Login Dialog”的脚本中再次输入我的 AppID 和我游戏的 Facebook URL。
在您定义了 $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 语句将“链接”放入我的数据库中,也许我希望 Javascript SDK 建立的连接中的变量也可以被 PHP SDK 使用,这是不可能的,也许我需要使用 PHP SDK 启动一个全新的连接才能使用 PHP 执行插入语句?
我不明白为什么当我已经登录时,你给我的代码总是将我重定向到我的游戏页面并且似乎没有建立连接。我确定我错过了一些非常基本在这里。 :秒 我真的很感谢你在这方面的帮助! :)
【问题讨论】:
-
您正在组合两个不同版本的 PHPH SDK。 $facebook 在您的代码中不存在并且不是由 PHP SDK 4.0+ 生成的。
-
啊!感谢您的回复!恐怕我现在拥有的代码是一团糟。 :( 你所说的 $facebook 不存在是有道理的,因为每当我运行页面时,我都会收到错误“注意:未定义的变量:facebook in ...”。
-
@Phillip if "$user_profile = $facebook->api('/me'); $fbid = $user_profile['id'];"由于 $facebook 无法与我的 SDK 版本一起使用,因此无法工作,我应该使用哪一行代码来获取用户信息/为用户的 id 创建一个变量?再次感谢!
-
嗨@Phillip 我已经为我的问题写了一个更新,因为添加评论太长了,再次感谢!
-
您必须重定向到 OAuth 对话框才能使用 PHP SDK 进行身份验证。您也可以使用 JS SDK 进行身份验证,但无法将信息传输到 PHP。在您的应用程序设置中,在“迁移”下,您是否将所有 3 个选项都转为
on?同时更新您的代码以反映您的更改。
标签: php facebook facebook-graph-api canvas facebook-php-sdk