Facebook PHP SDK $ uid = $ facebook-> getUser()始终返回0

时间:2013-09-26 22:38:00

标签: facebook facebook-graph-api facebook-javascript-sdk facebook-php-sdk facebook-oauth

我正在尝试将我们的数据库与facebook API集成,这真的很新,所以我很感激一些帮助。

我总是0

使用

$uid = $facebook->getUser()

我看过类似的问题,但没有找到相关的解决方案。

PHP

if($_REQUEST['action']=="signup" && $_REQUEST['auth']=="facebook" && !empty ($_REQUEST['auth'])  && !empty ($_REQUEST['action']) )
{

require_once('libs/facebook/src/facebook.php');

$config = array();
$config['appId'] = 'xxxx';
$config['secret'] = 'xxxxxx';

$facebook = new Facebook($config);
$uid = $facebook->getUser();
echo $uid;
}

//else {} normal sign up here with all the error checking

HTML

<div class="fb-login-class">
      <div class="fb-login-button" autologoutlink="true" scope="publish_stream" perms="email,user_birthday" data-show-faces="false"
      data-width="200" data-max-rows="1"></div>
</div>

JAVASCRIPT / JQUERY

window.fbAsyncInit = function() {
    // init the FB JS SDK
    FB.init({
      appId      : 'XXXX,                        // App ID from the app dashboard
      channelUrl : '//WWW.XXXX.com', // Channel file for x-domain comms
      status     : true,                                 // Check Facebook Login status
      xfbml      : true                                  // Look for social plugins on the page
    });



    // Additional initialization code such as adding Event Listeners goes here
     // will be handled. 
  FB.Event.subscribe('auth.authResponseChange', function(response) {
    // Here we specify what we do with the response anytime this event occurs. 
    if (response.status === 'connected') {


      loginfunction();
    } else if (response.status === 'not_authorized') {

      FB.login(function(response) {},{scope: 'email'});
    } else {

      FB.login(function(response) {},{scope: 'email'});
    }
  });
  };

(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/en_GB/all.js#xfbml=1&appId=XXXXX";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));


function loginfunction() {
    console.log('Welcome!  Fetching your information.... ');
    FB.api('/me', function (response) {
        console.log(response);
/*I can see all the data here and the button also changes so I know that I am logged in */
        var data = 'action=signup&username=' + response.username + '&firstname=' + response.first_name + '&gender=' + response.gender + '&lastname=' + response.last_name + '&email=' + response.email + '&dob=' + "xxxx" + '&auth=facebook';
/*What's the point in passing all these parameters through ? only need to pass &auth=facebook and action=signup I guess the rest can be manipulated anyway so what's the point 
need to get them from PHP SDK (server side ajax call) */

        $.ajax({
            type: "POST",
            url: "actions/do_signup.php",
            data: data,
            beforeSend: function (html) {},
            success: function (html) {
                if (html == "success") {
                    window.location.replace("index.php");
                } else {}
            }
        });
    }, {
        scope: 'email'
    });
}

感谢

EDIT试图只用PHP仍然失败

require('facebook.php');
$facebook = new Facebook( array (
    'appId'  => 'xxx',
    'secret' => 'xxxx',
    'cookie' => true
  )
);


if ($_REQUEST['act']=="fb")
{
//$next_url = $facebook->getLoginStatusUrl($params);

if ($facebook->getUser()) {
       $userProfile = $facebook->api('/me');
       $uid = $facebook->getUser();
       // do logic
       echo  $uid ;
       echo "ok";
    } else {
    echo "problem";
      $loginUrl = $facebook->getLoginUrl($params = array('scope' => user_birthday,read_stream,'redirect_uri' => 'http://xxxx/index.php?act=success'));
      header('Location:' . $loginUrl);

    }
}
else if ($_REQUEST['act']=="success")
{
  try{
      $_SESSION['fbAT'] = $facebook->getAccessToken();
    }catch(Exception $e){
      trigger_error("FB AccessToken: " . $e->getMessage());
    }    
$facebook->setAccessToken($_SESSION['fbAT']);

if ($facebook->getUser()) {
        $uid = $facebook->getUser();
       $userProfile = $facebook->api('/me');

       // do logic
       echo  $uid ;
       echo $userProfile;
       echo "ok";
    } else {
    $uid = $facebook->getUser();
    echo  $uid ;
    echo "still problem";


    }

我尝试了一些步骤:

  • 沙盒模式已停用,我已确认应用ID和密码 还有...
  • 尝试添加标题:标题('P3P:CP =“IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT”');
  • 添加了Cookie'=&gt;真
  • 尝试从静态页面调用它,而不是通过ajax仍为0
  • 仅在facebook基本标签下使用网站
  • 在高级应用类型下设置为网络
  • 在权限下,默认活动为公开
  • 确保fb_ca_chain_bundle.crt与facebook.php也尝试使用不同目录的同一目录(与我的php文件相同)
    • 仅使用PHP和getLoginUrl以及其他范围来访问。
    • 尝试获取和设置访问令牌

2 个答案:

答案 0 :(得分:4)

在window.fbAsyncInit中我已将cookie和oauth设置为true,这很有效!

cookie:true,    
oauth : true.

确保在你的php中你也有

cookie' => true.

这将使PHP代码能够与JS集成。

答案 1 :(得分:0)

您需要确保用户已登录:

$loginUrl = $facebook->getLoginUrl(array( 'scope' => 'read_stream,etc..'));

范围由permissions stated here

定义

之后你应该能够做到:

$user = $facebook->api("/me");

哪个将获得与用户相关联的数组,$user['id']可能是您要存储的数据以及电子邮件地址等任何其他信息 - 请务必请求email scope

希望能解决问题!