отделить значение ключа от массива токенов facebook

#php #arrays #phalcon

#php #массивы #phalcon

Вопрос:

Я пытаюсь получить доступ facebook login без sdk с php , поэтому я получаю access_token из facebook , как показано ниже:

 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"]) amp;amp; $_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,genderamp;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 amp; 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.'amp;scope=emailamp;redirect_uri='.$redirect_uri.'amp;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."amp;redirect_uri=".$redirect_uri."amp;client_secret=".$app_secret."amp;code=".$code);
    json_decode($response, $access_token);
    return $access_token;
}
  

Комментарии:

1. Как вы создаете массив? Элемент array представляет собой массив, содержащий строку JSON, а не декодированный объект.

2. Это еще более странно. Строка JSON — это ключ ассоциативного массива.

3. Вам нужно показать код, который создает $access_token , у вас там некоторые проблемы.

4. Я обновил свой код!! если я добавлю «file_get_contents (» graph.facebook.com / … ); » вроде бы это работает отлично, но мне нужен $ access_token[‘access_token’]

Ответ №1:

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}] => 
)
  

Песочница

Строка синтаксического анализа просто берет строку и обрабатывает ее следующим образом, аналогично тому, как если бы она была частью строки запроса 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 Анализирует encoded_string так, как если бы это была строка запроса, переданная через URL, и устанавливает переменные в текущей области видимости (или в массиве, если предоставлен результат).

Использование 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."amp;redirect_uri=".$redirect_uri."amp;client_secret=".$app_secret."amp;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;
}
  

Комментарии:

1. обновлено в соответствии с вашими инструкциями. я просто получаю значение «xxxxxxxxxx» с помощью: foreach ($access_token как $key => $value) {echo «$key = $value<br/>»;}, а затем я вручную копирую значение, но не работаю с $ access_token

2. У вас есть только один токен доступа, $access_token['access_token'] или вы можете просто вернуть его из get_access_token

3. Большое спасибо!! Gr8 Работа, мой Друг!! Все работает, как и ожидалось.

4. Кул, это было довольно очевидно, когда я увидел, parse_str поскольку это используется для данных строки запроса, а не JSON.

Ответ №2:

Итак, вы получаете ответ в виде элемента массива, где ключ — это ваши данные 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;
?>