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

时间:2016-09-27 13:48:34

标签: php facebook facebook-graph-api oauth facebook-php-sdk

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

"网址已阻止:此重定向失败,因为重定向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

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

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

    以下是我的应用设置: Main App Settings

    Facebook Login Settings

    这是我正在使用的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>";
    }
    

2 个答案:

答案 0 :(得分:0)

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

$helper = $fb->getCanvasHelper();

$helper = $fb->getRedirectLoginHelper();

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

答案 1 :(得分:0)

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

关于&#34;有效OAuth重定向URI&#34;的原始问题的答案。领域。我最终将路径放到该字段中的调用脚本中,并且工作正常。

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