php facebook sdk 不会在 wordpress 中创建用户

2024-01-16

编辑后的问题:

我试图在我的 WordPress 网站上使用 Facebook 登录插件this sdk https://stackoverflow.com/questions/6034813/facebook-uncaught-oauthexception-an-active-access-token-must-be-used-to-query-i?answertab=active#tab-top

当我点击 facebook 按钮登录或注册时,它会通过 facebook 打开一个小窗口,显示“继续”,但之后它不会在 wordpress 数据库中创建用户并破坏 wordpress 页脚,所以它显示An active access token must be used to query information about the current user.页面刷新后登录表单下的消息。

我完整的 facebook 登录 php 代码是这样的:

    <?php 
    include 'facebook/facebook.php';
    function gazi_fb_loginForm(){

            gazi_fb_error_message();

            gazi_fb_LoadScript();

            if(is_user_logged_in()==false){

            ?>

                <div class="facebook_wrapper">
                <img src="<?php echo plugin_dir_url(__FILE__).'images/facebook_or.png';?>" style="border:none; box-shadow:none;">
                <br>
                <a href="javascript:void(0)" onClick="FBLogin();">

                <img src="<?php echo plugin_dir_url(__FILE__).'images/facebook_button.png';?>" alt="Fb Connect" title="Login with facebook" /></a></div>

            <?php 

            } 

        }



    function gazi_fb_LoadScript(){

         global $wpdb;

         $gazi_option=$wpdb->prefix."gazi_option";

         $path =  plugin_dir_url(__FILE__);  // define path to link and scripts

        $pageURL = get_permalink();

        $sign = strpos($pageURL,'?')?'&':'?';

         //facebook app secret

    $qry1="SELECT value FROM $gazi_option WHERE fieldname='gazi_facebook_app_secret'";

    $facebook_app_secret = $wpdb->get_var($qry1);

    $qry2="SELECT value FROM $gazi_option WHERE fieldname='gazi_facebook_app_id'";

    $facebook_app_id = $wpdb->get_var($qry2);



         $facebook = new Facebook(array(

            'appId'     =>  $facebook_app_id,

            'secret'    => $facebook_app_secret,

            ));

        ?>

        <script type="text/javascript">
window.fbAsyncInit = function() {
 FB.init({
      appId      : '<?php echo $facebook_app_id; ?>',
      xfbml      : true,
        status     : true, 
       cookie     : true,
      version    : 'v2.1'
 });


FB.getLoginStatus(function(response) {
          if (response.status === 'connected') {
            console.log('Logged in.');
}
          else {
            console.log('initiate FB login...');
            FB.login();
          }
});

FB.api('/me/feed',function(response){
           var idDiv=document.getElementById('result');
           idDiv.textContent=JSON.stringify(response);
  }); 
};

(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));

function FBLogin(){
    FB.login(function(response){
        if(response.authResponse){
            window.location.href = "<?php echo $pageURL.$sign;?>option=fblogin";
        }
    }, {scope: 'email'});
}

    </script>

        <?php

        }



    function gazi_fb_error_message(){

            if(isset($_SESSION['msg'])){

                echo '<div class="'.$_SESSION['msg_class'].'">'.$_SESSION['msg'].'</div>';

                unset($_SESSION['msg']);

                unset($_SESSION['msg_class']);

            }

        }



    function gazi_fb_login_validate(){



        $path =  plugin_dir_url(__FILE__);  // define path to link and scripts

        $pageURL = get_permalink();

        $sign = strpos($pageURL,'?')?'&':'?';



        if(isset($_REQUEST['option']) && $_REQUEST['option']  == "fblogin"){

         global $wpdb;

         $gazi_option=$wpdb->prefix."gazi_option";

         //facebook app secret

          $qry1="SELECT value FROM $gazi_option WHERE fieldname='gazi_facebook_app_secret'";

          $facebook_app_secret = $wpdb->get_var($qry1);

          $qry2="SELECT value FROM $gazi_option WHERE fieldname='gazi_facebook_app_id'";

          $facebook_app_id = $wpdb->get_var($qry2);

            $facebook   = new Facebook(array(

                'appId' => $facebook_app_id,

                'secret' => $facebook_app_secret,

                'cookie' => TRUE,

            ));

            $fbuser = $facebook->getUser();

            if ($fbuser) {

                try {

                    $user_profile = $facebook->api('/me');

                }

                catch (Exception $e) {

                    echo $e->getMessage();

                    exit();

                }

                if (!isset($user_profile['email'])) $user_profile['email'] = $user_profile['id'] . '@facebook.com';

                $user_fbid  = $fbuser;

                $user_email = $user_profile["email"];

                $user_fnmae = $user_profile["first_name"];



              if( email_exists( $user_email )) { // user is a member 

                  $user = get_user_by('login', $user_email );

                  $user_id = $user->ID;


                  wp_set_auth_cookie( $user_id, true );

               } else { // this user is a guest

                  $random_password = wp_generate_password( 10, false );

                  $user_id = wp_create_user( $user_email, $random_password, $user_email );

                  update_user_meta($user_id, 'avtar_image', 'https://graph.facebook.com/' . $user_profile['id'] . '/picture?type=large');

                  wp_update_user(array(

                              'ID' => $user_id,

                              'display_name' => $user_profile['name'],

                              'first_name' => $user_profile['first_name'],

                              'last_name' => $user_profile['last_name']

                            ));

                  wp_set_auth_cookie( $user_id, true );

               }



                wp_redirect( $pageURL.$sign.'login4=1');

                exit;



            }       

        }

    }

    ?>

