5

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番目になります。私はそれが初めてです、誰かが私を助けてくれるなら、それは大きな助けになるでしょう。ありがとう。

4

3 に答える 3

8

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, '-_', '+/'));
}
于 2013-09-21T23:44:27.460 に答える
3

私が知っている古い投稿ですが、Art Geigelの回答に返信を追加したいと思いました(直接コメントすることはできません)。

コードスニペットに行がありません、

   $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);
于 2015-09-18T14:50:09.880 に答える
2

についてのコメントで述べたように、は有効なjson文字列ではないjson_decode($json)ため、失敗したと思います。$jsonprint_r($_POST['signed_request']);

Facebook-Canvas Page Document内の認証によると、signed_requestパラメーターはエンコードされており、文字列を解析するsigned_requestとJSONオブジェクトが生成されます。

PHP SDKを使用している場合は、Abhishekがコメントで述べた$facebook->getSignedRequest();ように、デコードされたjsonが提供されます。

署名されたリクエストの詳細については、こちらをご覧ください

于 2012-08-15T17:27:44.713 に答える