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

用户一旦可以提名当地公司获奖。稍后的;一旦获得提名,用户就可以投票选出获胜者。和汇总(Organization)。我的主要目标是将这些操作转移到用户的时间轴上。

我以配方框示例为基础。我已经提供了代码来演示身份验证以及提交操作类型/对象类型组合所需的后操作。

<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>


测试用户遇到以下错误:

Requires extended permission: publish_actions


我遇到以下错误(我是该应用程序的管理员):

This method must be called with an app access_token 


第一个错误令我困扰。我无法从Nominate中选择Vote For。另外,我遇​​到的补救措施建议我将我的应用重新分类为Nominations(这不起作用),并完成我的汇总(我做了;仍然不起作用)。


如何我可以克服这个错误吗?
我该如何解决我的publish_actions错误?

提前感谢,

迈克

编辑

我相信我遇到的Apps | <My App> | Permissions | Extended Permissions错误是由于我在页面标签URL上直接测试/与该应用进行交互;不通过Facebook。

我不再收到Games;但是,我的测试人员和开发人员都是。我知道我遇到此错误,因为在初始facebook.com登录提示符下未要求publish_actions权限。

如果我的Developers / Testers注销了Facebook,请使用提示符重新登录: br />
FB.login(function (response) { }, { scope:'publish_actions'});


,然后此权限和应用程序集成到其Facebook会话中。

我的最后一个问题是-是否存在事实上的首选方法来请求此权限而无需登录/退出Facebook?

评论

我只能看到您在没有任何范围参数的情况下调用FB.login(),因此您期望在哪里实际授予权限publish_actions?

#1 楼

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

这些错误已解决:

1. Requires extended permission: publish_actions

2. This method must be called with an app access_token 


对于初学者,CBroe是正确的。由于我需要扩展权限(publish_actions),因此需要在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()将操作发布到用户的时间轴。这是我使用的代码:

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


我忽略了包含应用程序访问令牌。可以通过连接应用程序ID,后接管道和应用程序秘密的方式来构造应用程序访问令牌。

我使用PHP SDK来满足此请求,因为我想保持我的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());
}


希望有帮助!

#2 楼

对于第二个错误,请使用错误消息中的“应用访问令牌”进行呼叫;如果您已经在执行此操作,但失败了,请在facebook App Dashboard的应用程序设置中检查应用程序未设置为“本机/桌面”模式。如果是,则应用程序访问令牌是不受信任的,并且API会像您未提供它那样起作用。

首先,您确定用户是否向您的应用程序授予了publish_actions权限?使用用户的访问令牌对/me/permissions的调用将向您显示授予了哪些权限。请注意,经过身份验证的引荐/应用程序中心登录流程不同于通过身份验证的引荐或应用程序中心的最终用户,您的应用程序的常规流程是独立于应用程序的常规流程的,因此请确保在对Oauth的调用中,publish_actions中包含scope对话框。