Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Facebook需要扩展权限:发布操作_Facebook_Facebook Graph Api_Facebook Apps - Fatal编程技术网

Facebook需要扩展权限:发布操作

Facebook需要扩展权限:发布操作,facebook,facebook-graph-api,facebook-apps,Facebook,Facebook Graph Api,Facebook Apps,我正在开发一个与竞赛和促销相关的Facebook应用程序,我的目的是在我公司的页面上创建一个标签,提供对该应用程序的访问 一旦他们获得了奖励,用户就可以提名当地公司参加奖励。后来;一旦获得提名,用户就可以投票选出获胜者 我已经将Open Graph集成到我的应用程序中,这样我就可以利用对象类型(组织)、操作类型(提名、投票)和聚合(提名)。我的主要目标是将这些操作转移到用户的时间线上 我使用了recipebox示例作为基础。我提供了我的代码来演示提交操作类型/对象类型组合所需的身份验证和post

我正在开发一个与竞赛和促销相关的Facebook应用程序,我的目的是在我公司的页面上创建一个标签,提供对该应用程序的访问

一旦他们获得了奖励,用户就可以提名当地公司参加奖励。后来;一旦获得提名,用户就可以投票选出获胜者

我已经将Open Graph集成到我的应用程序中,这样我就可以利用对象类型(
组织
)、操作类型(
提名
投票
)和聚合(
提名
)。我的主要目标是将这些操作转移到用户的时间线上

我使用了recipebox示例作为基础。我提供了我的代码来演示提交操作类型/对象类型组合所需的身份验证和post操作

<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-US"> 
<head prefix="og: http://ogp.me/ns# og_<<app namespace>>: http://ogp.me/ns/apps/<<app namespace>>#"> 
    <meta property="fb:app_id" content="<<app id>>" /> 
    <meta property="og:type" content="<<app namespace>>:organization" /> 
    <meta property="og:title" content="Client 1" /> 
    <meta property="og:image" content="<<client image path>>" /> 
    <meta property="og:description" content="Client 1 description here ... " /> 
    <meta property="og:url" content="<<custom client URL>>">
    <script src="http://connect.facebook.net/en_US/all.js"></script>
    <script type="text/javascript">
        // 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));

        // Init the SDK upon load
        window.fbAsyncInit = function() {
            FB.init({
                appId      : '<<app id>>', // App ID
                status     : true, // check login status
                cookie     : true, // enable cookies to allow the server to access the session
                xfbml      : true  // parse XFBML
            });

            // listen for and handle auth.statusChange events
            FB.Event.subscribe('auth.statusChange', function(response) {
                if (response.authResponse) {
                    // user has auth'd your app and is logged into Facebook
                    FB.api('/me', function(me){
                        if (me.name) {
                            document.getElementById('auth-displayname').innerHTML = me.name;
                        }
                    })
                    document.getElementById('auth-loggedout').style.display = 'none';
                    document.getElementById('auth-loggedin').style.display = 'block';
                } else {
                    // user has not auth'd your app, or is not logged into Facebook
                    document.getElementById('auth-loggedout').style.display = 'block';
                    document.getElementById('auth-loggedin').style.display = 'none';
                }
            });

            // respond to clicks on the login and logout links
            document.getElementById('auth-loginlink').addEventListener('click', function(){
                FB.login();
            });
            document.getElementById('auth-logoutlink').addEventListener('click', function(){
                FB.logout();
            });
        }       

        function nominate () {
            FB.api('/me/<<app namespace>>:Nominate&organization=<<custom client URL>>', 'post',  function(response) {

                if (! response || response.error) {
                    alert('Error occured');
                    console.log(response);
                } else {
                    alert('Post was successful! Action ID: ' + response.id);
                }
            });
        }
    </script>
</head> 
<body> 
    <div id="fb-root"></div>
    <div id="auth-status">
        <div id="auth-loggedout">
            <a href="#" id="auth-loginlink">Login</a>
        </div>
        <div id="auth-loggedin" style="display:none">
            Hi, <span id="auth-displayname"></span>  
            (<a href="#" id="auth-logoutlink">logout</a>)
        </div>
    </div>
    <h2>Client 1</h2> 
    <form>
        <input type="button" value="Nominate" onclick="nominate()" />
    </form> 
    <fb:activity actions="<<app namespace>>:nominate"></fb:activity>
</body> 
</html>
我遇到以下错误(我是此应用程序的管理员):

