Я пытаюсь интегрировать facebook для моего приложения canvas. Когда я запускаю приложение из facebook со следующим кодом
// init app with app id (APPID) and secret (SECRET) FacebookSession::setDefaultApplication('xx','xx'); $helper = new FacebookCanvasLoginHelper(); try { $data = array('oauth_token' => 'token'); $data['algorithm'] = 'HMAC-SHA256'; $data['issued_at'] = time(); $base64data = base64_encode(json_encode($data)); $rawSig = hash_hmac('sha256', $base64data, 'app_Secret', true); $sig = base64_encode($rawSig); $signedRequest = $sig.'.'.$base64data; $_GET['signed_request'] = $signedRequest; $session = $helper->getSession(); } catch(FacebookRequestException $ex) { echo $ex; } catch(\Exception $ex) { echo $ex; }
Вся страница просто становится пустой белой из-за $_GET['signed_request'] = $signedRequest;.
Что мне нужно сделать, чтобы войти в систему. Если я просто делаю $session = $helper->getSession();
вместо Get i получить недопустимые подписанные параметры oAuth данные отсутствуют.
Ваш PHP должен быть:
$helper = new FacebookCanvasLoginHelper(); try { $session = $helper->getSession(); if($session){ try { $facebook_profile = (new FacebookRequest( $session, 'GET', '/me' ))->execute()->getGraphObject(GraphUser::className()); echo $facebook_profile->getName; } catch(FacebookRequestException $e) { } } } catch(FacebookRequestException $ex) { echo $ex; } catch(\Exception $ex) { $facebookLoginHtml = "window.top.location = 'https://www.facebook.com/dialog/oauth?client_id={your_app_id}&redirect_uri={your_app_canvas_url}';"; }
А потом где-то в вашем HTML:
<script> <?php if(isset($facebookLoginHtml)){ echo $facebookLoginHtml; } ?> </script>
Если вы хотите запросить дополнительное разрешение, добавьте параметр области в URL-адрес следующим образом:
$facebookLoginHtml = "window.top.location = 'https://www.facebook.com/dialog/oauth?client_id={your_app_id}&redirect_uri={your_app_canvas_url}&scope=publish_actions';";
Это перенаправит страницу на страницу входа в систему, а затем вернется к вашему холстину с соответствующим разрешением.
Это не должно работать так, как это используется Javascript с PHP SDK. Это ошибка, с которой Facebook сталкивается, и вы можете следить за ней:
https://developers.facebook.com/bugs/722275367815777
Я отредактирую ответ, если эта ошибка когда-нибудь будет решена.
Спасибо, парни!
Мой подход:
<?php session_start(); require ({your_php_sdk_path} . 'autoload.php'); use Facebook\FacebookCanvasLoginHelper; use Facebook\FacebookRedirectLoginHelper; use Facebook\FacebookSession; use Facebook\FacebookRequest; use Facebook\GraphUser; FacebookSession::setDefaultApplication({your_app_id},{your_app_secret}); $helper = new FacebookCanvasLoginHelper(); try { $session = $helper->getSession(); }catch(FacebookRequestException $ex) { // When Facebook returns an error } catch(\Exception $ex) { // When validation fails or other local issues } if (!is_null($session)) { // Logged in try { //Get user name $user_profile = (new FacebookRequest( $session, 'GET', '/me' ))->execute()->getGraphObject(GraphUser::className()); $user_profile_name = $user_profile->getName(); //Get user picture $request = new FacebookRequest( $session, 'GET', '/me/picture', array ( 'redirect' => false, 'height' => '135', 'width' => '135', ) ); $response = $request->execute(); $graphObject = $response->getGraphObject(); $user_profile_picture = $graphObject->getProperty('url'); } catch(FacebookRequestException $e) { // When Facebook returns an error } catch(Exception $e) { // When validation fails or other local issues } }else{ //First time -> ask for authorization $helper = new FacebookRedirectLoginHelper({your_canvas_url}); $login_url = $helper->getLoginUrl(); } ?>
И в вашем html поставьте javascript:
<script type="text/javascript"> if($login_url != null){ top.location.href = $login_url; } </script>
<?php // init app with app id (APPID) and secret (SECRET) FacebookSession::setDefaultApplication('*********','*********' ); $helper = new FacebookCanvasLoginHelper(); try { $session = $helper->getSession(); } catch(FacebookRequestException $ex) { // When Facebook returns an error } catch(Exception $ex) { // When validation fails or other local issues } if($session) { // graph api request for user data $request = new FacebookRequest( $session, 'GET', '/me' ); $response = $request->execute(); // get response $graphObject = $response->getGraphObject(); // print data echo '<pre>' . print_r( $graphObject, 1 ) . '</pre>'; } else { // show login url echo '<a href="' . $helper->getLoginUrl($scope) . '">Login</a>'; } ?>