From f49d16541cdc9c93fa6e64b6b6e13148a599ce8e Mon Sep 17 00:00:00 2001 From: Terry <2358269014@qq.com> Date: Thu, 27 Jul 2017 17:13:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=94=B9facebook=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E5=BA=93=E5=8C=85=E4=BB=A5=E5=8F=8A=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/FacebookController.php | 83 ++++++++++--------- .../controllers/FacebookController.php | 83 ++++++++++--------- .../Customer/controllers/GoogleController.php | 5 +- composer.json | 3 +- services/customer/Facebook.php | 44 +++------- 5 files changed, 104 insertions(+), 114 deletions(-) diff --git a/app/appfront/modules/Customer/controllers/FacebookController.php b/app/appfront/modules/Customer/controllers/FacebookController.php index 2e391f16..35a86fe7 100644 --- a/app/appfront/modules/Customer/controllers/FacebookController.php +++ b/app/appfront/modules/Customer/controllers/FacebookController.php @@ -9,10 +9,6 @@ namespace fecshop\app\appfront\modules\Customer\controllers; -use Facebook\FacebookRedirectLoginHelper; -use Facebook\FacebookRequest; -use Facebook\FacebookRequestException; -use Facebook\FacebookSession; use fecshop\app\appfront\modules\AppfrontController; use Yii; @@ -23,57 +19,66 @@ use Yii; class FacebookController extends AppfrontController { // http://fecshop.appfront.fancyecommerce.com/customer/facebook/loginv - /** * facebook 账号在facebook确认后,返回网站的url地址。 */ public function actionLoginv() { - Yii::$service->session->set('fbs', 1); + //Yii::$service->session->set('fbs', 1); $thirdLogin = Yii::$service->store->thirdLogin; $facebook_app_id = isset($thirdLogin['facebook']['facebook_app_id']) ? $thirdLogin['facebook']['facebook_app_id'] : ''; $facebook_app_secret = isset($thirdLogin['facebook']['facebook_app_secret']) ? $thirdLogin['facebook']['facebook_app_secret'] : ''; - FacebookSession::setDefaultApplication($facebook_app_id, $facebook_app_secret); - $redirectUrl = Yii::$service->url->getUrl('customer/facebook/loginv'); - $helper = new FacebookRedirectLoginHelper($redirectUrl, $facebook_app_id, $facebook_app_secret); + $fb = new \Facebook\Facebook([ + 'app_id' => $facebook_app_id, + 'app_secret' => $facebook_app_secret, + 'default_graph_version' => 'v2.10', + ]); + $helper = $fb->getRedirectLoginHelper(); + if (isset($_GET['state'])) { + $helper->getPersistentDataHandler()->set('state', $_GET['state']); + } try { - $session = $helper->getSessionFromRedirect(); - } catch (FacebookRequestException $ex) { - // When Facebook returns an error - } catch (Exception $ex) { + $accessToken = $helper->getAccessToken(); + } catch(\Facebook\Exceptions\FacebookResponseException $e) { + // When Graph returns an error + echo 'Graph returned an error: ' . $e->getMessage(); + exit; + } catch(\Facebook\Exceptions\FacebookSDKException $e) { // When validation fails or other local issues + echo 'Facebook SDK returned an error: ' . $e->getMessage(); + exit; + } + if (! isset($accessToken)) { + if ($helper->getError()) { + header('HTTP/1.0 401 Unauthorized'); + echo "Error: " . $helper->getError() . "\n"; + echo "Error Code: " . $helper->getErrorCode() . "\n"; + echo "Error Reason: " . $helper->getErrorReason() . "\n"; + echo "Error Description: " . $helper->getErrorDescription() . "\n"; + } else { + header('HTTP/1.0 400 Bad Request'); + echo 'Bad request'; + } + exit; } - //echo 1; - //var_dump($session); - // see if we have a session - if (isset($session)) { - // graph api request for user data - $request = new FacebookRequest($session, 'GET', '/me'); - $response = $request->execute(); - // get response - $graphObject = $response->getGraphObject(); - $fbid = $graphObject->getProperty('id'); // To Get Facebook ID - $fbfullname = $graphObject->getProperty('name'); // To Get Facebook full name - $femail = $graphObject->getProperty('email'); // To Get Facebook email ID - /* ---- Session Variables -----*/ - $_SESSION['FBID'] = $fbid; - $_SESSION['FULLNAME'] = $fbfullname; - $_SESSION['EMAIL'] = $femail; - $this->accountLogin(); + $fb->setDefaultAccessToken($accessToken->getValue()); + $response = $fb->get('/me?locale=en_US&fields=name,email'); + $userNode = $response->getGraphUser(); + $email = $userNode->getField('email'); + $name = $userNode['name']; + $fbid = $userNode['id']; + if ($email) { + $this->accountLogin($fbid,$name,$email); exit; } else { $loginUrl = $helper->getLoginUrl(); header('Location: '.$loginUrl); } } - // facebook账户登录 - public function accountLogin() + public function accountLogin($fbid,$name,$email) { - $fb_id = $_SESSION['FBID']; - $full_name = $_SESSION['FULLNAME']; - $email = $_SESSION['EMAIL']; - $name_arr = explode(' ', $full_name); + $name_arr = explode(' ', $name); $first_name = $name_arr[0]; $last_name = $name_arr[1]; $user = [ @@ -82,9 +87,9 @@ class FacebookController extends AppfrontController 'email' =>$email, ]; Yii::$service->customer->registerThirdPartyAccountAndLogin($user, 'facebook'); - echo ''; exit; } diff --git a/app/apphtml5/modules/Customer/controllers/FacebookController.php b/app/apphtml5/modules/Customer/controllers/FacebookController.php index 6284624d..dad59d4b 100644 --- a/app/apphtml5/modules/Customer/controllers/FacebookController.php +++ b/app/apphtml5/modules/Customer/controllers/FacebookController.php @@ -9,10 +9,6 @@ namespace fecshop\app\apphtml5\modules\Customer\controllers; -use Facebook\FacebookRedirectLoginHelper; -use Facebook\FacebookRequest; -use Facebook\FacebookRequestException; -use Facebook\FacebookSession; use fecshop\app\apphtml5\modules\AppfrontController; use Yii; @@ -23,43 +19,57 @@ use Yii; class FacebookController extends AppfrontController { // http://fecshop.apphtml5.fancyecommerce.com/customer/facebook/loginv - /** * facebook 账号在facebook确认后,返回网站的url地址。 */ public function actionLoginv() { - Yii::$service->session->set('fbs', 1); + //Yii::$service->session->set('fbs', 1); $thirdLogin = Yii::$service->store->thirdLogin; $facebook_app_id = isset($thirdLogin['facebook']['facebook_app_id']) ? $thirdLogin['facebook']['facebook_app_id'] : ''; $facebook_app_secret = isset($thirdLogin['facebook']['facebook_app_secret']) ? $thirdLogin['facebook']['facebook_app_secret'] : ''; - FacebookSession::setDefaultApplication($facebook_app_id, $facebook_app_secret); - $redirectUrl = Yii::$service->url->getUrl('customer/facebook/loginv'); - $helper = new FacebookRedirectLoginHelper($redirectUrl, $facebook_app_id, $facebook_app_secret); + $fb = new \Facebook\Facebook([ + 'app_id' => $facebook_app_id, + 'app_secret' => $facebook_app_secret, + 'default_graph_version' => 'v2.10', + ]); + $helper = $fb->getRedirectLoginHelper(); + if (isset($_GET['state'])) { + $helper->getPersistentDataHandler()->set('state', $_GET['state']); + } try { - $session = $helper->getSessionFromRedirect(); - } catch (FacebookRequestException $ex) { - // When Facebook returns an error - } catch (Exception $ex) { + $accessToken = $helper->getAccessToken(); + } catch(\Facebook\Exceptions\FacebookResponseException $e) { + // When Graph returns an error + echo 'Graph returned an error: ' . $e->getMessage(); + exit; + } catch(\Facebook\Exceptions\FacebookSDKException $e) { // When validation fails or other local issues + echo 'Facebook SDK returned an error: ' . $e->getMessage(); + exit; + } + if (! isset($accessToken)) { + if ($helper->getError()) { + header('HTTP/1.0 401 Unauthorized'); + echo "Error: " . $helper->getError() . "\n"; + echo "Error Code: " . $helper->getErrorCode() . "\n"; + echo "Error Reason: " . $helper->getErrorReason() . "\n"; + echo "Error Description: " . $helper->getErrorDescription() . "\n"; + } else { + header('HTTP/1.0 400 Bad Request'); + echo 'Bad request'; + } + exit; } - //echo 1; - //var_dump($session); - // see if we have a session - if (isset($session)) { - // graph api request for user data - $request = new FacebookRequest($session, 'GET', '/me'); - $response = $request->execute(); - // get response - $graphObject = $response->getGraphObject(); - $fbid = $graphObject->getProperty('id'); // To Get Facebook ID - $fbfullname = $graphObject->getProperty('name'); // To Get Facebook full name - $femail = $graphObject->getProperty('email'); // To Get Facebook email ID - /* ---- Session Variables -----*/ - $_SESSION['FBID'] = $fbid; - $_SESSION['FULLNAME'] = $fbfullname; - $_SESSION['EMAIL'] = $femail; - $this->accountLogin(); + $fb->setDefaultAccessToken($accessToken->getValue()); + $response = $fb->get('/me?locale=en_US&fields=name,email'); + $userNode = $response->getGraphUser(); + $email = $userNode->getField('email'); + $name = $userNode['name']; + $fbid = $userNode['id']; + //echo $email.$name.$fbid;exit; + if ($email) { + $this->accountLogin($fbid,$name,$email); exit; } else { $loginUrl = $helper->getLoginUrl(); @@ -68,12 +78,9 @@ class FacebookController extends AppfrontController } // facebook账户登录 - public function accountLogin() + public function accountLogin($fbid,$name,$email) { - $fb_id = $_SESSION['FBID']; - $full_name = $_SESSION['FULLNAME']; - $email = $_SESSION['EMAIL']; - $name_arr = explode(' ', $full_name); + $name_arr = explode(' ', $name); $first_name = $name_arr[0]; $last_name = $name_arr[1]; $user = [ @@ -82,9 +89,9 @@ class FacebookController extends AppfrontController 'email' =>$email, ]; Yii::$service->customer->registerThirdPartyAccountAndLogin($user, 'facebook'); - echo ''; exit; } diff --git a/app/apphtml5/modules/Customer/controllers/GoogleController.php b/app/apphtml5/modules/Customer/controllers/GoogleController.php index 4fb88989..cb420b80 100644 --- a/app/apphtml5/modules/Customer/controllers/GoogleController.php +++ b/app/apphtml5/modules/Customer/controllers/GoogleController.php @@ -66,10 +66,7 @@ class GoogleController extends AppfrontController Yii::$service->customer->registerThirdPartyAccountAndLogin($user, 'google'); echo ''; exit; } diff --git a/composer.json b/composer.json index b2909f02..0fbc4429 100644 --- a/composer.json +++ b/composer.json @@ -29,6 +29,7 @@ "yiisoft/yii2-mongodb": "~2.1.0" , "skeeks/yii2-assets-auto-compress": "*", "ramsey/uuid": "*", + "facebook/graph-sdk": "*", "hightman/xunsearch": "*@beta" }, "autoload": { @@ -37,6 +38,6 @@ } }, "config": { - "process-timeout": 1800 + "process-timeout": 1800 } } diff --git a/services/customer/Facebook.php b/services/customer/Facebook.php index 97479006..51ae3398 100644 --- a/services/customer/Facebook.php +++ b/services/customer/Facebook.php @@ -9,8 +9,6 @@ namespace fecshop\services\customer; -use Facebook\FacebookRedirectLoginHelper; -use Facebook\FacebookSession; use fecshop\services\Service; use Yii; @@ -24,39 +22,21 @@ class Facebook extends Service public $facebook_app_id; public $facebook_app_secret; - public function initParam() - { - $store = Yii::$service->store->store; - if (isset($store['thirdLogin']['facebook']['facebook_app_secret'])) { - $this->facebook_app_secret = $store['thirdLogin']['facebook']['facebook_app_secret']; - } - if (isset($store['thirdLogin']['facebook']['facebook_app_id'])) { - $this->facebook_app_id = $store['thirdLogin']['facebook']['facebook_app_id']; - } - } - // 得到facebook登录的url。 public function getLoginUrl($urlKey) { - $this->initParam(); - session_start(); - $thirdLogin = Yii::$service->store->thirdLogin; - $this->facebook_app_id = isset($thirdLogin['facebook']['facebook_app_id']) ? $thirdLogin['facebook']['facebook_app_id'] : ''; + $redirectUrl = Yii::$service->url->getUrl($urlKey); + $thirdLogin = Yii::$service->store->thirdLogin; + $this->facebook_app_id = isset($thirdLogin['facebook']['facebook_app_id']) ? $thirdLogin['facebook']['facebook_app_id'] : ''; $this->facebook_app_secret = isset($thirdLogin['facebook']['facebook_app_secret']) ? $thirdLogin['facebook']['facebook_app_secret'] : ''; - - if ($this->facebook_app_secret && $this->facebook_app_id) { - //echo $this->facebook_app_secret; - //echo $this->facebook_app_id; - FacebookSession::setDefaultApplication($this->facebook_app_id, $this->facebook_app_secret); - $redirectUrl = Yii::$service->url->getUrl($urlKey); - //echo $redirectUrl;exit; - $facebook = new FacebookRedirectLoginHelper($redirectUrl, $this->facebook_app_id, $this->facebook_app_secret); - - $facebook_login_url = $facebook->getLoginUrl([ - 'req_perms' => 'email,publish_stream', - ]); - - return $facebook_login_url; - } + $fb = new \Facebook\Facebook([ + 'app_id' => $this->facebook_app_id, + 'app_secret' => $this->facebook_app_secret, + 'default_graph_version' => 'v2.10', + ]); + $helper = $fb->getRedirectLoginHelper(); + $permissions = ['email']; // Optional permissions + $loginUrl = $helper->getLoginUrl($redirectUrl, $permissions); + return $loginUrl; } } -- GitLab