为什么可以';t file_get_contents()与Facebook oauth交换令牌代码。

为什么可以';t file_get_contents()与Facebook oauth交换令牌代码。,facebook,oauth,file-get-contents,Facebook,Oauth,File Get Contents,我无法使用以下代码为令牌交换代码: extract($_GET); $url=urlencode('http://'.DOMAIN.'/admin/'); $app_id=FB_APPID; $fb_token=FB_TOKEN; $secret=FB_SECRET; if(SEND_NEWS_TO_FB){ if($code=='none'){ $state=rand(100000000,9999999999999999999); $_

我无法使用以下代码为令牌交换代码:

extract($_GET);
$url=urlencode('http://'.DOMAIN.'/admin/');
$app_id=FB_APPID;
$fb_token=FB_TOKEN;
$secret=FB_SECRET;

if(SEND_NEWS_TO_FB){
    if($code=='none'){
            $state=rand(100000000,9999999999999999999);
            $_SESSION['state']=$state;
            $script="
            <script type='text/javascript'>
                    var scope=encodeURI('publish_stream,user_status');
                    var app_id=$app_id;
                    var state=$state;
                    var url=$js_url;
                    window.location.href='https://www.facebook.com/dialog/oauth?                                                                                            client_id='+app_id+'&redirect_uri='+url+'&scope='+scope+'&state='+state;

            </script>";
            echo $script;
    }



if($code!='none' && $_SESSION['state']==$state && $_SESSION['fb_token']!=1){
            $_SESSION['fb_token']=1;
            $token_url="https://graph.facebook.com/oauth/access_token?"
            ."client_id=" .$app_id
            ."&redirect_uri=" .$url
            ."&client_secret=" .$secret
            ."&code=" .$code;
            $response = file_get_contents($token_url);
            $params = null;
            parse_str($response, $params);
            $token=$params['access_token'];
            $qry="UPDATE `settings` SET `FB_token`='$token'";
            $result=mysql_query($qry);
        }
extract($\u-GET);
$url=urlencode('http://'.DOMAIN.'/admin/');
$app\u id=FB\u APPID;
$fb_令牌=fb_令牌;
$secret=FB_secret;
如果(发送新闻给FB){
如果($code='none'){
$state=rand(100000009999999999);
$\会话['state']=$state;
$script=”
var scope=encodeURI('publish_stream,user_status');
var app_id=$app_id;
var state=$state;
var url=$js_url;
window.location.href=https://www.facebook.com/dialog/oauth?                                                                                            客户端id='+app_id+'&重定向uri='+url+'&范围='+scope+'&状态='+state;
";
echo$脚本;
}
如果($code!='none'&&$\u会话['state']==$state&&$\u会话['fb\u令牌]]!=1){
$\会话['fb\ U令牌]]=1;
$token_url=”https://graph.facebook.com/oauth/access_token?"
“客户_id=”.$app_id
.“&重定向_uri=“.$url”
.“&client_secret=“.$secret”
.“&code=”.$code;
$response=file\u get\u contents($token\u url);
$params=null;
parse_str($response,$params);
$token=$params['access_token'];
$qry=“更新`settings`设置`FB\U令牌`='$token'”;
$result=mysql\u查询($qry);
}

在我的浏览器中放置返回的$token_url会给我一个带有令牌和过期日期的页面。运行脚本会返回一个非常模糊的“抱歉,出现问题”消息。我看到的几乎所有执行此操作时出现问题的线程都是由于重定向uri的不同,但登录和令牌请求都从完全相同的位置获取uri。

应用程序id值和“&redirect\u url”之间有空格。仅供参考,您的浏览器(至少是Chrome)url将自动对空白进行编码,这就是url在浏览器中正常工作的原因。我仍然不确定空白是如何存在的,但urlencode()暂时解决了它。

我注意到您缺少
范围
授予类型
参数。也许可以尝试添加这些参数,看看是否有效?(
grant\u type
在获取访问令牌时必须是
authorization\u code
)登录部分
client\u id='+app\u id+'&redirect\u uri='+url+'&scope='+scope+'&state='+state;
的格式有点混乱。所以我确实使用了
scope
。你的意思是应该将作用域也传递给代码/令牌交换吗?你在哪里找到
服务器端流程中的grant_type
?除了()之外,我还找不到任何关于服务器端oauth进程的文档。