我在系统中使用facebook用户id有困难。在通过facebook api方法getUser()
检索信息后,我无法从对getUser()
的任何后续调用中获得该id。
以下是将用户重定向到facebook登录的注册代码:
$this->view->layout ()->disableLayout ();
$this->_helper->viewRenderer->setNoRender ( true );
$appId = Ranger_Application_Util::getConfig('facebook_app_id');
$appSecret = Ranger_Application_Util::getConfig('facebook_app_secret');
require_once 'facebook/src/facebook.php';
$facebook = new Facebook(array(
'appId' => $appId,
'secret' => $appSecret,
'cookie' => true
));
$args = array();
$args['redirect_uri'] = 'http://url.com/en/account/callback-facebook';
$url = $facebook->getLoginUrl($args);
$redirector = Zend_Controller_Action_HelperBroker::getStaticHelper ( 'Redirector' );
$redirector->gotoUrl ( $url )->redirectAndExit ();
重定向代码:
$this->view->layout ()->disableLayout ();
$this->_helper->viewRenderer->setNoRender ( true );
$appId = Ranger_Application_Util::getConfig('facebook_app_id');
$appSecret = Ranger_Application_Util::getConfig('facebook_app_secret');
require_once 'facebook/src/facebook.php';
$facebook = new Facebook(array(
'appId' => $appId,
'secret' => $appSecret,
'cookie' => true
));
$accessToken = $facebook->getAccessToken();
$mdl = new Core_Model_Resource_Users();
$user = $facebook->getUser();
if($user){
try {
$profile = $facebook->api('/me');
$newUserId = $mdl->insert(array(
'fuid' => $user,
'facebook_access_token' => $accessToken,
'first_name' => $profile['first_name'],
'middle_name' => $profile['middle_name'],
'last_name' => $profile['last_name'],
'status' => 'active',
'verified' => 1,
'hash' => Ranger_Application_Util::generateHash(),
'acl_role' => 'client',
'avatar' => 'default.png',
'date_created' => new Zend_Db_Expr("NOW()"),
'date_updated' => new Zend_Db_Expr("NOW()"),
'username' => 'user'.Ranger_Application_Util::generateHash()
));
} catch(Exception $e){
echo "Issue getting user information. ".$e->getMessage();
die();
}
} else {
echo "Issue getting user information";
die();
}
现在这是我的zend插件, 检测facebook在中使用自动签名。这应该只在回调后激活。
public function preDispatch(Zend_Controller_Request_Abstract $request) {
$appId = Ranger_Application_Util::getConfig('facebook_app_id');
$appSecret = Ranger_Application_Util::getConfig('facebook_app_secret');
require_once 'facebook/src/facebook.php';
$facebook = new Facebook(array(
'appId' => $appId,
'secret' => $appSecret,
'cookie' => true
));
$user = $facebook->getUser();
if($user){
$fetchMode = Core::db()->getFetchMode();
Core::db()->setFetchMode(Zend_Db::FETCH_OBJ);
$userProfile = $facebook->api('/me');
$mdl = new Core_Model_Resource_Users();
$sel = $mdl->select();
$sel->where('fuid=:fuid')->bind(array(":fuid"=>$user));
(OR:) $sel->where('fuid=:fuid')->bind(array(":fuid"=>$userProfile['id']));
$data = $mdl->fetchRow($sel);
Core::db()->setFetchMode($fetchMode);
Ranger_Application_Util::logUserIn($data->id);
}
不管我做了多少次:
- 清除cookie和历史记录
- 使用
$facebook->destroySession()
方法
下面是MySQL的信息:
FUID -> INT(30)
FACEBOOK_ACCESS_TOKEN -> VARCHAR(255)
它仍然为我提供了两个不同的id从$user
在代码的检测部分此外,看起来只有在使用检测代码时,id是不相等的。
你知道我该怎么做吗?
你不应该使用2种不同的方法来获得你的用户id,坚持使用图形API是推荐的一个。$p = $facebook->api("/me"); $p['id']
重定向代码:
$this->view->layout ()->disableLayout ();
$this->_helper->viewRenderer->setNoRender ( true );
$appId = Ranger_Application_Util::getConfig('facebook_app_id');
$appSecret = Ranger_Application_Util::getConfig('facebook_app_secret');
require_once 'facebook/src/facebook.php';
$facebook = new Facebook(array(
'appId' => $appId,
'secret' => $appSecret,
'cookie' => true
));
$accessToken = $facebook->getAccessToken();
$mdl = new Core_Model_Resource_Users();
$user = $facebook->getUser();
if($user){
try {
$profile = $facebook->api('/me');
$newUserId = $mdl->insert(array(
'fuid' => $profile["id"],
'facebook_access_token' => $accessToken,
'first_name' => $profile['first_name'],
'middle_name' => $profile['middle_name'],
'last_name' => $profile['last_name'],
'status' => 'active',
'verified' => 1,
'hash' => Ranger_Application_Util::generateHash(),
'acl_role' => 'client',
'avatar' => 'default.png',
'date_created' => new Zend_Db_Expr("NOW()"),
'date_updated' => new Zend_Db_Expr("NOW()"),
'username' => 'user'.Ranger_Application_Util::generateHash()
));
} catch(Exception $e){
echo "Issue getting user information. ".$e->getMessage();
die();
}
} else {
echo "Issue getting user information";
die();
}
再次确保fuid
列设置为字符串类型MySQL varchar(200)
是我使用的facebook uid
public function preDispatch(Zend_Controller_Request_Abstract $request) {
$appId = Ranger_Application_Util::getConfig('facebook_app_id');
$appSecret = Ranger_Application_Util::getConfig('facebook_app_secret');
require_once 'facebook/src/facebook.php';
$facebook = new Facebook(array(
'appId' => $appId,
'secret' => $appSecret,
'cookie' => true
));
$user = $facebook->getUser();
if($user){
$fetchMode = Core::db()->getFetchMode();
Core::db()->setFetchMode(Zend_Db::FETCH_OBJ);
$userProfile = $facebook->api('/me');
$mdl = new Core_Model_Resource_Users();
$sel = $mdl->select();
$sel->where('fuid='.$userProfile['id']);
// i don't like bind for one variable php will be quicker using string concatenation
$data = $mdl->fetchRow($sel);
Core::db()->setFetchMode($fetchMode);
Ranger_Application_Util::logUserIn($data->id);
}
这就是你应该做的