Не удается получить данные пользователя из Facebook SDK - PullRequest
0 голосов
/ 31 мая 2019

Я делаю приложение для голосования в WordPress, где пользователи могут голосовать за сообщения.

Чтобы голосовать, пользователям не нужно иметь реального пользователя в WordPress, но вместо этого необходимо войти в систему с Facebook. Затем голос сохраняется в пользовательской таблице, содержащей ID, post_id и facebook_id.

Но у меня проблемы с получением данных текущего пользователя Facebook.

Почему-то всегда происходит сбой при попытке получить accessToken, который, согласно документации, необходим для получения пользовательских данных. Я также пытался строго следовать документации, но это тот же результат. AccessToken не может быть получен.

Вот как должен работать поток голосования:

  1. Отображается список сообщений, каждое с кнопкой голосования и счетчиком голосов.
  2. Когда пользователь нажимает кнопку голосования, должна появиться подсказка для входа в Facebook, если вы еще не вошли в систему. Если вы уже вошли в систему или после входя в систему, ajax-вызов отправляется вместе с идентификатором страницы и facebook-идентификатор.
  3. Затем данные сохраняются в пользовательской таблице, и голосование завершается.

Запоминающая часть уже работает, когда я использую статическую строку в качестве идентификатора facebook. Проблема заключается исключительно в реализации Facebook.

Я добавил SDK Facebook с композитором так: composer require facebook/graph-sdk

Примечание: я разрабатываю тему мудреца из корней.


Вот мой текущий код:

JS:

$(function() {
    $('.vote-btn').on('click', function() {

        let page_id = $(this).data('page-id');

        FB.getLoginStatus(function(response) {
            if(response.status === 'connected') {
                makeVote(page_id);
            } else {
                loginWithFacebook(),
            }
        }
    });
};

function makeVote(id) {
    $.post('', {id: id}, function() {
        // Success
    }).fail(function() {
        // Fail
    }).always(function() {
        $('.loader').hide();
    });
}

function logInWithFacebook() {
    FB.login(function(response) {
        if (response.authResponse) {
            alert('You are logged in & cookie set!');
            // Now you can redirect the user or do an AJAX request to
            // a PHP script that grabs the signed request from the cookie.
        } else {
            alert('User cancelled login or did not fully authorize.');
        }
    });
    return false;
}

PHP

namespace App\Controllers;

use Sober\Controller\Controller;
use Facebook\Facebook;
use Facebook\Exceptions\FacebookResponseException;
use Facebook\Exceptions\FacebookSDKException;

class TemplateVoting {

    private $post_id:
    private $fb_id;
    private $wpdb;

    public function __construct() {
        $this->wpdb = $GLOBALS['wpdb'];
    }

    public function __after() {
        if ($_SERVER['REQUEST_METHOD'] === 'POST') {

            $this->post_id = $_POST['id'];
            $this->addVote();
        }
    }

    private function addVote() {
        if( !is_int( $this->fb_id() ) ) {
            return;
        }
        $this->wpdb->insert("wp_post_votings", [
            "post_id" => $this->post_id,
            "fb_id"   => $this->fb_id(),
        ]);
    }

    private function fb_id() {
        try {
            $response = $fb->get('/me?fields=id', $this->getToken());
        } catch(Facebook\Exceptions\FacebookResponseException $e) {
            return $e->getMessage();
        } catch(Facebook\Exceptions\FacebookSDKException $e) {
            return $e->getMessage();
        }

        $user = $response->getGraphUser();
        return $user['id'];
    }

    private function initApi() {
        $facebook = new Facebook([
            'app_id' => env('FB_APP_ID'),
            'app_secret' => env('FB_APP_SECRET'),
            'default_graph_version' => 'v3.3',
        ]);
    }

    private function getToken() {
        $fb = $this->initApi();

        $helper = $fb->getJavaScriptHelper();

        try {
            $accessToken = $helper->getAccessToken();
        } catch(FacebookResponseException $e) {
            return $e->getMessage();
        } catch(FacebookSDKException $e) {
            return $e->getMessage();
        }

        if (!isset($accessToken)) {
            return '';
        }

        return $accessToken->getValue();
    }

}

Конец тега тела

(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'));


window.fbAsyncInit = function() {
    FB.init({
        appId: 'app_id', // True app_id is inserted in real project
        cookie: true, // This is important, it's not enabled by default
        version: 'v2.10'
    });
};

Раньше я не работал с Facebook SDK или API Graph, поэтому я очень растерялся.

Кто-нибудь знает, что я делаю не так?

...