Как вставить пользовательские данные из холста Facebook с помощью PHP SDK в базу данных с помощью SQL

Я действительно надеюсь, что кто-то здесь сможет мне помочь, так как я застрял на этом в течение 3 дней и, похоже, не могу заставить его работать, независимо от того, что я пытаюсь. :(

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

Я пытался следовать инструкциям на сайте разработчиков Facebook в отношении PHP SDK и Graph API, и я нашел здесь отличные ответы, я пробовал все, что я видел, которые относятся к моей проблеме. но я до сих пор не смог заставить его работать. Я думаю, что упускаю что-то очень простое, так как я новичок в Facebook SDK и PHP в целом.

Если я правильно понимаю, мне нужно создать сеанс GraphAPI в коде PHP, создать переменную, связанную с $facebook->api('/me'), затем запросить любые пользовательские данные, которые мне нужны, а затем использовать оператор SQL INSERT для занести данные в базу?

Код, который у меня есть прямо сейчас, будет публиковать текущее время в базе данных, поэтому соединение работает нормально, однако моя попытка подключения к Facebook является результатом большого поиска в Интернете и в настоящее время не работает (не говоря уже о том, что это действительно беспорядочный!). Мне очень нужна пошаговая инструкция, какой PHP-код куда вставить, чтобы подключиться к GraphAPI, получить и разместить данные игрока в базе данных.

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);
?>

Я использую phpMyAdmin (WAMP) на локальном хосте, моя версия php — 5.6.5, MySQL 5.6.12 и Apache 2.4.12.

Я должен упомянуть, что у меня есть "FacebookCanvasLoginHelper();" включен в этот код, однако этот PHP-скрипт будет запускаться только в конце игры, когда игрок уже вошел в систему и предоставил все необходимые разрешения, поэтому я не уверен, что необходимо выполнять эту проверку здесь?

Любая помощь в этом будет очень признательна! :)


Обновлять:

Привет, @Phillip, еще раз спасибо за ваш ответ, я пытался работать с кодом, который вы мне дали, но он все еще дает мне ошибку, я надеюсь, что вы снова поможете.

Я ввел свой AppID и секрет рядом с FacebookSession::setDefaultApplication. И снова ввел свой AppID и URL-адрес моей игры на Facebook в скрипте для «if(!isset($session)) //Перенаправить в диалоговое окно входа».

После того, как вы определили $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>  

И это даст мне вывод «Адрес игрока: (URL-адрес моей (в настоящее время) учетной записи facebook)». Но я не могу использовать оператор вставки PHP, чтобы поместить «ссылку» в мою базу данных, возможно, я ожидаю, что переменные из соединения, созданного Javascript SDK, также будут использоваться PHP SDK, и это невозможно, может быть, мне нужно инициировать совершенно новое соединение с помощью PHP SDK, чтобы иметь возможность выполнять оператор Insert с PHP?

Я не понимаю, почему код, который вы мне дали, продолжает перенаправлять меня на страницу моей игры и, кажется, не устанавливает соединение, когда я уже вошел в систему. Я уверен, что здесь не хватает чего-то очень простого. :s Я очень ценю вашу помощь в этом! :)


person Emily    schedule 14.03.2015    source источник
comment
Вы объединяете две разные версии PHPH SDK. $facebook не существует в вашем коде и не создается PHP SDK 4.0+.   -  person Phillip    schedule 16.03.2015
comment
Ах! Спасибо за ответ! Боюсь, код, который у меня сейчас есть, — настоящий беспорядок. :( То, что вы сказали о том, что $facebook не существует, имеет смысл, так как я получаю уведомление об ошибке: Неопределенная переменная: facebook в... всякий раз, когда я запускаю страницу.   -  person Emily    schedule 16.03.2015
comment
@Phillip, если $user_profile = $facebook-›api('/me'); $fbid = $user_profile['id']; не будет работать из-за того, что $facebook не работает с моей версией SDK, какую строку кода я должен использовать, чтобы получить информацию о пользователе/создать переменную для идентификатора пользователя? Спасибо еще раз!   -  person Emily    schedule 16.03.2015
comment
Привет @Phillip, я написал обновление к своему вопросу, потому что он был слишком длинным, чтобы добавить его в качестве комментария, еще раз спасибо!   -  person Emily    schedule 16.03.2015
comment
Вы должны перенаправить в диалоговое окно OAuth для аутентификации с помощью PHP SDK. Вы также можете пройти аутентификацию с помощью JS SDK, но вы не сможете передавать информацию в PHP. В настройках вашего приложения в разделе «Миграции» все 3 параметра включены on? Также обновите свой код, чтобы отразить ваши изменения.   -  person Phillip    schedule 16.03.2015
comment
@Phillip Еще раз спасибо за вашу помощь и за объяснение проблемы аутентификации. Этот файл PHP, над которым я работаю, должен вызываться/запускаться всякий раз, когда выполняется определенное внутриигровое условие в файле .js (в настоящее время я использую AJAX для выполнения этого вызова). Я могу отобразить UserID игрока на странице с помощью класса span HTML, который вызывает переменную из файла .js (часть загрузки FriendSmash, которая содержит соединение GraphAPI с общедоступным профилем пользователя), но я не могу выяснить, почему код, который у меня есть прямо сейчас, не создаст сеанс в PHP.   -  person Emily    schedule 16.03.2015
comment
@Phillip Я проверил в разделе «Миграции», но есть только 2 варианта: защита URL-адреса потоковой публикации (ВЫКЛ) и расширенный диалог аутентификации (ВКЛ). В разделе «Дополнительно» для входа OAuth для клиента и входа OAuth для встроенного браузера установлено значение (YES), но я ничего не ввел в действительных URI перенаправления OAuth. Может ли тот факт, что я использую localhost (с сертификатом SSL), вызвать проблемы с созданием сеанса? Кроме того, мое приложение все еще находится в режиме разработки и не работает, может ли это повлиять на эти операции?   -  person Emily    schedule 16.03.2015
comment
Я перечитал ваш комментарий и заметил, что вы сказали, что это вызов AJAX. Вы должны использовать только код входа в свой файл index.php. Вызовы AJAX должны аутентифицироваться другим способом.   -  person Phillip    schedule 17.03.2015


Ответы (1)


Поскольку вы рядом, я просто опубликую то, что использую. Убедитесь, что вы прочитали документы, чтобы убедиться, что вы знаете, что происходит. Кроме того, используйте автозагрузчик, который предоставляет Facebook.

<?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('APP_ID','APP_SECRET');

$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 'APP_ID'; ?>&redirect_uri=<?php echo 'https://apps.facebook.com/my_app/'; ?>";
  </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();

?>
person Phillip    schedule 16.03.2015