Согласно Facebook – аутентификация в документе Canvas Page Document , они говорят, что мы будем получать signed_request
который состоит из объекта JSON. Теперь они говорят, что signed_request
может пройти через $_POST['signed_request']
Я согласен, что он работает для меня.
Теперь, согласно им, если пользователь войдет в систему, я получаю значение объекта JSON следующим образом:
{ "expires":UNIXTIME_WHEN_ACCESS_TOKEN_EXPIRES, "algorithm":"HMAC-SHA256", "issued_at":UNIXTIME_WHEN_REQUEST_WAS_ISSUED, "oauth_token":"USER_ACCESS_TOKEN", "user_id":"USER_ID", "user":{ "country":"ISO_COUNTRY_CODE", "locale":"ISO_LOCALE_CODE", ... } }
Теперь я хочу извлечь user_id
из этого, поэтому я использую этот кусок кода, но его не работает:
if(isset($_POST['signed_request'])) { echo 'YES'; $json = $_POST['signed_request']; $obj = json_decode($json); print $obj->{'user_id'}; }
Просто напечатайте YES
. Почему это так?
Я где-то читал, что без проверки подлинности приложения я не смогу извлечь user_id
но, согласно facebook, это первый шаг, и аутентификация приложения будет 4-го. Я новичок в этом, если кто-то может мне помочь, это будет очень полезно. Благодарю.
Я думаю, что это не удалось в json_decode($json)
потому что $json
не является допустимой строкой json, как вы упомянули в комментарии о print_r($_POST['signed_request']);
,
Согласно Facebook – аутентификация в документе с signed_request
параметр signed_request
закодирован, и анализ строки signed_request
приведет к созданию объекта JSON.
если вы используете PHP SDK, как сказал Абхишек в комментарии, $facebook->getSignedRequest();
даст вам декодированный json.
посмотрите здесь, чтобы узнать больше о подписанном запросе
Если вы не хотите работать с FB SDK, вы можете использовать этот фрагмент кода для получения user_id и других переменных (фрагмент из https://developers.facebook.com/docs/facebook-login/using-login-with -игры / )
function parse_signed_request($signed_request) { list($encoded_sig, $payload) = explode('.', $signed_request, 2); // decode the data $sig = base64_url_decode($encoded_sig); $data = json_decode(base64_url_decode($payload), true); // confirm the signature $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true); if ($sig !== $expected_sig) { error_log('Bad Signed JSON signature!'); return null; } return $data; } function base64_url_decode($input) { return base64_decode(strtr($input, '-_', '+/')); }
Старая публикация, которую я знаю, но хотела добавить ответ на ответ Арт Гейгеля (я не могу прокомментировать это).
В вашем фрагменте кода отсутствует строка,
$secret = "appsecret"; // Use your app secret here
и полный фрагмент,
function parse_signed_request($signed_request) { list($encoded_sig, $payload) = explode('.', $signed_request, 2); $secret = "appsecret"; // Use your app secret here // decode the data $sig = base64_url_decode($encoded_sig); $data = json_decode(base64_url_decode($payload), true); // confirm the signature $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true); if ($sig !== $expected_sig) { error_log('Bad Signed JSON signature!'); return null; } return $data; } function base64_url_decode($input) { return base64_decode(strtr($input, '-_', '+/')); }
Чтобы ответить на исходный вопрос
Чтобы получить данные из signed_request, включите функции выше и …
$data = parse_signed_request($_POST['signed_request']); echo '<pre>'; print_r($data);
вы можете воспользоваться моим сервисом
КАК ИСПОЛЬЗОВАТЬ: просто запустите запрос jsonp
https://websta.me/fbappservice/parseSignedRequest/<append signed request here>
если успех вернет что-то вроде этого
{ "algorithm": "HMAC-SHA256", "issued_at": xxxxx, "page": { "id": "xxxxxxx", "admin": true, "liked": false }, "user": { "country": "jp", "locale": "en_US", "age": { "min": xx } }
если не удалось, он будет выводиться:
Bad signed Json Signature
счастливое кодирование !!