【问题标题】:Facebook OAuthError - Can't post a public post to user's feedFacebook OAuthError - 无法将公开帖子发布到用户的提要
【发布时间】:2013-05-22 13:06:56
【问题描述】:

我希望能够发布到用户墙(他编辑的消息)。但是如果用户不允许代表他发帖,那么我会收到以下错误:

(#1) 创建共享时出错|OAuthException

然后我读到我可以通过再次将他发送到我的登录 url 来再次请求许可,但即使在允许它之后它也会发送相同的错误。

代码:

try{...
     $ret_obj = $facebook -> api('/' . $user_id . '/feed', 'POST', array('name' => $title, 'link' => $redirect_url, 'caption' => $ptnr_fb_caption, 'icon' => 'http://...logo-small.png', 'picture' => $ptnr_fb_img, 'message' => $desc, 'privacy' => $arrPriv));

} catch(FacebookApiException $e) {

        echo '<div id="text">Error :</div><br /><p style="width: 365px;margin: 0 auto;">Problem authenticating via Facebook, please allow us to share on your behalf.</p>';
        echo '<center><a href="https://www.facebook.com/dialog/oauth?client_id=<my_id>&redirect_uri=http://<mysite>/getFacebookData.php&display=popup&scope=email,publish_stream&type=web_server">Allow here</a><center>';

        //Send email to admin
        $subject = "ERROR Facebook";
        $body = "user email:" . $user_email . '| error:' . $e -> getMessage().'|'.$e->getType();
}

编辑: 我发现当我再次允许权限时(通过收到错误消息后的链接),只有“所有人”/公众会产生错误,而只有我和朋友不会。

更新 (@Axel Amthor):

$facebook = new Facebook( array('appId' => 'app_id', 'secret' => 'removed', ));

//We got after the authentication request
$access_token = $_POST['access_token'];

$facebook -> setAccessToken($access_token);
try {
    $user_info = $facebook -> api('/me');
    $user_id = $user_info['id'];
} catch (FacebookApiException $e) {
    //return 0;
}

更新 2: 范围相关代码:

$red_url = 'https://www.facebook.com/dialog/oauth?client_id=my_id&redirect_uri=http://mysite/facebook/getFacebookData.php&display=popup&scope=email,publish_stream&type=web_server';

它重定向到 getFacebookData.php:

$access_token = '';

    $token_url = "https://graph.facebook.com/oauth/access_token?client_id=my_id&redirect_uri=http://mysite/facebook/getFacebookData.php&client_secret=secret&code=" . $_GET['code'];
    $access_token = file_get_contents($token_url);
    $access_token = substr($access_token, 13, strlen($access_token) - (13 + 16));

它将访问令牌发送到第三个页面,(更新中的代码:“更新(@Axel Amthor):”)。

【问题讨论】:

  • 你能把代码粘贴到$facebook被实例化和初始化的地方吗?
  • @AxelAmthor 我已经更新了代码。
  • 您能否验证此$user_info = $facebook -&gt; api('/me'); 是否有效?
  • @AxelAmthor,是的,它返回一个填充了我的用户正确数据的数组。
  • 我缺少的是某处的scope 参数,要求授予publish_streamstatus_updatepublish_action 的权限-您想做什么?目前,我认为根本没有设置任何权限。

标签: facebook error-handling permissions facebook-oauth


【解决方案1】:

缺少范围参数,例如(来自我的代码):

$OAuth_request = _formatOAuthReq($OAuth, "read_insights,ads_management,publish_actions,manage_pages,publish_stream,read_stream,offline_access", $state);

....

function _formatOAuthReq($OAuthParams, $scope, $state)
{
    $uri = $OAuthParams['oauth_uri'];
    $uri .= "?client_id=" . $OAuthParams['client_id'];
    $uri .= "&redirect_uri=" . $OAuthParams['redirect_uri'];
    $uri .= "&scope=" . $scope;
    $uri .= "&response_type=code";
    $uri .= "&approval_prompt=force&access_type=offline";

要在用户个人资料上发布内容,请考虑以下权限:

  1. 创建事件
  2. create_note
  3. 照片上传
  4. publish_stream
  5. read_stream
  6. status_update
  7. 视频上传
  8. 电子邮件
  9. publish_actions

根据/[acctid]/feed,您将在 [acctid] 标识的用户墙上发布“注释”。实际上,这是使用 OAuth 对话框中给出的访问令牌“登录”的用户。我刚刚在这里查看了我们的代码,我们正在这样做

/me/feed

这就像一个魅力。实际上,不是您向“外国用户”发帖,而是用户本人,通过授予您的应用代表他/她这样做的权限,将您的应用发布到他/她自己的墙上。很复杂,我知道。

【讨论】:

  • “/me/feed”解决了这个问题!谢谢 :) (强调这一点,以便其他用户立即获得答案)。
【解决方案2】:

我发现当我再次允许权限时(通过收到错误消息后的链接),只有“所有人”/公众会产生错误,而只有我和朋友不会。

所以你想强制用户公开发帖?你不应该这样做 - 让用户决定!

可能在您的应用设置中将“public”设置为 默认操作隐私 - 然后用户可以根据需要将其更改为更具限制性的值,直接从登录对话框或稍后在他们的个人资料应用设置。

然后在您的 API 调用中根本不要提供privacy 参数,以便用户选择的值将被自动应用。

【讨论】:

  • 我给用户一个选择元素,他可以在其中选择要输入的选项,当他们尝试选择公共选项时,它会破坏功能。此外,我已经将“public”设置为默认值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多