将键值与 facebook 令牌数组分开

separate key value from facebook token array

我正在尝试在没有 sdk 的情况下使用 php 访问 facebook login,这就是为什么我从 facebook 获得 access_token 的原因,如下所示:

array(1) { ["{"access_token":"xxxxxxxxxxxxxxx","token_type":"bearer","expires_in":543543581}"]=> string(0) "" } 

但我只想要 access_token => "xxxxxxxxxxx" 这样的 $access_token['access_token'];

我已经试过了:

    if(isset($access_token['access_token']) || array_key_exists('access_token', $access_token))

或 parse_str($access_token, $token_array);

但运气不好!!

我该怎么做?

public function facebookAction()
{
    if(isset($_REQUEST["error"]))
    {
        $this->flashSession->error("ERROR:: ".$_REQUEST['error']);
        return $this->response->redirect('index');             
    }
    elseif(isset($_REQUEST["code"]))
    {
        if(isset($_REQUEST["state"]) && $_REQUEST["state"]==$_SESSION["state"])
        {
            $access_token = $this->get_access_token();
//[ Problem is here ] 
            $raw = file_get_contents("https://graph.facebook.com/me?fields=id,name,email,picture,gender&access_token=".$access_token);


            $data_array = json_decode($raw,TRUE);
            $fbid = $data_array['id'];
            $fbmail = $data_array['email'];
            $this->session->set('id', '1000');
            $this->session->set("uname", $fbmail);
            $this->flashSession->success("SUCCESS:: You are now flying with Phalcon!");
                return $this->response->redirect('index');
        }else{ $this->flashSession->error("ERROR:: Request STATE & CODE Error!");return $this->response->redirect('index'); }
    }else{ $this->dialog(); }
}    

function generate_state(){ return md5(uniqid(rand(),TRUE)); }

function dialog(){
    $app_secret = "bbbbbbbbbbbbbbbb";
    $app_id = "aaaaaaaaaaaaa";
    //$auth_type = 'rerequest';
    $redirect_uri = urlencode("https://localhost/firefly/Oauth/facebook"); 
    $fbPermission = array('email');
    $defaultGraphVersion = 'v3.2';
    $state = $this->generate_state();
    $_SESSION["state"] = $state;
    return $this->response->redirect('https://www.facebook.com/'.$defaultGraphVersion.'/dialog/oauth?client_id='.$app_id.'&scope=email&redirect_uri='.$redirect_uri.'&state='.$state);
}
function get_access_token(){
    $app_secret = "bbbbbbbbbbbbb";
    $app_id = "aaaaaaaaaaaaaa";
    $redirect_uri = urlencode("https://localhost/firefly/Oauth/facebook"); 
    $code = $_REQUEST["code"];
    $response = file_get_contents("https://graph.facebook.com/oauth/access_token?client_id=".$app_id."&redirect_uri=".$redirect_uri."&client_secret=".$app_secret."&code=".$code);
    json_decode($response, $access_token);
    return $access_token;
}

get_access_token 中将 parse_str 更改为 json_decode

parse_str('{"access_token":"xxxxxxxxxxxxxxx","token_type":"bearer","expires_in":543543581}', $res);

print_r($res);

输出

Array
(
    [{"access_token":"xxxxxxxxxxxxxxx","token_type":"bearer","expires_in":543543581}] => 
)

Sandbox

解析字符串只是获取字符串并像这样对待它,类似于它是 URL 查询字符串的一部分 example.com?foo:

parse_str('foo=bar', $res);
print_r($res);

parse_str('foo', $res);
print_r($res);

输出

//parse_str('foo=bar', $res);
Array
(
    [foo] => bar
)
//parse_str('foo', $res);
Array
(
    [foo] => 
)

正如 foo 将成为 [foo => bar] 中的键一样,您的字符串将成为那里的键。

parse_str Parses encoded_string as if it were the query string passed via a URL and sets variables in the current scope (or in the array if result is provided).

使用Json解码

print_r(json_decode('{"access_token":"xxxxxxxxxxxxxxx","token_type":"bearer","expires_in":543543581}', true));

输出

Array
(
    [access_token] => xxxxxxxxxxxxxxx
    [token_type] => bearer
    [expires_in] => 543543581
)

所以:

 function get_access_token(){
    $app_secret = "bbbbbbbbbbbbb";
    $app_id = "aaaaaaaaaaaaaa";
    $redirect_uri = urlencode("https://localhost/firefly/Oauth/facebook"); 
    $code = $_REQUEST["code"];
    $response = file_get_contents("https://graph.facebook.com/oauth/access_token?client_id=".$app_id."&redirect_uri=".$redirect_uri."&client_secret=".$app_secret."&code=".$code);
    $res = json_decode($response, true);

     //return false or the access_token
    return isset($res['access_token']) ? $res['access_token'] : false;
     //OR
    return $res;  //return the whole response

     //---------- old code ---------
    //parse_str($response, $access_token);
    //return $access_token;
}

所以你得到的响应是数组项,其中键是你的 JSON 数据和空值?

您的回复很丑陋,但这就是您获取价值的方式:

<?php
    $response = [
        '{"access_token":"xxxxxxxxxxxxxxx","token_type":"bearer","expires_in":543543581}' => '',
    ];

    $response_key = \array_keys($response)[0];
    $response_array = \json_decode($response_key, true);
    $access_token = $response_array['access_token'];

    echo $access_token;
?>