0

PHP-SDK を使用して Facebook からユーザー アクセス トークンを取得しようとしています。サーバー側のログイン プロセスは適切に機能し、正しいページにリダイレクトして提供し$codeます。

リダイレクト (および$code存在するかどうかの確認) の後、次の API メソッドを呼び出して$codeユーザー トークンを交換します (ここでは API パラメーターは省略されています)。

$fb->api('/oauth/access_token',array(
    'client_id'     => APP_ID,
    'client_secret' => APP_SECRET,
    'redirect_uri'  => REDIRECT_URI,
    'code'          => $code
));

$fb_token = $fb->getAccessToken();
echo $fb_token;

残念ながら、このスクリプトから得られるのはアプリ トークンだけです。実際、スクリプトを次のように減らしても違いはありません。

$fb_token_user = $fb->getAccessToken();
echo $fb_token_user;

したがって/oauth/access_token、何らかの理由で機能していないか、少なくともアクションを実行しない呼び出しに関するものだと思います。エラーも返されません。

get_file_contents()Facebook チュートリアルで提案されている方法や、上記の API 呼び出しに追加のパラメーターを追加する (例など)など、いくつかの代替案を試してテストしましたtype=client_credが、成功しませんでした。

API 呼び出しが機能しない理由がわかる人はいますか? それはスクリプトですか、それとも Facebook のアプリ設定でしょうか?

前もって感謝します!

4

2 に答える 2

2

解決しました!問題のコードは、このコミュニティや他のコミュニティで非常に多くのスレッドが機能していると述べているにもかかわらず、まだ機能していません (奇妙なことに、それらのために機能しているように見えまし)。

そのため、 Facebookfile_get_contents()で説明されている方法に戻る必要があると考えましたが、サーバーで無効になっているため、この方法は以前は機能していなかったことがわかりました。有効にするリスクを冒したくないので、回避策としてcURLを発見しました。allow_url_fopen

そして、ここに作業コードがあります:

// cURL Load Function
function cURLget ($ch_url) {
  $ch = curl_init();
  curl_setopt($ch,CURLOPT_URL,$ch_url);
  curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
  curl_setopt($ch,CURLOPT_USERAGENT,$_SERVER['HTTP_USER_AGENT']);
  $ch_send = curl_exec($ch);
  curl_close($ch);
  return $ch_send;
};

// Obtain User Token
$fb_token_get = cURLget("https://graph.facebook.com/oauth/access_token"
  . "?client_id=" . APP_ID
  . "&client_secret=". APP_SECRET
  . "&redirect_uri=" . urlencode(REDIRECT_URI)
  . "&code=" . $CODE
);
$fb_token_params = null;
parse_str($fb_token_get,$fb_token_params);

// Print Token Data
echo "Token: " . $fb_token_params['access_token']
  . "<br />Expires: " . $fb_token_params['expires'];

元のコードを手伝ってくれた @FabioAntunes と、cURL Load Functionのスクリプトを提供してくれた @ShawnECarter に感謝します。

于 2013-03-24T10:11:58.583 に答える
0

今日もこの問題に出くわしました。私の PHP SDK (v.3.2.2) は、問題を解決する関数 setExtendedAccessToken() を提供しているようです。(ほとんど同じことを行います: グラフの "/oauth/access_token" を呼び出し、古いトークンを "長寿命" のトークンと交換します)。

于 2013-11-13T12:47:18.027 に答える