簡體   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