繁体   English   中英

Facebook PHP SDK v5 OAuth作为页面发布到页面时出现登录错误

[英]Facebook PHP SDK v5 OAuth Login error when posting to a page as a page

我在我的网站上使用下面的代码尝试在我管理的Facebook页面上发布消息。 我正在使用Facebook PHP SDK v5。 每当我运行代码时,我都会被引导到Facebook,并显示一个错误窗口,

“URL已阻止:此重定向失败,因为重定向URI未在应用的客户端OAuth设置中列入白名单。请确保启用了客户端和Web OAuth登录,并将所有应用域添加为有效的OAuth重定向URI。”

但是,如果我转到Graph API资源管理器并请求用户访问令牌,那么将访问令牌硬编码到它可以正常工作的脚本中。 我将Facebook登录添加到我的应用设置的产品标签中,因为这是您可以在“有效OAuth重定向URI”中添加的唯一位置。 我很确定问题来自设置区域中的“有效OAuth重定向URI”字段。 我不确定在该领域应该放什么,或者甚至根本不是问题。 目前,我已尝试将以下内容放入“有效的OAuth重定向URI”字段中,但没有运气;

  1. 只是我的域名,即www.my-domain.com

  2. 调用脚本的完整路径,即www.my-domain.com/calling-script.php

  3. 我服务器上空白页面的完整路径,即www.my-domain.com/blank.html

没有人工作。 这是我第一次尝试使用Facebook PHP SDK,所以我确定我做错了...想知道是否有人能给我一些指导?

更新:请参阅下面发布的答案并修复。 关于我的意图,我原来的帖子不太清楚。 我的目标是成功将消息作为页面发布到Facebook页面,而不是作为单个用户。 希望这有助于有人在路上。

这是我的应用设置: 主要应用设置

Facebook登录设置

这是我正在使用的PHP脚本:

session_start();
$path = "path-to-Facebook-autoloader-on-my-server";
include_once $path;

$fb = new Facebook\Facebook([
  'app_id' => 'app-id-from-app-settings',
  'app_secret' => 'app-secret-number-from-app-settings',
  'default_graph_version' => 'v2.7',
]);
/////////////////////////////////////////////////////////////////////////
//  If I uncomment the below line the script works fine, but the token expires often 
//  and I do not want to have to keep updating it  
//  $_SESSION['facebook_access_token'] = "access-token-obtained-from-Graph-API-Explorer";
/////////////////////////////////////////////////////////////////////////
$helper = $fb->getCanvasHelper();
$permissions = ['email', 'publish_actions']; // optional
try {
    if(isset($_SESSION['facebook_access_token'])){
        $accessToken = $_SESSION['facebook_access_token'];
    }else{
        $accessToken = $helper->getAccessToken();
    }
}catch(Facebook\Exceptions\FacebookResponseException $e){
    // When Graph returns an error
    echo 'Graph returned an error: ' . $e->getMessage();
    exit;
}catch(Facebook\Exceptions\FacebookSDKException $e){
    // When validation fails or other local issues
    echo 'Facebook SDK returned an error: ' . $e->getMessage();
    exit;
}
if(isset($accessToken)){
    if(isset($_SESSION['facebook_access_token'])){
        $fb->setDefaultAccessToken($_SESSION['facebook_access_token']);
    }else{
        $_SESSION['facebook_access_token'] = (string)$accessToken;
        // OAuth 2.0 client handler
        $oAuth2Client = $fb->getOAuth2Client();
        // Exchanges a short-lived access token for a long-lived one
        $longLivedAccessToken = $oAuth2Client->getLongLivedAccessToken($_SESSION['facebook_access_token']);
        $_SESSION['facebook_access_token'] = (string)$longLivedAccessToken;
        $fb->setDefaultAccessToken($_SESSION['facebook_access_token']);
    }

    // validating the access token
    try{
        $request = $fb->get('/me');
    }catch(Facebook\Exceptions\FacebookResponseException $e){
        // When Graph returns an error
        if($e->getCode() == 190){
            unset($_SESSION['facebook_access_token']);
            $helper = $fb->getRedirectLoginHelper();
            $loginUrl = $helper->getLoginUrl('https://apps.facebook.com/austintestingapp/', $permissions);
            echo "<script>window.top.location.href='".$loginUrl."'</script>";
            exit;
        }
    }catch(Facebook\Exceptions\FacebookSDKException $e){
        // When validation fails or other local issues
        echo 'Facebook SDK returned an error: ' . $e->getMessage();
        exit;
    }

    try{
        // message must come from the user-end
        $data = ['message' => 'test message...'];
        $request = $fb->post('/me/feed', $data);
        $response = $request->getGraphNode();
    }catch(Facebook\Exceptions\FacebookResponseException $e){
        // When Graph returns an error
        echo 'Graph returned an error: ' . $e->getMessage();
        exit;
    }catch(Facebook\Exceptions\FacebookSDKException $e){
        // When validation fails or other local issues
        echo 'Facebook SDK returned an error: ' . $e->getMessage();
        exit;
    }

    echo $response['id'];

}else{
    $helper = $fb->getRedirectLoginHelper();
    $loginUrl = $helper->getLoginUrl('https://apps.facebook.com/austintestingapp/', $permissions);
    echo "<script>window.top.location.href='".$loginUrl."'</script>";
}

