PHP + Facebook:如何获得access_token + 60天的访问令牌?

时间:2012-11-15 13:40:36

标签: php facebook facebook-graph-api access-token facebook-access-token

我试图这样做:

https://graph.facebook.com/oauth/access_token?             
    client_id=APP_ID&
    client_secret=APP_SECRET&
    grant_type=fb_exchange_token&
    fb_exchange_token=EXISTING_ACCESS_TOKEN 

网址中的所有变量都已正确设置,但是当我将此网址放入浏览器时,我得到:

{
   "error": {
      "message": "No user access token specified",
      "type": "OAuthException",
      "code": 1
   }
}

一遍又一遍。我做错了什么?

修改

我目前的设置: 脚本的地址:www.domain.com/folder/index.php

$my_url = "www.domain.com"

在Facebook: namespace:my_namespace

应用域名:domain.com

网站网址http://www.domain.com/

这是我的设置,但仍然收到相同的错误

2 个答案:

答案 0 :(得分:1)

您是否向他们发送现有的访问令牌?您应首先拥有一个access_token,您应该发送回来获取扩展的到期访问令牌。

从错误中我可以理解的是,你没有向他们发送令牌。

这是我在其他一些问题中回答的代码。它在FB docs中明确给出。这个获取了短暂的令牌,将其发回以扩展它,并获得长期存在的access_token。

<?php

//read more : https://developers.facebook.com/docs/howtos/login/server-side-login/
session_start();
   $app_id = "xxxxxxxxxxxxxx";
   $app_secret = "xxxxxxxxxxxxxxxx";
   $my_url = "www.stackoverflow.com/";  // redirect url

    $code = $_REQUEST["code"];

   if(empty($code)) {
     // Redirect to Login Dialog
     $_SESSION['state'] = md5(uniqid(rand(), TRUE)); // CSRF protection
     $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" 
       . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="
       . $_SESSION['state'] . "&scope=publish_stream,read_friendlists,email";


     echo("<script> top.location.href='" . $dialog_url . "'</script>");
   }
if($_SESSION['state'] && ($_SESSION['state'] === $_REQUEST['state'])) {
     $token_url = "https://graph.facebook.com/oauth/access_token?"
       . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)
       . "&client_secret=" . $app_secret . "&code=" . $code;

     $response = file_get_contents($token_url);
     $params = null;
     parse_str($response, $params);
     $longtoken=$params['access_token'];


//save it to database    
?>

答案 1 :(得分:1)

您无法在其中放置App令牌。它必须是用户访问令牌。请使用现有的用户访问令牌。