2015-12-07 4 views
0

Имея проблему с PHP API/SDK для PHP, позвольте мне начать с описания: Я сделал сайт, на котором вы можете ввести «кавычки» (короткие сообщения), а затем после сохранения цитаты в сайт (читайте, тоже mysql db позади него), вы можете решить поделиться цитатой с Facebook, чтобы иметь возможность выиграть материал.Как определить обратный вызов из Facebook

Поток (как это должно работать) это:

  1. Пользователь открывает свой сайт, PHP получает URL входа из Facebook PHP API/SDK
  2. PHP читает & запомнит 'состояние' URL переменная из URL-адреса входа из вышеприведенного шага (который упоминает несколько сайтов, будет действительным способом идентификации пользователей)
  3. Пользователь сохраняет цитату, я храню переменную состояния сверху в записи db этой цитаты, поэтому я могу использовать он снова будет соответствовать возврату пользователей с сохраненными котировками.
  4. Пользователь решает выиграть, поэтому он/она нажимает кнопку Facebook share, что указывает на их браузер тоже URL-адрес для входа в Facebook с шага 1
  5. Браузер пользователя теперь просматривает некоторые страницы Facebook, где они должны разрешить доступ к приложению и разрешить им отправлять сообщения на свою стену
  6. После того, как пользователь предоставил упомянутый доступ, они возвращаются к URL-адресу обратного вызова моего сайта (который, похоже, совпадает с «исходным URL» с шага 4)
  7. PHP на моем сайте находит переменную состояния в возвращаемых переменных url (?), Проходит через базу данных, чтобы найти соответствующую запись кавычек, и если она найдена, она хранит некоторые пользовательские данные Facebook (идентификатор пользователя и путь к аватару) в связанная запись db.
  8. PHP продолжает публиковать свои ранее сохраненные цитаты на стене Facebook пользователя.

По существу, все работает, но самый важный бит, шаг 7, определяющий, кто возвращается через переменную состояния, не делает этого. Проблема в том, что я просто возвращаю длинную переменную «код» GET, а не переменную «state» GET, и нигде в документах API или в StackOverflow или через Google не могу найти, как изменить ее, state 'GET снова возвращается ...?

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

Я использую новейший API (facebook-php-sdk-v4-5.0.0.zip с утра) Ниже я поделился всем соответствующим кодом, который я использую для взаимодействия с PHP API/SDK для Facebook, весь этот код находится в index.php в public_html каталоге моего сайта, URL-адрес обратного вызова моего приложения - тот же самый index.php Этот код составлен из нескольких примеров и, по сути, работает, я просто не получаю необходимые переменная состояния.

require_once __DIR__ . '<PATH-TOO-FB-API>/src/Facebook/autoload.php'; 
session_start(); 

$fbStateCode = ""; // used to memorize state code 
$fbLoginUrl = ""; // user to memorize login url 

// Init the API 
// If you go end up testing this, dont forget too change <APP-ID> & <APP-SECRET> 
$fb = new Facebook\Facebook([ 
    'app_id' => '<APP-ID>', 
    'app_secret' => '<APP-SECRET>', 
    'default_graph_version' => 'v2.4', 
    'default_access_token' => isset($_SESSION['facebook_access_token']) ? $_SESSION['facebook_access_token'] : '<APP-ID>|<APP-SECRET>' 
]); 

// login helper 
$helper = $fb->getRedirectLoginHelper(); 

// try get an accesstoken (wich we only have if user returned from facebook after logging in) 
try { 
    $accessToken = $helper->getAccessToken(); 
} catch(Facebook\Exceptions\FacebookResponseException $e) { 
    //echo 'Graph returned an error: ' . $e->getMessage(); // When Graph returns an error 
} catch(Facebook\Exceptions\FacebookSDKException $e) { 
    //echo 'Facebook SDK returned an error: ' . $e->getMessage(); // When validation fails or other local issues 
} 

if (isset($accessToken)) { 
    // User is logged in! 
    try { 
     // Now we look up some details about the user 
     $response = $fb->get('/me?fields=id,name'); 
     $facebook_user = $response->getGraphUser(); 
     exit; //redirect, or do whatever you want 
    } catch(Facebook\Exceptions\FacebookResponseException $e) { 
     //echo 'Graph returned an error: ' . $e->getMessage(); 
    } catch(Facebook\Exceptions\FacebookSDKException $e) { 
     //echo 'Facebook SDK returned an error: ' . $e->getMessage(); 
    } 
    // if facebook_user has an id, we assume its a user and continue 
    if(isset($facebook_user['id'])) { 
     $avatarUrl = "http://graph.facebook.com/".$facebook_user['id']."/picture"; 
     // THE BELOW 8 LINES HANDLE LOADING A QUOTE FROM DB WITH MATCHING STATE AND SAVING 
     // ADDITIONAL DATA TOO IT, THE ONLY ISSUE HERE IS THAT $_GET['state'] DOESNT EXIST 
     // THE REST OF THIS PROCESS HAS ALREADY BEEN TESTED AND PROOFED TO BE WORKING 
     $curr_quote = Quotes::getQuoteByFbStateCode($_GET['state']); 
     $curr_quote_data = $curr_quote->getData(); 
     $curr_quote->updateData(array(
      "fb_access_token" => $accessToken, 
      "fb_uid" => $facebook_user['id'], 
      "fb_avatar_path" => $avatarUrl 
     )); 
     // Save it 
     if($curr_quote->save()) { // Success! quote in db was updated 
      // Now that we are logged in and have matched the returned user with a saved quote, we can post that quote too facebook 
      $_SESSION['facebook_access_token'] = (string) $accessToken; // storing the access token for possible use in the FB API init 
      // This is the data we post too facebook 
      $msg_data = array (
       'message' => $curr_quote_data['quote'] 
      ); 
      $response = $fb->post('/me/feed',$msg_data,$accessToken); // do the actual post (this, like everything else besides state variable, works) 
     } else { // Fail! quote in db was NOT updated?! 
      // handle errors 
     } 
    } 
} else { 
    // User is NOT logged in 
    // So lets build up a login url 
    $permissions = ['public_profile','publish_actions']; // we want these permissions (note, atm im the only tester, so while the app still needs to be reviewed for the 'publish_actions' permission, it works cuz i own the app and test with same fb account) 
    $fbLoginUrl = $helper->getLoginUrl('http://<WEBSITE-URL>/index.php', $permissions); // get the login url from the api providing callback url and permissions array 
    $fbLoginUrlParams = array(); 
    parse_str($fbLoginUrl, $fbLoginUrlParams); // store the url params in a new array so that we can (read next comment below) 
    $fbStateCode = $fbLoginUrlParams['state']; // read out and store the state url variable 
} 

