2016-09-27 189 views
1

我在我的网站上使用下面的代码尝试在我管理的Facebook页面上发布消息。我正在使用Facebook PHP SDK v5。每当我跑我得到指示给Facebook与一个错误,指出窗口中的代码,Facebook PHP SDK v5 OAuth登录错误,当作为页面发布到页面时

“URL阻止:此重定向失败,因为重定向URI没有在应用程序的客户端的OAuth设置白名单确保客户端和Web的OAuth登录。开启并将所有应用程序域添加为有效的OAuth重定向URI。“

但是,如果我转到图形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页面发布消息,而不是作为个人用户。希望这可以帮助那些在路上的人。

这里是我的应用程序设置: 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>"; 
} 

回答

0

所以我最终弄明白了。我玩了我最初发布的脚本,并最终让它工作......有点。无论我如何运行脚本,邮件总是被发送到我作为通知管理的页面。他们不会出现在墙上。我一直在寻找的最终目标是张贴到我作为页面管理的页面上,而不是我自己。以防万一其他人遇到这个问题,下面的代码是完美的。此外,它不要求您提交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>"; 
} 
0

我检查你的脚本。除了一件事外,一切看起来都很好ü可以尝试改变

$helper = $fb->getCanvasHelper(); 

$helper = $fb->getRedirectLoginHelper(); 

后,看看是什么错误时抛出如果有的话? 你也可以参考共享的要点。请让我们知道你的错误。 https://gist.github.com/gunnrryy/c2c828fc2a77124cc1bed57af5e216df