javascript - 使用 PHP SDK v4 的 Facebook 应用请求

标签 javascript php facebook facebook-graph-api facebook-app-requests

我的设置是 facebook 上的一个 Canvas /网页应用程序,它使用 JavaScript SDK 来登录 facebook,然后使用 PHP SDK 来执行一些服务器端的操作。服务器端之一的功能是在帖子收到新评论时发送通知。请注意,这些是应用程序中的帖子,而不是 Facebook 提要/评论。我本来打算尝试使用 Facebook 通知边缘,但它目前处于测试阶段,仅对 Canvas 应用程序开放,并且只能从 Facebook.com 网页访问。因此,我想我会像游戏一样,通过使用 apprequest 边缘从评论发布者向帖子创建者发送消息。

这是我用来登录的代码。 - 这很好用。

FB.init({
    appId      : 'xxxxxx',
    xfbml      : true,
    cookie     : true,
    version    : 'v2.2'
});

function onLogin(response) {
    if (response.status == 'connected') {
        FB.api('/me?fields=id,first_name,last_name,email', function(data) {
            // I do some stuff here that has nothing to do with problem
        });
    }
}

FB.getLoginStatus(function(response) {
    if (response.status == 'connected') {
        onLogin(response);
    } else {
        FB.login(function(response) {
            onLogin(response);
        }, {scope: 'user_friends, email'});
    }
});

我在每次页面刷新时都会处理此问题,以使 session cookie 对于 PHP 调用保持事件状态。到目前为止一切都很好,我获取了用户的 GraphAPI 数据,根据需要出现登录提示并请求正确的授权。

现在,在 PHP 中,我正在从测试用户向我自己发送一条测试消息。此时,我以测试用户身份登录,并将我的 Facebook ID 硬编码到“收件人”属性中。

// FB Requires
// Loaded from a seperate script to include all SDK files

// FB NameSpace
use Facebook\FacebookSession;
use Facebook\FacebookRequest;
use Facebook\FacebookJavaScriptLoginHelper;

FacebookSession::setDefaultApplication($GLOBALS['FB_AppID'], $GLOBALS['FB_AppSecret']);

// Simple Class to send a notification to a user about a status update
class FBRequest {

    private $session;

    function __construct()
    {
        $helper = new FacebookJavaScriptLoginHelper();
        try {
            $this->session = $helper->getSession();
        } catch(FacebookRequestException $ex) {
            // When Facebook returns an error
            echo "FBExHelper :: " . $ex->getMessage();
        } catch(\Exception $ex) {
            // When validation fails or other local issues
            echo "HelperEx :: " . $ex->getMessage();
        }

        return;

        // If you're making app-level requests:
        $this->session = FacebookSession::newAppSession();

        // To validate the session:
        try {
            $this->session->validate();
            $_SESSION['access_token'] = $this->session->getToken();
        } catch (FacebookRequestException $ex) {
            // Session not valid, Graph API returned an exception with the reason.
            echo $ex->getMessage();
        } catch (\Exception $ex) {
            // Graph API returned info, but it may mismatch the current app or have expired.
            echo $ex->getMessage();
        }
    }

    public function SendRequest()
    {
        if (!$this->session) return;
        /* PHP SDK v4.0.0 */
        /* make the API call */
        $request = new FacebookRequest(
            $this->session,
            'POST',
            "/me/apprequests",
            array (
                'message' => 'This is a test message',
                'to' => '0123456789101112' // My Facebook ID here
            )
        );

        $response = $request->execute();
        $graphObject = $response->getGraphObject();
        /* handle the result */

        var_dump($response);
        echo "<br><br>";
        var_dump($graphObject);
    }
}

当我运行这个脚本时,一切看起来都很好。 $response 的 var_dump 只是显示 session 已设置,并且有很多此时无关紧要的垃圾。 $graphObject 的 var_dump 看起来像文档显示的那样,Facebook API /user/apprequest

object(Facebook\GraphObject)#11 (1) {
    ["backingData":protected] => array(2) {
        ["request"] => string(15) "795036370586912"
        ["to"] => array(1) {
            [0] => string(15) "0123456789101112"
        }
    }
}

现在我应该在某处看到一条消息/通知。我的手机、Facebook 页面、地球仪图标、我的动态、我的家、信使、天空中的灯光、闪烁的月亮、信鸽,你知道的,但我看不到应用请求发送到任何地方,除了我有一个请求 ID。

有什么建议我做错了什么,或者有更好的方式向用户发送通知吗?

最佳答案

在 luschn 的评论之后,我决定切换到通知,因为 apprequest 确实是为游戏使用而构​​建的。

但是,我遇到的应用请求未显示的问题是由于应用程序被设置为沙箱(应用程序不是实时的),一旦我打开实时测试的请求,就可以毫无问题地发送。

所以任何有同样问题的人...上面的代码似乎确实有效,如果需要,请使用它。

关于javascript - 使用 PHP SDK v4 的 Facebook 应用请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28306661/

相关文章:

php - 如何使用 mysql 查询显示排名

php - 使用 Raspberry 命令行编辑器 'Nano' 与 LeafPad 编辑文本文件字符串。导致php无法正确读取字符串

iphone - URL 重定向到 spy 软件站点

javascript - 我的函数一直给出 NaN

javascript - 无法在 localhost 上启动 Node.js 的 MongoDB

php - 无法通过 API 将文件从 Wordpress 插件上传到 symfony 后端服务器?

facebook - 如何使用nodejs在Facebook实时更新中设置回调url

javascript - 使用 safari 在 Canvas 中绘制包含 html 的 svg

javascript - 如何在按钮中显示div

php - Facebook 应用程序开发有详细的文档吗?