我在开发过程中有一个小Facebook应用程序。目标是跟踪用户邀请并计算有多少用户在“用户”下注册。如果达到了目标数量,他们将得到一些礼物。
我的问题是,我无法存储请求ID。
该应用程序的工作方式如下:
首先,使用已安装的应用程序通过JavaScript重定向到Facebook页面。请求网址是apps.facebook.com/XY这对我不好,因为我们想要增加Facebook页面的数字,所以如果应用程序加载它检查网址,如果它是apps.facebook.com它重定向到Facebook页面。因为它是一个javascript重定向,所以我只能在app_data部分保存请求ID。
这是获取请求ID的PHP部分:
$request_ids = "";
if(isset($_REQUEST['request_ids'])){
if (!isset($_SESSION["RI"]))
{
$_SESSION["RI"] = $_REQUEST['request_ids'];
}else{
$request_ids = $_SESSION["RI"];
}
}
这是BODY中的JavaScript部分:
<script type="text/javascript">
function NotInFacebookFrame() {
return top === self;
}
function ReferrerIsFacebookApp() {
if(document.referrer) {
return document.referrer.indexOf("apps.facebook.com") != -1;
}
return false;
}
if (NotInFacebookFrame() || ReferrerIsFacebookApp()) {
top.location.replace("<?= $fbPageAppURL.'&app_data='.$request_ids ?>");
}
function sendRequestViaMultiFriendSelector() {
FB.ui({
method: 'apprequests',
message: "<?= $friendInviteMessage ?>"
});
}
</script>
重定向后,app_data IS设置我可以在URL中看到它,但signed_request没有设置app_data。我将已签名的请求存储在会话变量中,因为我在应用程序中有子页面,这样就可以设置已签名的请求:
if (!isset($_SESSION["SR"]))
{
$_SESSION["SR"] = $_REQUEST["signed_request"];
}else{
$encoded_sig = null;
$payload = null;
list($encoded_sig, $payload) = explode('.', $_SESSION["SR"], 2);
$sig = base64_decode(strtr($encoded_sig, '-_', '+/'));
$signed_request = $data = json_decode(base64_decode(strtr($payload, '-_', '+/'), true));
}
$signed_request = objectToArray($signed_request);
所以在此之后var_dump($ signed_request);从来没有app_data :(
有人可以帮帮我吗?非常感谢你!
更新:好的,现在我看到,$ signed_request不对...如果我在没有请求链接的情况下加载应用程序,它总是将我重定向到“请喜欢页面”部分:
$page_id = $signed_request["page"]["id"];
$like_status = $signed_request["page"]["liked"];
if(!$like_status){
header("Location: notfan.php");
exit;
}
因此签名的请求没有app_data,也没有页面和类似的信息...... :(
编辑:这是签名请求和请求ID处理的完整代码:
$signed_request = $facebook->getSignedRequest();
$request_ids = "";
if(isset($_REQUEST['request_ids'])){
if (!isset($_SESSION["RI"]))
{
$_SESSION["RI"] = $_REQUEST['request_ids'];
}else{
$request_ids = $_SESSION["RI"];
}
}
if (!isset($_SESSION["SR"]))
{
$_SESSION["SR"] = $_REQUEST["signed_request"];
}else{
$encoded_sig = null;
$payload = null;
list($encoded_sig, $payload) = explode('.', $_SESSION["SR"], 2);
$sig = base64_decode(strtr($encoded_sig, '-_', '+/'));
$signed_request = $data = json_decode(base64_decode(strtr($payload, '-_', '+/'), true));
$signed_request = objectToArray($signed_request);
}
答案 0 :(得分:1)
这是我处理app_data的方式:
signed_request:
$fbsr = $facebook->getSignedRequest();
if ($fbsr['app_data'])
{
parse_str(base64_decode($fbsr['app_data']), $app_data);
$_GET = array_merge($_GET, $app_data);
}
和链接
$app_data = base64_encode(http_build_query(array('key' => 'value')));
$url = 'https://www.facebook.com/pages/' . $page_name . '/' . $page_id . '?sk=app_' . $appId . '&app_data=' . $app_data;
也许它可以帮到你。
修改强>
在您的代码中看到:
top.location.replace("<?= $fbPageAppURL.'&app_data='.$request_ids ?>");
但$request_ids
必须是base64_encoded查询字符串,如下所示:
top.location.replace("<?= $fbPageAppURL.'&app_data='.base64_encode(http_build_query($request_ids)) ?>");
或$request_ids
是字符串:
top.location.replace("<?= $fbPageAppURL.'&app_data='.base64_encode(http_build_query(array('request_ids' => $request_ids))) ?>");