第一个错误让我很不安。我无法从
Apps | | Permissions | Extended Permissions
中选择
publish_actions
。此外,我遇到的补救措施建议我将我的应用程序重新分类为游戏(这不起作用),并完成聚合(我做了;仍然不起作用)

  • 我怎样才能克服这个错误
  • 如何修复我的
    此方法必须使用应用程序访问令牌调用
    错误
  • 提前感谢,

    迈克

    编辑

    我相信我遇到的
    access\u token
    错误是因为我在页面选项卡URL上直接测试/与应用程序交互;不是通过Facebook

    我不再收到
    需要扩展权限:publish_actions error
    ;然而,我的测试人员和开发人员都是。我知道我遇到了这个错误,因为在最初的facebook.com登录提示中没有请求发布操作权限

    如果我的开发人员/测试人员注销Facebook,则在提示下重新登录:

    FB.login(function (response) { }, { scope:'publish_actions'});
    
    然后,此权限和应用程序将集成到他们的Facebook会话中


    我的最后一个问题是-是否有一种事实上的、首选的方法可以在不登录/退出Facebook的情况下请求此权限?

    对于第二个问题,请按照错误所述,使用您的密码拨打电话;如果您已经这样做了,但失败了,请在facebook应用程序仪表板的应用程序设置中检查应用程序是否未设置为“本机/桌面”模式。如果是,则应用程序访问令牌不受信任,API的行为就好像您没有提供它一样


    首先,您确定用户正在向您的应用授予发布操作权限吗?使用用户的访问令牌调用
    /me/permissions
    ,将显示授予的权限。请注意,经过身份验证的转介/应用程序中心登录流与用户的应用程序常规流是分开的,而不是通过经过身份验证的转介或应用程序中心,因此请检查您是否在调用Oauth对话框的
    范围
    中包含
    发布操作

    我已修复了这两个错误。感谢那些为我提供反馈并使我走上正确道路的人

    这些错误已得到解决:

    1. Requires extended permission: publish_actions
    
    2. This method must be called with an app access_token 
    
    首先,CBroe是正确的。由于我需要扩展权限
    (发布操作)
    我需要在
    FB.login()中的回调函数之后指定这是我的选项对象,如下所示:

    FB.login(function (response) {
        if (response.authResponse) { // The user has authenticated
            authenticatedSoDoSomething();
        } 
        else { // The user has not authenticated
            notAuthenticatedSoDoSomethingElse(); 
        }
    }, { scope:'publish_actions' });
    
    最后,我没有成功地使用JavaScript SDK通过
    FB.api()
    将操作发布到用户的时间线。这是I使用的代码:

    FB.api('/me/<<app namespace>>:<<my action>>&<<my object>>=<<a URL>>', 'post',
        function(response) {
            if (! response || response.error) {
                alert('Error occured');
            } else {
                alert('Post was successful! Action ID: ' + response.id);
            }
    })
    
    FB.api('/me/:&=','post',
    功能(响应){
    如果(!response | | response.error){
    警报(“发生错误”);
    }否则{
    警报(“发布成功!操作ID:”+响应.ID);
    }
    })
    
    我忽略了包括应用程序访问令牌。应用访问令牌可以通过连接应用id、管道和应用机密来构造

    我使用PHPSDK来实现这个请求,因为我想对我的api保密。以下是我使用的[大部分]代码:

    require_once('facebook-php-sdk/src/facebook.php');
    
    $facebook = new Facebook(
        array(
            'appId' => '<<my app id>>', 
            'secret' => '<<my app secret>>'));
    
    $user = $facebook->getUser();
    
    if ($user) {
        try {
            $user_profile = $facebook->api('/me');
        } 
        catch (FacebookApiException $e) {
            error_log($e);
            $user = null;
            echo json_encode(array('success' => false));
        }
    }
    
    try {
        $facebook->api('/' . $user . '/<<app namespace>>:<<my action>>&<<my object>>=<<a URL>>', 'POST', array('access_token' => $facebook->getAppId() . '|' . $facebook->getApiSecret()));
    }
    catch (FacebookApiException $e) {
        echo var_dump($e->getResult());
    }
    
    require_once('facebook-php-sdk/src/facebook.php');
    $facebook=新facebook(
    排列(
    “appId'=>”,
    '秘密'=>'');
    $user=$facebook->getUser();
    如果($user){
    试一试{
    $user_profile=$facebook->api('/me');
    } 
    捕获(FacebookApiException$e){
    错误日志($e);
    $user=null;
    echo json_编码(数组('success'=>false));
    }
    }
    试一试{
    $facebook->api('/'.$user'/:&=','POST',数组('access_-token'=>$facebook->getAppId()。'.$facebook->getApiSecret());
    }
    捕获(FacebookApiException$e){
    echo var_dump($e->getResult());
    }
    

    希望这有帮助

    我只能看到您调用
    FB.login()
    ,而没有任何
    范围
    参数–那么您希望在哪里实际授予权限
    发布操作
    FB.api('/me/<<app namespace>>:<<my action>>&<<my object>>=<<a URL>>', 'post',
        function(response) {
            if (! response || response.error) {
                alert('Error occured');
            } else {
                alert('Post was successful! Action ID: ' + response.id);
            }
    })
    
    require_once('facebook-php-sdk/src/facebook.php');
    
    $facebook = new Facebook(
        array(
            'appId' => '<<my app id>>', 
            'secret' => '<<my app secret>>'));
    
    $user = $facebook->getUser();
    
    if ($user) {
        try {
            $user_profile = $facebook->api('/me');
        } 
        catch (FacebookApiException $e) {
            error_log($e);
            $user = null;
            echo json_encode(array('success' => false));
        }
    }
    
    try {
        $facebook->api('/' . $user . '/<<app namespace>>:<<my action>>&<<my object>>=<<a URL>>', 'POST', array('access_token' => $facebook->getAppId() . '|' . $facebook->getApiSecret()));
    }
    catch (FacebookApiException $e) {
        echo var_dump($e->getResult());
    }