Facebook API.不能从PHP发布具有有效访问令牌的页面


Facebook API. Can't publish on page with valid access token from PHP

我在尝试使用PHP 5.5中的SDK在facebook页面上发布。我想做一个php脚本自动发布更新在我管理的facebook页面。当我使用图形API资源管理器发出请求时,它工作完美,但我总是收到错误消息"(#200)用户尚未授权应用程序执行此操作",当从PHP脚本执行时。

这些是我使用的步骤和代码:

  1. 使用图形API资源管理器的"获取访问令牌"选项为我的应用程序获得一个短期访问令牌,权限为manage_pages和publish_pages。
  2. 使用PHP SDK的getOAuth2Client获取永不过期的访问令牌
  3. 使用"/me/accounts"请求获取页面访问令牌
  4. 使用页面访问令牌和方法"PORT/pageId/feed"发送发布请求,参数为:access_token和消息

获得页面访问令牌后,如果我使用图形API资源管理器执行发布请求,它会工作,但从PHP脚本它失败了。

下面是我使用的完整代码:

<?php
require_once __DIR__ . '/Facebook/autoload.php';
$appId = 'my_app_id';
$appSecret = 'my_app_secret';
$pageId = 'my_page_id';
$shortToken = 'token got in step 1';
$fb = new Facebook'Facebook([
  'app_id' => $appId,
  'app_secret' => $appSecret,
  'default_graph_version' => 'v2.2',
]);
$oAuth2Client = $fb->getOAuth2Client();
$longLivedAccessToken = $oAuth2Client->getLongLivedAccessToken($shortToken);
echo '<p>Long-live token: ' . $longLivedAccessToken . '</p>';
// Get page access_token
$request = $fb->request('GET', '/me/accounts');
$request->setParams(['access_token' => $longLivedAccessToken]);
try {
  $response = $fb->getClient()->sendRequest($request);
} catch(Facebook'Exceptions'FacebookResponseException $e) {
  echo 'Graph returned an error: ' . $e->getMessage();
  exit;
} catch(Facebook'Exceptions'FacebookSDKException $e) {
  echo 'Facebook SDK returned an error: ' . $e->getMessage();
  exit;
}
$graphEdge = $response->getGraphEdge();
foreach ($graphEdge as $graphNode) {
  if ($graphNode['id'] == $pageId) {
    $pageAccessToken = $graphNode['access_token'];
  }
}
echo '<p>Page access token: ' . $pageAccessToken . '</p>';
$request = $fb->request('POST', '/' . $pageId . '/feed');
$request->setParams(['access_token' => $pageAccessToken, 'message' => 'Page publish test message']);
try {
  $response = $fb->getClient()->sendRequest($request);
} catch(Facebook'Exceptions'FacebookResponseException $e) {
  echo 'Graph returned an error: ' . $e->getMessage();
  exit;
} catch(Facebook'Exceptions'FacebookSDKException $e) {
  echo 'Facebook SDK returned an error: ' . $e->getMessage();
  exit;
}
?>

输出示例:

<>之前长token: XXXX页面访问令牌:XXX图返回一个错误:(#200)用户没有授权应用程序执行此操作之前

所有令牌都是有效的,使用Facebook访问令牌调试器检查。页面令牌信息包含应用程序id,页面id和我的用户id,具有manage_pages, publish_pages和public_profile权限。

我的应用程序有默认设置。我只是添加了一个类型为"网站"的平台与我的网页的URL。这个应用程序是"实时"的,没有提交审批(我刚刚创建了一个应用程序,在Facebook页面上自动发布消息)。

我在这里和互联网上读了很多消息和例子,但我没有得到它的工作。我希望任何人都能帮助我。

非常感谢!

无论如何。我也有同样的问题。我意识到我没有使用页面的访问令牌,我正在使用/me/访问令牌。

我有publish_pagesmanage_pages的权限。

作为参考,我使用的是Lumen框架。

public function submitStock(Request $request){
  //first get Page token data from /me/accounts
  $pageTokenData = $this->fb->get("/me/accounts", $_SESSION['facebook_access_token'])->getDecodedBody();
  $pageToken = null;
  //check get the token for the desired app
  foreach($pageTokenData['data'] as $account){
    if($account['name'] == "AppName"){
      $pageToken = $account['access_token'];
    }
  }
  //set message text from POST
  $message = $request->input('message');
  //send post using the Pages app token, not the /me/ token
  $this->fb->post('/'.$this->page.'/feed', 
    ['message' => $message], 
    $pageToken);

  return redirect($_SERVER['HTTP_REFERER']);
}