Ниже здесь логика для сохранения новой цитаты в базу данных на основе взаимодействия с пользователем, и использования $fbStateCode, эта часть функций процесса в порядке, а также котировки спасаются со своими уникальными государственными ценностями, как они должен.

Так что это история, я пытаюсь сделать что-то, что я уверен, что это не что-то особенное, это просто плохо документировано или что-то в этом роде?

+0

_ «вы можете решить поделиться цитатой с Facebook, чтобы иметь возможность выиграть материал» _, то есть __not allowed__. Вы должны прочитать [Политика платформы] (https://developers.facebook.com/policy/#properuse), в частности в этом примере 4.5: _ «Только побудить человека войти в ваше приложение, ввести рекламную кампанию на странице своего приложения , или регистрация в месте. Не поощряйте другие действия ». _ Вы не можете создавать пользователей в своих собственных временных рамках для участия в конкурсе. – CBroe

+0

И вам не разрешено заполнять часть сообщения сообщения для них - сообщение должно быть создано на 100% пользователем, т. Е. Введенным пользователем. Таким образом, в этой форме вы никогда не получите свое приложение, одобренное Facebook, в разрешении. – CBroe

+0

@Cbroe Интересно, спасибо за хэдшоп, сообщит об этом тоже человеку, который попросил меня сделать указанный сайт/процесс. –

ответ

-1

Прочитайте документацию о state переменной here:

Параметр state представляет собой значение, которое обеспечивается клиентом до входа вэнь перенаправления на URL входа. Если он доступен, он будет отправлен обратно в URL-адрес обратного вызова.

Итак, если вы не указали какую-либо переменную состояния на шаге 1, вы не получите ни от FB (а также от любого другого API реализации oAuth2). Не будет никаких «волшебных» решений, которые появляются иначе, чем предоставление его выполнимого состояния вашего PHP-приложения на этапе 1.

Фактически параметр состояния должен дать любому клиенту возможность восстановить контекст, всякий раз, когда обратный вызов «происходит». Таким образом, содержание переменного состояния может быть идентификатором сеанса, идентификатор пользователя или любое другое значение, которое помогает восстановить (PHP) приложений контекста снова после получения обратного вызова

EDIT

я полагаю, что переменная состояния должна быть добавлена ​​где-то в этой функции здесь:

$helper = $fb->getRedirectLoginHelper(); 
+0

Хейя, во-первых, спасибо за ваш ответ, очень ценим. Тем не менее, я использую native (как и в native too fb sdk) функцию '$ helper-> getLoginUrl ('http: // /index.php', $ permissions);' , который фактически создает строку url, которая содержит состояние, и я использую эту строку url для запуска процесса facebook (т. е. укажите браузер пользователя тоже), что означает, что состояние действительно отправляется слишком FB, однако URL-адрес обратного вызова вызывается только с переменной «GET» кода, но нет 'state' GET variable –

+0

@ suicidal.banana Я думаю, вам следует снова прочитать ответ @ axel-amthor. «Параметр' state' - это значение, которое ** предоставляется клиентом ** до входа в систему ... ». Если вы проверите исходный код native, метод getLoginUrl использует класс 'pseudoRandomStringGenerator', что означает, что они создаются с клиентской стороны (ваше приложение) и, очевидно, возвратят ** random ** 'state'. Таким образом, вам придется создать еще один метод для получения уже сохраненного ** случайного состояния ** в методе getRedirectLoginHelper. – cwps

+0

Из [facebook docs] (https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow#logindialog): «_'state'. Произвольная уникальная строка, созданная вашим приложение для защиты от перекрестного запроса запроса._ " – cwps

0

Законченное переписывания много, теперь он работает отлично, не уверен, что отличается в настоящее время против того, что я имел, так что не могу реально обеспечить awnser для других, работающих в similair вопросов, извините, что.

@Cbroe; переправил хэдшоп, который вы мне тоже дали, буквально сказал «не наша проблема, а проблема компании, которая сделала концепцию», поэтому время покажет, действительно ли это когда-либо выйдет в режиме онлайн, все же, спасибо за хэд-ап: P

Смежные вопросы