这是上面代码中的 javascript。

    <script type="text/javascript">

window.fbAsyncInit = function() {
 FB.init({
      appId      : '<?php echo $facebook_app_id; ?>',
      xfbml      : true,
        status     : true, 
       cookie     : true,
      version    : 'v2.1'
 });


FB.getLoginStatus(function(response) {
          if (response.status === 'connected') {
            console.log('Logged in.');
}
          else {
            console.log('initiate FB login...');
            FB.login();
          }
});

FB.api('/me/feed',function(response){
           var idDiv=document.getElementById('result');
           idDiv.textContent=JSON.stringify(response);
  }); 
};

(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));

function FBLogin(){
    FB.login(function(response){
        if(response.authResponse){
            window.location.href = "<?php echo $pageURL.$sign;?>option=fblogin";
        }
    }, {scope: 'email'});
}

        </script>

有谁知道如何让它发挥作用?我做错了什么?非常感谢任何帮助。

谢谢。

UPDATE:

我使用这个答案更改了文件中的一些行here https://stackoverflow.com/questions/6034813/facebook-uncaught-oauthexception-an-active-access-token-must-be-used-to-query-i?answertab=active#tab-top

改变了这一点: $fbuser = $facebook->getUser();

            if ($fbuser) {

                try {

                    $user_profile = $facebook->api('/me');

                }

                catch (Exception $e) {

                    echo $e->getMessage();

                    exit();

                }

对于这个:

$fbuser = $facebook->getUser();

$photo_details = array('message' => 'my place');
$file='photos/my.jpg'; //Example image file
$photo_details['image'] = '@' . realpath($file);

if ($fbuser) {
  try {
    // We have a valid FB session, so we can use 'me'
    $upload_photo = $facebook->api('/me/photos', 'post', $photo_details);
  } catch (FacebookApiException $e) {
    error_log($e);
  }

我现在已经注册了,但是很奇怪

WordPress 的用户名和昵称始终是@facebook :D

所以我认为它没有在这里获取变量:

if (!isset($user_profile['email'])) $user_profile['email'] = $user_profile['id'] . '@facebook.com'; and just keeping @facebook instead without the `$user_profile['id']`

请找到下面的示例代码。我使用 JavaScript SDK 进行登录,使用 PHP SDK 生成访问令牌。我希望它对你有用。

** HTML 代码:: **

    <html>

    <body>

  <p><a href="#" onClick="logInWithFacebook()">Log In with the JavaScript SDK</a></p>

  <script>
    logInWithFacebook = function() {
      FB.login(function(response) {
        if (response.authResponse) {
          alert('You are logged in &amp; cookie set!');
          location.href = "//localhost/facebook/testfb.php"
            // Now you can redirect the user or do an AJAX request to
            // a PHP script that grabs the signed request from the cookie.
        } else {
          alert('User cancelled login or did not fully authorize.');
        }
      });
      return false;
    };
    window.fbAsyncInit = function() {
      FB.init({
        appId: 'app-id',
        cookie: true, // This is important, it's not enabled by default
        version: 'v2.9'
      });
    };

    (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_US/sdk.js";
      fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));
  </script>
</body>

</html>

** PHP 代码 **

<?php
require_once('Facebook/autoload.php');
# /js-login.php
$fb = new Facebook\Facebook([
'app_id' => '{app-id}',
'app_secret' => '{app-secret}',
'default_graph_version' => 'v2.9',
]);

$helper = $fb->getJavaScriptHelper();


try {
    $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)) {
    echo 'No cookie set or no OAuth data could be obtained from cookie.';
    exit;
}



// The OAuth 2.0 client handler helps us manage access tokens
$oAuth2Client = $fb->getOAuth2Client();

// Get the access token metadata from /debug_token
$tokenMetadata = $oAuth2Client->debugToken($accessToken);


// Validation (these will throw FacebookSDKException's when they fail)
$tokenMetadata->validateAppId('{app-id}'); // Replace {app-id} with your app id
// If you know the user ID this access token belongs to, you can validate it here
//$tokenMetadata->validateUserId('123');
$tokenMetadata->validateExpiration();

if (! $accessToken->isLongLived()) {
  // Exchanges a short-lived access token for a long-lived one
  try {
    $accessToken = $oAuth2Client->getLongLivedAccessToken($accessToken);
  } catch (Facebook\Exceptions\FacebookSDKException $e) {
    echo "<p>Error getting long-lived access token: " . $helper->getMessage() . "</p>\n\n";
    exit;
  }

  echo '<h3>Long-lived</h3>';
  var_dump($accessToken->getValue());
}

$_SESSION['fb_access_token'] = (string) $accessToken;

try {
  // Returns a `Facebook\FacebookResponse` object
  $response = $fb->get('/me?fields=id,name,email', $accessToken->getValue());
} catch(Facebook\Exceptions\FacebookResponseException $e) {
  echo 'Graph returned an error: ' . $e->getMessage();
  exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
  echo 'Facebook SDK returned an error: ' . $e->getMessage();
  exit;
}

$user = $response->getGraphUser();

echo 'Name: ' . $user['name'];
echo 'Email: ' . $user['email'];

?>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

