2016-09-27 2 views
1

Я использую приведенный ниже код на своем веб-сайте, чтобы попытаться опубликовать сообщение на странице Facebook, которой я управляю. Я использую PHP PHP SDK v5. Всякий раз, когда я запускаю код, я получаю адрес в Facebook с окном с ошибкой, которое говорит:Facebook PHP SDK v5 Ошибка OAuth Ошибка при отправке на страницу в виде страницы

«URL-адрес заблокирован: это перенаправление не удалось, потому что URI перенаправления не включен в настройках клиента OAuth. Убедитесь, что клиент и веб-адрес OAuth Login включены и добавляют все ваши домены приложений в качестве допустимых URI-адресов OAuth Redirect ».

Однако, если я перейду в API-интерфейс Graph API и запрошу токен доступа к пользователю, тогда жестко закодируйте токен доступа в скрипте, который работает очень хорошо. Я добавил Facebook Войти на вкладку продуктов в настройках моего приложения, так как это единственное место, которое вы можете добавить в «Действительные URI перенаправления OAuth». Я уверен, что проблема возникает из поля «Valid UAuth redirect URIs» в области настроек. Я не уверен, что поставить в эту область, или если это вообще проблема. В настоящее время я попытался поместить следующее в поле «Valid UAuth redirect URIs» без везения;

  1. только мой домен т.е. www.my-domain.com

  2. полный путь по вызывающий скрипт т.е. www.my-domain.com/calling-script.php

  3. полный путь к пустой странице на моем сервере, то есть www.my-domain.com/blank.html

Ничего не работают. Это мой первый опыт использования PHP 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 redirect URIs». Я закончил тем, что поместил путь к вызывающему скрипту в этом поле, и он работал нормально.

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

Смежные вопросы