Как да вмъкнете потребителски данни от Facebook Canvas с помощта на PHP SDK в база данни с помощта на SQL

Наистина се надявам, че някой тук ще може да ми помогне, тъй като бях заседнал в това от 3 дни и не мога да го накарам да работи, независимо какво опитвам. :(

Създавам Facebook canvas игра и се опитвам да напиша PHP скрипт, който при стартиране ще вмъкне потребителския идентификатор на играча във Facebook в моята база данни, заедно с клеймо за време на събитието. Искам това да се случва всеки път, когато скриптът се изпълнява, така че в идеалния случай, ако играч активира този скрипт, да речем 5 пъти, тогава таблицата на базата данни ще запише техния ID 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) на localhost, моята php версия е 5.6.5, MySQL 5.6.12 и Apache 2.4.12.

Трябва да спомена, че имам "FacebookCanvasLoginHelper();" включени в този код, но този PHP скрипт ще се изпълнява само в късен момент от играта, когато играчът вече е влязъл и е дал всички необходими разрешения, така че не съм сигурен дали е необходимо да извършвам тази проверка тук?

Всяка помощ по този въпрос ще бъде изключително оценена! :)


Актуализация:

Здравей, @Phillip, благодаря отново за отговора ти, опитвах се да работя с кода, който ми даде, но все още ми дава грешка, надявам се, че можеш да помогнеш отново.

Въведох своя AppID и Secret до 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 Insert, за да поставя „връзката“ в моята база данни, може би очаквам променливите от връзката, направена от 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, има смисъл, тъй като получавах грешката Notice: Undefined variable: facebook in... всеки път, когато стартирам страницата.   -  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 на играча на страница, като използвам HTML span клас, който извиква променлива от .js файл (част от изтегления FriendSmash, който съдържа GraphAPI връзка с публичния профил на потребителя), но не мога разберете защо кодът, който имам в момента, не създава сесия в PHP.   -  person Emily    schedule 16.03.2015
comment
@Phillip Проверих под Миграции, но има само 2 опции: Защита на URL адреса на публикация в поток (ИЗКЛЮЧЕНО) и Разширен диалог за удостоверяване (ВКЛЮЧЕНО). Под Разширени имам както Client OAuth Login, така и Embedded Browser OAuth Login, зададени на (ДА), но нямам нищо въведено във валидни 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