【问题标题】:Detect if user is test user检测用户是否为测试用户
【发布时间】:2011-11-23 11:45:32
【问题描述】:
Facebook 测试用户(为应用创建)在某些方面与普通用户不同。 IE。他们不喜欢粉丝页面,因此您无法测试“create.edge”侦听器是否设置正确。
有没有办法检测通过应用程序验证的用户是否是测试用户?实现测试用户无法使用的假对话版本(即喜欢粉丝专页)会很有用。
我的研究:
- 我检查了
signed_request 传递给应用程序,测试用户和普通用户看起来一样。
- 我检查了 graph.facebook.com/[test user id],它看起来也很正常。
【问题讨论】:
标签:
facebook
facebook-graph-api
facebook-javascript-sdk
【解决方案1】:
您无法根据用户的 Graph API 详细信息检查用户是否为测试用户。同样,您无法检查用户是否喜欢特定页面。但是,您可以对照用户喜欢的页面列表检查您的 page_id。因此,为了确定给定的user_id 是普通用户还是测试用户,您必须对照应用程序测试用户列表检查它:
https://graph.facebook.com/APP_ID/accounts/test-users?access_token=APP_ID|APP_SECRET
所以流程是这样的:
- 验证用户身份
- 获取他的
./likes 列表
- 找到您的
page_id 并成功退出
- 获取你的APP
./accounts/test-users列表
- 找到给定的
user_id并退出成功
- 退出失败 -- 要求用户喜欢您的页面。
这是一个额外的调用,但您可以安全地缓存结果以获得性能提升,因为测试用户无法转换为普通用户。我建议也将“喜欢”检查缓存一段时间,但 YMMV。
【解决方案2】:
如果 Facebook 用户是测试您可以更改名称和密码,否则返回错误代码 (#200) 您没有足够的权限来执行此操作
**我的解决方案:**
public function isTestUser($facebook_uid){
FacebookSession::setDefaultApplication(config_item('APP_ID'), config_item('APP_SECRET'));
$session = FacebookSession::newAppSession();
try {
$session->validate();
} catch (FacebookRequestException $ex) {
// Session not valid, Graph API returned an exception with the reason.
return FALSE;
} catch (\Exception $ex) {
// Graph API returned info, but it may mismatch the current app or have expired.
return FALSE;
}
$request = new FacebookRequest(
$session,
'POST',
'/'.facebook_uid,
array(
'password' => 'password',
'name' => 'Test Username'
)
);
try {
$response = $request->execute();
} catch (FacebookRequestException $ex) {
// (#200) You do not have sufficient permissions to perform this action
// (#100) Invalid password
// (#100) Invalid name
return ($ex->getCode() == 100) ? TRUE : FALSE;
} catch (\Exception $ex) {
return FALSE;
}
/*
object(Facebook\GraphObject)#1714 (1) {
["backingData":protected]=>
array(1) {
["success"]=>
bool(true)
}
}
*/
$graphObject = $response->getGraphObject();
return ($graphObject) ? TRUE : FALSE;
}