Я делаю приложение для голосования в WordPress, где пользователи могут голосовать за сообщения.
Чтобы голосовать, пользователям не нужно иметь реального пользователя в WordPress, но вместо этого необходимо войти в систему с Facebook. Затем голос сохраняется в пользовательской таблице, содержащей ID, post_id и facebook_id.
Но у меня проблемы с получением данных текущего пользователя Facebook.
Почему-то всегда происходит сбой при попытке получить accessToken, который, согласно документации, необходим для получения пользовательских данных. Я также пытался строго следовать документации, но это тот же результат. AccessToken не может быть получен.
Вот как должен работать поток голосования:
- Отображается список сообщений, каждое с кнопкой голосования и счетчиком голосов.
- Когда пользователь нажимает кнопку голосования, должна появиться подсказка для входа в Facebook, если вы еще не вошли в систему. Если вы уже вошли в систему или после
входя в систему, ajax-вызов отправляется вместе с идентификатором страницы и
facebook-идентификатор.
- Затем данные сохраняются в пользовательской таблице, и голосование завершается.
Запоминающая часть уже работает, когда я использую статическую строку в качестве идентификатора 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, поэтому я очень растерялся.
Кто-нибудь знает, что я делаю не так?