我已经尝试解决这个问题三天了,对于那些熟悉开放图api的人来说,这真的很简单。我是Facebook集成的新手,但有一些PHP经验。
基本上,我所要做的就是从用户那里检索以下信息,并将其存储在数据库中。
Facebook用户ID:名称性别电子邮件
我已经做了用户ID,名称和性别通过使用:
$contents = file_get_contents ('https://graph.facebook.com/'.$user);
$json=json_decode($contents,true);
$userid = $json['id'];
$username = $json['name'];
$usergender = $json['gender'];
$useremail = $json['email'];
这是有效的,我知道我需要申请访问电子邮件的权限,我已经使用这个代码:
$app_id = "211665122244023";
$canvas_page = "http://apps.facebook.com/midcitymafia/";
$auth_url = "https://www.facebook.com/dialog/oauth?client_id="
. $app_id . "&redirect_uri=" . urlencode($canvas_page) . "&scope=email,publish_actions";
$signed_request = $_REQUEST["signed_request"];
list($encoded_sig, $payload) = explode('.', $signed_request, 2);
$data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);
但我如何获得访问令牌,然后使用它从图表中检索电子邮件?
##更新,这是我当前的代码,似乎仍然无法使其工作。。。require 'src/facebook.php';
$app_id = "211665122244023";
$canvas_page = "http://apps.facebook.com/midcitymafia/";
$auth_url = "https://www.facebook.com/dialog/oauth?client_id="
. $app_id . "&redirect_uri=" . urlencode($canvas_page) . "&scope=email,publish_actions";
$signed_request = $_REQUEST["signed_request"];
list($encoded_sig, $payload) = explode('.', $signed_request, 2);
$data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);
if (empty($data["user_id"])) {
echo("<script> top.location.href='" . $auth_url . "'</script>");
} else {
$graph = json_decode(file_get_contents("https://graph.facebook.com/".$user_id . "/?accesstoken=" .$data['access_token']));
}
$userid = $graph->id;
$username = $graph->name;
$usergender = $graph->gender;
$useremail = $graph->email;
?>
<br>
<?php echo 'ID: ' . $userid; ?>
<br>
<?php echo 'Name: ' . $username; ?>
<br>
<?php echo 'Gender: ' . $usergender; ?>
<br>
<?php echo 'Email: ' . $useremail; ?>
signed_request
本身包含用户access_token
。
在您的情况下,access_token
在$data['access_token']
中
存储用户access_token
不是一个好主意,因为它们提供的时间很短,过期时间较晚。要获得永久access_token
,您需要向用户请求offline_access
权限(我个人不建议这样做,因为您可以在不需要offline_access
的情况下实现大多数功能,在许多情况下,应用程序access_token
可能符合您的需求)。