我检查了你的脚本。 一切看起来很好。 你可以在改变后尝试

$helper = $fb->getCanvasHelper();

$helper = $fb->getRedirectLoginHelper();

并查看它抛出的错误是什么? 你也可以参考共享的要点。 请告诉我们您的错误。 https://gist.github.com/gunnrryy/c2c828fc2a77124cc1bed57af5e216df

所以我最终搞清楚了。 我玩了我最初发布的脚本,最后让它工作......有点儿。 无论我如何运行脚本,消息总是被发送到我作为通知管理的页面。 他们不会出现在墙上。 我正在寻找的最终目标是发布到我作为页面管理的页面,而不是我自己。 万一其他人遇到这个,下面的代码是完美的。 此外,它不要求您提交Facebook批准的权限。

关于“有效OAuth重定向URI”字段的原始问题的答案。 我最终把路径放到该字段中的调用脚本,它工作正常。

session_start();
$path = "server-path-to-Facebook-autoloader.php";
$permissions = ['manage_pages', 'publish_pages'];
$callback = "full-path-to-the-calling-script(this-script).php";
include_once $path;

$fb = new Facebook\Facebook([
  'app_id' => 'app-id-number-here',
  'app_secret' => 'app-secret-here',
  'default_graph_version' => 'v2.7',
]);

$helper = $fb->getRedirectLoginHelper();

try {
    if (isset($_SESSION['facebook_access_token'])) {
        $accessToken = $_SESSION['facebook_access_token'];
    } else {
        $accessToken = $helper->getAccessToken();
    }
} catch(Facebook\Exceptions\FacebookResponseException $e) {
    // When Graph returns an error
    $res['myresponse'] = 'Error: Graph returned a session error: ' . $e->getMessage();
    echo $res['myresponse'];
    exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
    // When validation fails or other local issues
    $res['myresponse'] = 'Error: Facebook SDK returned a session error: ' . $e->getMessage();
    echo $res['myresponse'];
    exit;
 }

if (isset($accessToken)) {
    if (isset($_SESSION['facebook_access_token'])) {
        $fb->setDefaultAccessToken($_SESSION['facebook_access_token']);
    } else {
        // getting short-lived access token
        $_SESSION['facebook_access_token'] = (string) $accessToken;

        // OAuth 2.0 client handler
        $oAuth2Client = $fb->getOAuth2Client();

        // Exchanges a short-lived access token for a long-lived one
        $longLivedAccessToken = $oAuth2Client->getLongLivedAccessToken($_SESSION['facebook_access_token']);

        $_SESSION['facebook_access_token'] = (string) $longLivedAccessToken;

        // setting default access token to be used in script
        $fb->setDefaultAccessToken($_SESSION['facebook_access_token']);
    }

    // getting basic info about user
    try {
        $profile_request = $fb->get('/me');
        $profile = $profile_request->getGraphNode();
    } catch(Facebook\Exceptions\FacebookResponseException $e) {
        // When Graph returns an error
        $res['myresponse'] = 'Error: Graph returned a profile request error: ' . $e->getMessage();
        echo $res['myresponse'];
        session_destroy();
        // redirecting user back to app login page
        header("Location: ./");
        exit;
    } catch(Facebook\Exceptions\FacebookSDKException $e) {
        // When validation fails or other local issues
        $res['myresponse'] = 'Error: Facebook SDK returned a profile request error: ' . $e->getMessage();
        echo $res['myresponse'];
        exit;
    }

    // post on behalf of page
    $pages = $fb->get('/me/accounts');
    $pages = $pages->getGraphEdge()->asArray();

    foreach ($pages as $key) {
        if ($key['name'] == 'name-of-page-to-post-to') {
            $post = $fb->post('/' . $key['id'] . '/feed', array('message' => 'this is an automated test message from Affordable HomeCare...'), $key['access_token']);
            $post = $post->getGraphNode()->asArray();
            if($post['id'] <> ''){
                $res['myresponse'] = "Successfully Posted to Facebook";
            }else{
                $res['myresponse'] = "Error: Unable to verify post ID";
            }
            echo $res['myresponse'];
        }
    }
} else {
    $loginUrl = $helper->getLoginUrl($callback, $permissions);
    echo "<script>window.top.location.href='".$loginUrl."'</script>";
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM