【问题标题】:Requesting facebook permissions on tab page in PHP在 PHP 中的标签页上请求 facebook 权限
【发布时间】:2014-08-17 04:17:08
【问题描述】:

我有一个 facebook pagetab 应用程序,但我陷入了以下情况

我需要检查用户是否登录

如果没有,则重定向到具有user_likes,publish_actions,email 权限的登录网址

还有用户是否喜欢页面。

如果不喜欢,则显示喜欢的门

现在在上面我遇到了我在 FB 页面标签中遇到的错误 (iFRAM)

拒绝在框架中显示“https://www.facebook.com/v2.0/dialog/oauth?client_id=839424369402407&redire…c8682d9a9fb5b&sdk=php-sdk-4.0.9&scope=email%2Cuser_likes%2Cpublish_actions”,因为它将“X-Frame-Options”设置为“DENY”。

现在我想用 JS sdk 实现流程,获取访问令牌,然后使用 ajax 调用将其传递给 php 代码

有没有更好的办法解决这种情况??

这里是代码

try {
    $session = $helper->getSessionFromRedirect();
} catch(FacebookRequestException $ex) {
    error_log($ex->getCode());
    error_log($ex->getMessage());
} catch(\Exception $ex) {
    error_log($ex->getCode());
    error_log($ex->getMessage());
}
if($_GET['error']=="access_denied"){
    header("location:/login/");
    exit;
}else if (isset($session) || (isset($_SESSION['fb_user_session_access_token'])) && !empty($_SESSION['fb_user_session_access_token'])) {
    if(isset($session))
        $_SESSION['fb_user_session_access_token'] = $session->getToken();
    else{
        $access_token = $_SESSION['fb_user_session_access_token'];
        $session = new FacebookSession($access_token);
    }

    try {
        $user_profile = (new FacebookRequest(
        $session, 'GET', '/me'
        ))->execute()->getGraphObject(GraphUser::className());
        $email =  $user_profile->getProperty('email');
        $name =  $user_profile->getProperty('name');
        $fb_id =  $user_profile->getProperty('id');
        $query = mysql_query("select id, email from ntuc_users where email = '$email'");
        $user_found = mysql_num_rows($query);
        if(!$user_found){
        //code deleted
        exit;
    } catch(FacebookRequestException $e) {
        error_log($e->getCode());
        error_log($e->getMessage());
        //if token get expired
        $loginUrl = $helper->getLoginUrl(array('req_perms' => 'email'));
        header("location:".$loginUrl);
        exit;
    }
}
else
{
  $loginUrl = $helper->getLoginUrl(array('req_perms' => 'email'));
  header("location:".$loginUrl);
  exit;
}

多谢了

【问题讨论】:

  • 关于like-gate,停止你现在正在做的事情。自 2014 年 11 月 5 日起,这将违反平台政策
  • @BjörnKaiser 你能解释一下what is wrong吗??
  • 首先,您正在构建的(如门控应用程序)违反 Facebook 平台政策,其次:您需要提交 user_likes 和 publish_actions 权限以供批准,至少 user_likes 不会由于上述原因,批准了您的应用程序。这更像是一个仅供参考,而不是解决您的问题,但这就是 cmets 的用途,我只是想为您节省一些工作;-)

标签: php facebook facebook-graph-api


【解决方案1】:

经过 2 天的研究,我得到了这个.. 这是我为我的应用实现的流程

@BjörnKaiser 提到 Facebook 政策不再支持 LIKEGATE .. 这是真的..

所以我已经通过了 FB 政策并得到了以下答案

仅激励用户登录您的应用,例如您应用的主页、在应用的主页上输入促销信息或在某个地方签到。不要激励其他行为。自 2014 年 11 月 5 日起,您可能不再鼓励人们喜欢您应用的主页

FB POLICY
然而作为参考。对于以上信息,我尝试实现likegate flow,但是FB APP审查团队的FB hardluck

但我又得到了一个参考。来自审核小组

请注意,使用“user_likes”来检查是否有人喜欢您的 Facebook 用例是不被批准的。 User_likes 为一个人的所有喜欢提供信息,并且应该使用所有这些数据来增强应用程序体验。如果您需要确定谁已经喜欢您的页面,请使用 Page Tab 应用程序的签名请求。

FB USER LIKE POLICY

使用signed requests,至少对于pagetab,它就像一个魅力:).. 但是对于移动网站,我已经删除了它

代码如下:

        if( isset($_REQUEST['signed_request']) )
        {
            $user_data = $this->parse_signed_request($_REQUEST['signed_request']);
            $access_token = $_SESSION['fb_user_session_access_token'];
        }
        if( (isset($user_data['page']["liked"]) && !empty($user_data['page']["liked"]) && $user_data['page']["liked"]) || $this->deviceType != "computer")//no like gate for mobile
        {
            //my code ...
        }


private function parse_signed_request($signed_request) {
    list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

    $secret = FB_APP_SECRET; // Use your app secret here

    // decode the data
    $sig = $this->base64_url_decode($encoded_sig);
    $data = json_decode($this->base64_url_decode($payload), true);

    // confirm the signature
    $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true);
    if ($sig !== $expected_sig) {
        $this->log->write('Bad Signed JSON signature!');
    return null;
    }

    return $data;
}

private function base64_url_decode($input) {
    return base64_decode(strtr($input, '-_', '+/'));
}

我希望它可以帮助别人......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 2015-01-19
    • 2013-02-23
    • 2012-08-07
    相关资源
    最近更新 更多