как читать facebook signed_request, чтобы получить user_id

Согласно 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 

    счастливое кодирование !!