php facebook sdk 不会在 wordpress 中创建用户 的相关文章

  • 为什么 mysqli num_rows 总是返回 0?

    我在使用 mysqli 获取要返回的行数时遇到了问题 尽管确实有一些结果 但我每次都只是得到 0 if stmt mysqli gt prepare SELECT id title visible parent id FROM conten
  • 如何获取数组中最后 5 个元素(不包括第一个元素)?

    在 JavaScript 数组中 如何获取最后 5 个元素 排除第一个元素 1 55 77 88 would return 55 77 88 添加其他示例 1 55 77 88 99 22 33 44 would return 88 99
  • 带有嵌入式 Ruby 的 Javascript:如何安全地将 ruby​​ 值分配给 javascript 变量

    我在页面的 javascript 块中有这一行 res foo 处理这种情况的最佳方法是什么 ruby var里面有单引号吗 否则会破坏 JavaScript 代码 我想我会用红宝石JSON http json org ruby var 上
  • 如何在参数上使用 .reduce() 而不是特定的数组或对象?

    我想定义一个函数 flatten 将多个元素展平为一个数组 我知道以下是不可能的 但本质上我想这样做 var flatten function var flattened arguments reduce function acc elem
  • django ajax post 403被禁止

    使用 django 1 4 当我尝试从我的 javascript 做我的 django 服务器上的帖子时 我收到 403 错误 我的 get 工作正常 尽管问题仅出在帖子上 也尝试过 csrf exempt但没有运气 更新 我现在可以发布我
  • 对数字和字母元素的数组进行排序(自然排序)

    假设我有一个数组 var arr 1 5 ahsldk 10 55 3 2 7 8 1 2 75 abc huds 我尝试对其进行排序 我得到了类似的东西 1 1 10 2 2 3 5 55 7 75 8 abc ahsldk huds 注
  • PHP 5 的 SQLite 编译设置是什么?

    SQLite 3 7 附带了新的预写日志记录 WAL http www sqlite org wal html并且有很多设置可以被配置 http www sqlite org compile html 但是 似乎没有任何方法可以改变任何事情
  • PHP 和 ADODB 连接失败

    我的任务是迁移服务器 这包括移动我没有构建的应用程序 其中一些具有 ADODB connection 我似乎无法在新服务器上修复它 我只得到空白屏幕 我已经对 ADODB connection 与 PHP 进行了相当广泛的研究 但找不到明确
  • 全局定义的 AngularJS 控制器和封装

    根据 AngularJS 的教程 控制器函数仅位于全局范围内 http docs angularjs org tutorial step 04 http docs angularjs org tutorial step 04 控制器函数本身
  • Google 地图 v3 中标准缩放控件的样式

    有没有一种简单的方法可以在 Google Maps JavaScript API v3 中设置缩放控件的样式 我想要的只是改变标准图像 http maps gstatic com intl en ALL mapfiles mapcontro
  • Jade(当前称为“Pug”)模板引擎中的循环

    我想使用一个简单的循环 例如for int i 0 i lt 10 i 如何在 Jade 引擎中使用它 我正在使用 Node js 并使用expressjs 框架 例如 for var i 0 i lt 10 i li array i 你可
  • 在 中动态添加链接样式表 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 如何将链接
  • 盒式捆绑包与 MVC4 捆绑包

    我目前正在开发一个原型 ASP NET MVC 3 解决方案 该解决方案将用作多个项目重写的基础 来自 Web 表单 我的目标之一是跨应用程序实现一些脚本管理 而不是我们目前没有的目标 MVC 3有一个缺陷恕我直言 如果您需要在部分视图或模
  • 使用 JavaScript 从 URL 变量读取来加载不同的 CSS 样式表

    我试图在我的 WordPress 博客上使用两个不同的样式表 以便在通过 Web 访问页面时使用一个样式表 而在通过我们的 iOS 应用程序访问博客内容时使用另一个样式表 现在 我们将 app true 附加到来自 iOS 应用程序的 UR
  • 从 CodeIgniter 中的 URL 捕获哈希值 (#)

    我有一个看起来像的网址 mysite com transactions view 123456 效果很好 但是我的客户现在希望在 url 中包含 hashbang mysite com transactions view 123456 现在
  • 响应式菜单:悬停子菜单显示错误

    简而言之 我根据教程创建了一个响应式菜单 当您将鼠标悬停在投资组合按钮上时 菜单应该显示子菜单 而在移动模式下 您需要按该按钮才能显示子菜单 效果很好 问题是该教程有一个错误 如果您在桌面模式下按组合按钮 子菜单将不会再次显示 除非您按 单
  • Chrome Prerender 功能每次都会被取消

    我正在尝试 Chrome 中的预渲染功能 但是当我检查网络时 我可以看到任何链接的请求都被取消 我使用以下语法 我尝试了现场演示http prerender test appspot com http prerender test apps
  • 我可以防止将 Leaflet 地图平移到世界边缘之外吗?

    有没有办法限制平移到世界边缘之外 在这幅画中 棕色是世界 灰色是虚空 我想让它不可能像这样平移 Leaflet 允许您控制地图抵抗被拖出边界的程度maxBoundsViscosity选项 值 0 到 1 将其设置为最大值会完全禁用拖动出界
  • 使用 stopPropagation() 处理 React 事件委托

    我有一个 React 项目 应该可以放置在任何网站上 我的想法是 我托管一个 javascript 文件 人们放置一个具有特定 ID 的 div 然后 React 在该 div 中进行渲染 到目前为止 除了点击事件之外 这是有效的 这些事件
  • html5 canvas 使用图像作为蒙版

    是否可以使用具有形状的图像作为整个画布或画布内图像的蒙版 我想将图像放置在画布中 并在图像上添加蒙版 然后将其另存为新图像 您可以使用 source in globalCompositeOperation 将黑白图像用作蒙版 首先 将蒙版图

随机推荐

  • 注入存储库上的 IDisposable

    我有以下 ADO Net 存储库 public class Repository IRepository IDisposable private readonly IUnitOfWork UnitOfWork private SqlConn
  • 使用 Ext.grid.Panel.reconfigure() 破坏网格 RowEditing 插件

    我正在创建一个 extjs 网格面板 其中有一组用户可配置的列 这Ext grid Panel http docs sencha com ext js 4 1 api Ext grid Panel组件提供了一个方便的reconfigure
  • 如何将卫星程序集(本地化资源)包含在使用 WiX 构建的 MSI 中?

    我正在从事的项目正在从使用 VS2008 部署 安装程序切换到 WiX 我目前对 WiX 还很陌生 我添加了将资源项目的输出复制到 Resources dll 中的代码 但在旧的 VS2008 安装程序文件系统中 还存在本地化资源输出 该输
  • 调用 mouseClicked() 后 JComponent 消失

    我正在用 Swing 编写一个 Java GUI 程序 界面如下所示 当用户单击右侧的其中一张图片时 我希望在左上角的橙色区域中显示它的小预览 我通过以下方式从计算机上的目录中提取所有图像文件SwingWorker线程 http docs
  • 无法打开登录请求的服务器

    我正在尝试使用 pyodbc 连接到我的 Azure SQL 数据库 我正在使用的azure帐户位于用户名下 电子邮件受保护 cdn cgi l email protection 我的大学帐户 当我尝试连接到数据库时 出现错误 Cannot
  • 如何在轮子中包含和安装测试文件并部署到 Databricks

    我正在开发一些在 Databricks 上运行的代码 鉴于 Databricks 无法在本地运行 我需要在 Databricks 集群上运行单元测试 问题是当我安装包含我的文件的轮子时 测试文件永远不会安装 如何安装测试文件 理想情况下我想
  • 如何在使用 VS Code 调试之前执行批处理文件

    我正在使用 Typescript nodeJS 和 VS Code 进行开发 使用 VS Code 进行调试 我的配置中有launch json type node request launch name Launch via NPM ru
  • 如何在 WPF ListView 中查看最后添加的列表视图项

    我正在使用视图模型绑定到列表视图 每次我在视图模型内部可观察集合中添加一个项目时 我都会使用 list Count 1 触发 LastIndex 属性 列表视图绑定到 VM 的 LastIndex 属性 并且列表视图正确选择添加到视图的最后
  • Typescript getter 和 setter 错误

    好吧 这是我第一天使用 typescript 做一些 Angular 2 我尝试制作一个简单的 getter 和 setter 服务 import Injectable from angular2 core Injectable expor
  • JPA:请帮助理解“join fetch”

    我有以下实体结构 业务 gt 营销活动 gt 促销 其中一个业务可以有许多营销活动 一个营销活动可以有许多促销活动 两个一对多关系都被声明为 LAZY 在我的代码中的一处 我需要急切地从 Business 中获取这两个集合 所以我这样做 Q
  • 在 data.table 中动态创建过滤表达式 (i)

    有一个data table library data table dd lt data table x 1 10 y 10 1 z 20 20 我可以使用过滤它 dd x in c 1 3 z in c 12 20 x y z 1 1 10
  • 如何屏蔽 EditText 以显示 dd/mm/yyyy 日期格式

    我怎样才能格式化EditText遵循 dd mm yyyy 格式化的方式与我们使用 a 格式化的方式相同TextWatcher to mask用户输入看起来像 0 05 我不是在谈论限制字符或验证日期 只是屏蔽到以前的格式 我写了这个Tex
  • 替换属于特定类的所有元素

    我试图开发一个嵌入式小部件 用户将包括一个anchor标签和页面中的 JavaScript 它将呈现内容 类似于嵌入式推文 a href http localhost 3000 user 13 target blank class my w
  • 添加新代码后 jQuery.keynav 不起作用

    我正在使用 jquery keynav 插件使用五个键在网页上执行导航 问题在于 我使用的是荧光笔 div 它引导用户浏览网页 可以获取 div 中的内容 文本等 并且可以执行多个操作 但荧光笔 div 不起作用 而是包含在网页 任何网页
  • JSTL 格式日期忽略区域设置

    我想用 JSTL 本地化日期 并且我正在尝试像下面那样执行此操作
  • 将数据结构从 java 传递到 perl(反之亦然)

    几天前 我询问了如何将数据结构从 java 传递到 perl 反之亦然 其中之一就是 JSON 我玩过它 主要使用 Gson for java 看起来相当不错 唯一的问题是我的数据结构内部有引用 同一数据结构内的其他对象 目前 每个此类引用
  • 词汇中的“这个”是什么? [复制]

    这个问题在这里已经有答案了 有人可以给我简单介绍一下词汇 this 吗 与函数表达式相比 箭头函数表达式 也称为胖箭头函数 具有更短的语法 并且在词法上绑定 this 值 不绑定自己的 this arguments super 或 new
  • 允许 this 引用转义

    我希望能帮助您理解 Java 并发实践 中的以下内容 调用可重写的实例方法 既不是 构造函数中的 private 或 Final 也可以允许 这个参考逃避 这里的 转义 是否仅仅意味着我们可能在实例完全构造之前调用实例方法 我没有看到 th
  • 将 OpenID 与 Zend Framework 结合使用

    我希望我的网站能够完全执行 Stackoverflow 使用 openId 所做的操作 我正在梳理资料来源 之前我也曾在 facebook 上这样做过 但是 OpenID 方面没有取得太大进展 我想做的只是检测是否有人登录了谷歌 如果他们获
  • php facebook sdk 不会在 wordpress 中创建用户

    编辑后的问题 我试图在我的 WordPress 网站上使用 Facebook 登录插件this sdk https stackoverflow com questions 6034813 facebook uncaught oauthexc