4

コンテストおよびプロモーション関連の Facebook アプリを開発中です。私の目的は、会社のページにアプリへのアクセスを提供するタブを作成することです。

ユーザーは地元企業を賞にノミネートすることができます。後で; ノミネートが完了すると、ユーザーは勝者に投票できます。

Organizationオブジェクト タイプ ( )、アクション タイプ ( NominateVote For)、および集計 ( )を利用できるように、Open Graph をアプリに統合しましたNominations。私の主な目的は、これらのアクションをユーザーのタイムラインに転送することです。

私はレシピボックスの例をベースとして使用しました。認証と、アクション タイプ/オブジェクト タイプの組み合わせを送信するために必要なポスト アクションを示すコードを提供しました。

<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 

最初のエラーは私にとって厄介です。publish_actionsから選べませんApps | <My App> | Permissions | Extended Permissions。また、私が遭遇した救済策は、アプリを再分類しGames(これは機能しません)、集計を完了することを示唆しています(私はしましたが、まだ機能しません)。

  1. どうすればこのエラーを克服できますか?
  2. エラーを修正する はどうすればよいですか?This method must be called with an app access_token

前もって感謝します、

マイク

編集

access_token発生したエラーは、ページ タブの URL でアプリを直接テスト/操作していたことが原因であると考えています。Facebook経由ではありません。

Requires extended permission: publish_actions error;を受け取っていません。ただし、私のテスターと開発者はそうです。facebook.com の最初のログイン プロンプトで publish_actions 権限が要求されないため、このエラーが発生していることはわかっています。

開発者/テスターが Facebook からログアウトした場合は、次のプロンプトで再度ログインします。

FB.login(function (response) { }, { scope:'publish_actions'});

次に、この許可とアプリが Facebook セッションに統合されます。

私の最後の質問は、Facebook にログイン/ログアウトせずにこの許可を要求するための事実上の推奨される方法はありますか?

4

2 に答える 2

2

両方のエラーを修正しました。フィードバックを提供し、私を正しい道に導いてくれた人々に感謝します。

これらのエラーは解決されました:

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、パイプ、アプリ シークレットを連結して作成できます。

API の秘密を隠しておきたかったので、PHP SDK を使用してこの要求を実行しました。私が使用したコードの[ほとんど]は次のとおりです。

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

お役に立てれば!

于 2012-09-07T17:18:43.737 に答える
0

2 つ目については、エラーが示すようにアプリ アクセス トークンを使用して呼び出しを行います。すでにこれを行っていて失敗する場合は、Facebook アプリ ダッシュボードのアプリの設定で、アプリが「ネイティブ/デスクトップ」モードに設定されていないことを確認してください。そうである場合、アプリ アクセス トークンは信頼されておらず、API は提供されていないかのように動作します。

まず、ユーザーがアプリに publish_actions 権限を付与していることを確認してください。/me/permissionsユーザーのアクセス トークンを使用して を呼び出すと、付与されている権限が表示されます。認証された紹介/アプリ センターのログイン フローは、認証された紹介またはアプリ センターを経由する以外のユーザー向けのアプリの通常のフローとは別のものであることに注意してください。そのため、Oauth ダイアログへの呼び出しに を含めていることを確認してくださいpublish_actionsscope

于 2012-08-24T00:15:01.460 に答える