Запрос Facebook с использованием PHP SDK v4

Моя установка представляет собой приложение холста/веб-страницы на facebook, которое использует JavaScript SDK для входа в систему с помощью facebook, а затем использует PHP SDK для выполнения некоторых действий на стороне сервера. Одна из функций на стороне сервера для отправки уведомления, когда сообщение получает новый комментарий. Обратите внимание, что это сообщения в приложении, а не в ленте/комментарии Facebook. Я собирался попробовать использовать Facebook Notification Edge, но в настоящее время он находится в бета-версии и открыт только для приложений на основе холста и доступен только с веб-страницы 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'});
    }
});

Я обрабатываю это при каждом обновлении страницы, чтобы файл cookie сеанса оставался активным для вызовов PHP. До этого момента все хорошо, я получаю данные GraphAPI для пользователя, приглашение для входа появляется по мере необходимости и запрашивает правильную авторизацию.

Теперь в PHP я отправляю тестовое сообщение от тестового пользователя самому себе. На данный момент я вошел в систему как тестовый пользователь и жестко закодировал свой идентификатор Facebook в свойстве «Кому».

// 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);
    }
}

Когда я запускаю этот скрипт, все выглядит хорошо. var_dump ответа $response просто показывает, что сеанс установлен и имеет много мусора, который на данный момент не имеет значения. var_dump объекта $graphObject выглядит так, как показано в документации, Facebook API /user/apprequest

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

Теперь в этот момент я должен где-то увидеть сообщение/уведомление. Мой телефон, страница в фейсбуке, значок земного шара, моя лента, мой дом, мессенджер, огни в небе, мерцающая луна, почтовый голубь, вы что-то знаете, но я не вижу, чтобы аппреквест когда-либо был отправлен куда-либо, кроме этого У меня есть идентификатор запроса.

Любые предложения, что я делаю неправильно, или лучший способ отправлять уведомления моим пользователям?


person Dustin Ruckman    schedule 03.02.2015    source источник
comment
Я нашел это stackoverflow.com/ questions/16792782/ Хотя это исправление ссылается на Javascript API, оно может быть связано с моей проблемой. Мое приложение все еще находится в песочнице, но это холст, и я использую его в холсте для тестирования. Я еще не отключил песочницу для проверки, но может ли кто-нибудь подтвердить, что аппрекисты не обрабатываются в режиме песочницы?   -  person Dustin Ruckman    schedule 03.02.2015
comment
apprequests предназначены для игр на холсте (запросы дают игрокам механизм для приглашения своих друзей сыграть в игру). вы не должны злоупотреблять функциональностью facebook для чего-то другого. внешние приложения в любом случае не предназначены для использования системы уведомлений facebook.   -  person luschn    schedule 03.02.2015
comment
Хотя мое приложение не является игрой, это приложение Facebook Canvas, предназначенное для работы на странице Facebook. Позже я перенесу на iOS и Android Facebook, но пока он полностью содержится в Canvas, но для тестирования я также настроил его с веб-сайтом в Facebook. Я знаю, что apprequest указан как игровой сервис, но если я буду использовать его таким же образом для привлечения пользователей, будет ли это считаться нарушением?   -  person Dustin Ruckman    schedule 03.02.2015
comment
это определенно используется неправильно. если у вас есть приложение на основе холста, почему бы не использовать уведомления приложения? это бета-версия, но она отлично работает, и в конце концов вы хотите отправлять уведомления, верно?   -  person luschn    schedule 03.02.2015
comment
Вы правы, я переключусь на уведомления.   -  person Dustin Ruckman    schedule 04.02.2015


Ответы (1)


После комментариев от luschn я решил переключиться на уведомления, так как apprequest действительно создан для использования с играми.

Тем не менее, проблема, с которой я столкнулся, когда apprequest не отображался, была связана с тем, что приложение было установлено в песочницу (приложение не было активным).

Итак, у всех, у кого такая же проблема... Приведенный выше код работает, используйте его, если вам нужно.

person Dustin Ruckman    schedule 03.02.2015