6

我正在开发会员订购系统,我想让用户无需注册,他们可以直接使用 Facebook 登录。

问题是,这种方法的数据流是什么?例如,Facebook 是否返回用户帐户/ID/电子邮件或任何其他信息,以便我可以将它们插入我的系统,或者它只是表明他/她已登录的会话?

另外,我想收集他们的电话号码(用于订单确认)。如果访问者没有在他们的 Facebook 帐户中具体说明,如何处理

以下是我研究后的代码,但似乎只能返回会员ID?

<?php

    define('YOUR_APP_ID', 'YOUR APP ID');

    //uses the PHP SDK.  Download from https://github.com/facebook/php-sdk
    require 'facebook.php';

    $facebook = new Facebook(array(
      'appId'  => YOUR_APP_ID,
      'secret' => 'YOUR APP SECRET',
    ));

    $userId = $facebook->getUser();

    ?>

    <html>
      <body>
        <div id="fb-root"></div>
        <?php if ($userId) { 
          $userInfo = $facebook->api('/' . $userId); ?>
          Welcome <?= $userInfo['name'] ?>
        <?php } else { ?>
        <fb:login-button></fb:login-button>
        <?php } ?>


            <div id="fb-root"></div>
            <script>
              window.fbAsyncInit = function() {
                FB.init({
                  appId      : 'YOUR_APP_ID', // App ID
                  channelUrl : '//WWW.YOUR_DOMAIN.COM/channel.html', // Channel File
                  status     : true, // check login status
                  cookie     : true, // enable cookies to allow the server to access the session
                  xfbml      : true  // parse XFBML
                });
            FB.Event.subscribe('auth.login', function(response) {
              window.location.reload();
            });
              };
              // Load the SDK Asynchronously
              (function(d){
                 var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
                 if (d.getElementById(id)) {return;}
                 js = d.createElement('script'); js.id = id; js.async = true;
                 js.src = "//connect.facebook.net/en_US/all.js";
                 ref.parentNode.insertBefore(js, ref);
               }(document));
            </script>

      </body>
    </html>
4

6 回答 6

4

那么你有没有注意到你的线路上有这个:

<?php if ($userId) { 
      $userInfo = $facebook->api('/' . $userId); ?>
      Welcome <?= $userInfo['name'] ?>
    <?php } else { ?>
    <fb:login-button></fb:login-button>
    <?php } ?>

您可以这样做,而不是使用 $userId:

$userInfo = $facebook->api('/me','GET');

这将为您提供有关当前登录用户的信息。

现在,当用户授予您网站的权限时,facebook API 返回的数据取决于您向用户请求的权限。在这里,您可以找到返回的用户对象数据列表以及相应的权限,以备不时之需。 https://developers.facebook.com/docs/reference/api/user/

由于您需要的一些数据,如手机号码或电子邮件地址,在 facebook 上不是强制性的,也许对您来说最好的方法是使用注册表单: https ://developers.facebook.com/docs/plugins/登记/

注册插件可让人们使用他们的 Facebook 帐户轻松注册您的网站。该插件是一个简单的 iframe,您可以将其放入您的页面。登录 Facebook 后,人们会在适当的情况下看到一个预先填写了他们的 Facebook 信息的表单。

注册插件让您可以灵活地询问无法通过 Facebook API 获得的其他信息(例如,某人最喜欢的电影)。该插件还允许没有 Facebook 帐户或不希望使用 Facebook 注册您的网站的人使用与连接 Facebook 的人相同的表单。这消除了您提供两个单独的登录体验的需要。

于 2013-10-15T15:38:24.767 回答
2

您可以使用以下 URL 查看可以从 Facebook 获得的所有信息。

https://developers.facebook.com/tools/explorer

我们可以从 Facebook 获得的信息很容易理解。

我个人的建议是坚持使用用于 Facebook 集成的 java-script API,我发现它更有用。要使用 Facebook 图形 API 获取有关任何用户的信息,您将需要一个访问令牌,因此流程显然应该从那里开始,然后初始化您的每个请求,如果在处理您的响应后 Facebook 帐户中没有电话号码应该以另一种方式请求电话号码,我希望上面的 URL 将帮助您了解您可以向 Facebook 请求的有关用户的所有信息。

于 2013-10-17T12:19:14.690 回答
1

我建议您使用经过良好测试的库,例如OpauthHybridAuth

有了它们,您可以要求 Facebook 存储的任何额外数据。您还可以使用其他网站(例如 Google 或 Twitter)进行身份验证。

请务必遵循Facebook 的建议,不要一次要求所有权限。至少,尝试以 Facebook 用户身份登录,看看是否只向用户显示了一个请求权限的对话框。某些权限(例如创建事件)不止一次要求用户授权。这是使他们退出您的网站的可靠方法。

看到您似乎无法确定该电子邮件地址是否已通过 Facebook 验证

于 2013-10-17T03:18:58.330 回答
1

虽然这不是一个直接的答案,但我建议你在 github 上研究这个 cake-php 插件的实现

https://github.com/webtechnick/CakePHP-Facebook-Plugin

于 2013-10-17T12:40:48.210 回答
1

如果您使用 PHP,为什么不使用 FB 提供的 PHP 包装 API 而不是 JS。我一直在我的 PHP 项目中使用HybridAuth,您应该尝试一下,其优势是,您可以在未来轻松添加更多提供商,例如 Google、Twitter,而无需在您认为需要集成时通过每个 API更多社交功能。

于 2013-10-21T13:02:46.190 回答
1

我现在在一个项目中使用 Facebook SDK for PHP,这是我请求用户数据的方式:

// If user is not logged in, set the login URL asking for permissions
if( $userId == 0 ) {
      // Generate a login url
      $url = $facebook->getLoginUrl( array( 'scope' => 'email, user_status' ) );
      ... Your Login button ...
} else {
      // Get user's info
      $userdata = $facebook->api( '/me' );
      $data = array(
            'first_name'    => $userdata['first_name'],
            'last_name'     => $userdata['last_name'],
            'username'      => $userdata['username'],
            'email'         => $userdata['email'],
            'languages'     => $userdata['languages'],
            'locale'        => $userdata['locale'],
            'timezone'      => $userdata['timezone'],
            'gender'        => $userdata['gender'],
            'location'      => $userdata['location'],
            'hometown'      => $userdata['hometown'],
      );
      print_r( $data );
}
于 2013-10-21T22:59:37.643 回答