在我的javascript中,我有一个点击事件,触发对我发送通知的php页面的ajax调用。我选择这样做是因为文档建议不要在任何客户端代码中使用您的应用程序密钥,而通知参数需要一个只能使用app secret获取的访问令牌。
我遇到的问题是,即使我已登录,$ facebook-> getUser()在php中返回0,因此我之后发出的api调用发送通知无法正常工作。我的用户已经通过客户端代码登录,因此如何将消息发送到他们登录的php,以便发送通知。
//JS
$.ajax({
url : "http://xxxxxo/bn/notification.php",
type : 'POST',
data: {notify: notify },
success : function (result) {
console.log(result);
},
error : function () {
alert("error sending notification");
}
});//closes ajax
//PHP
<?php
require_once(dirname(__FILE__).'/php-sdk/facebook.php') ;
$APPLICATION_ID = '1402xxxxx7';
$APPLICATION_SECRET = 'ce71d6bbxxxxx5f55a';
$fb_app_url = "http://apps.facebook.com/myAPP";
$config = array();
$config['appId'] = $APP_ID;
$config['secret'] = $APP_SECRET;
$config['cookie'] = true;
$facebook = new Facebook($config) or die('Error is here!');
$facebook = new Facebook(array(
'appId' => $APP_ID,
'secret' => $APP_SECRET,
'fileUpload' => true
));
$notify = $_REQUEST['notify'];
$userid = $facebook->getUser();
/*IF WE HAVE A LOGGED IN USER AND THE 'NOTIFY' REQUEST VALUE, THEN SEND THE NOTIFICATION.
BUT MY USER ID IS 0. HOW DO I GET PHP TO RECOGNIZE ME AS LOGGED IN WITHOUT HAVING TO FORCE MY USER TO LOG IN VIA PHP AFTER THEY'VE ALREADY LOGGED IN CLIENT SIDE?*/
if($userid && $notify){
$token_url ="https://graph.facebook.com/oauth/access_token?" .
"client_id=" . $APP_ID .
"&client_secret=" . $APP_SECRET .
"&grant_type=client_credentials";
$app_token = file_get_contents($token_url);
$app_token = str_replace("access_token=", "", $app_token);
$data = array(
'href'=> 'https://apps.facebook.com/thebringernetwork/',
'access_token'=> $app_token,
'template'=> 'test'
);
$sendnotification = $facebook->api('/1622649653/notifications', 'post', $data);
}else{
//handle error
}
?>
答案 0 :(得分:1)
我注意到的第一件事是您将应用ID定义为$APPLICATION_ID
,但将其用作$APP_ID
(同样适用于您的应用秘密)。但是既然你没有提到任何错误并且$facebook->getUser();
执行,我猜这只是一个糟糕的复制粘贴。
现在,为了回答这个问题,我将假设您使用的是JS和PHP SDK的最新版本。这些使用oauth 2.0并改变将登录信息从JS传递给PHP的方式。
根据Facebook Developer Blog删除$config['cookie'] = true;
并在JS配置中将oauth
设置为true
应该有效。请确保在登录后刷新网站。
我在自己的项目中找到的解决方案是完全禁用cookie,只需将访问令牌传递给我的PHP脚本。
在你的JS中调用这样的PHP脚本(确保在JS登录后调用它!):
$.ajax({
url : "http://xxxxxo/bn/notification.php",
type : 'POST',
data: {
notify: notify,
token: FB.getAuthResponse()['accessToken'] // add your access token
},
success : function (result) {
console.log(result);
},
error : function () {
alert("error sending notification");
}
});
在PHP脚本中,在创建FB对象后添加它。
$facebook->setAccessToken($_POST['token']); // set the users access token
以这种方式做事也将消除登录后刷新网站的任何需要。
答案 1 :(得分:1)
是的,将PHP SDK与AJAX结合使用时,这是一个常见问题:
当您发出AJAX请求时,PHP SDK会删除存储授权信息的cookie,然后下一次调用getUser
将返回0,因为此方法会尝试查找当前用户ID那些cookie - 显然OAuth 2.0规范中有一些东西需要这种行为来防止某种点击攻击。
但是信息仍会存储在会话中,因此您可以从那里读取用户ID(以及用户访问令牌,如果您需要):
$user_id = $_SESSION['fb_YourAppIdHere_user_id'];
$user_access_token = $_SESSION['fb_YourAppIdHere_access_token'];
将YourAppIdHere
替换为您的应用ID(因此它变为fb_1234567890_user_id
resp。fb_1234567890_access_token
)以获取这些会话密钥的正确名称。