#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;
?>