Facebook 聊天 api,函数 xmpp_connect 在块上返回 false
// 从服务器获取挑战并解码
发送_xml($fp,$AUTH_XML);
if (!find_xmpp($fp, 'CHALLENGE', null, $challenge)) {
返回假;
}
I can't understand what is the problem. Please help.
// 版权所有 2004 年至今 Facebook。版权所有。
$STREAM_XML = '';
$AUTH_XML = '';
$CLOSE_XML = '';
$RESOURCE_XML = ''。
''。
'fb_xmpp_script';
$SESSION_XML = ''。
'';
$START_TLS = '';
功能 open_connection($server) {
print "[INFO] 打开连接...";
$fp = fsockopen($server, 5222, $errno, $errstr);
如果 (!$fp) {
打印“$errstr ($errno)
”;
} 别的 {
打印“连接打开
”;
}
返回 $fp;
}
函数 send_xml($fp, $xml) {
fwrite($fp, $xml);
}
函数recv_xml($fp, $size=4096) {
$xml = fread($fp, $size);
如果 ($xml === "") {
返回空值;
}
//解析xml
$xml_parser = xml_parser_create();
xml_parse_into_struct($xml_parser, $xml, $val, $index);
xml_parser_free($xml_parser);
返回数组($val,$index);
}
函数 find_xmpp($fp, $tag, $value=null, &$ret=null) {
静态 $val = null, $index = null;
做 {
if ($val === null && $index === null) {
列表($val,$index)=recv_xml($fp);
if ($val === null || $index === null) {
返回假;
}
}
foreach ($index as $tag_key => $tag_array) {
if ($tag_key === $tag) {
if ($value === null) {
if (isset($val[$tag_array[0]]['value'])) {
$ret = $val[$tag_array[0]]['value'];
}
返回真;
}
foreach ($tag_array as $i => $pos) {
if ($val[$pos]['tag'] === $tag && isset($val[$pos]['value']) &&
$val[$pos]['value'] === $value) {
$ret = $val[$pos]['value'];
返回真;
}
}
}
}
$val = $index = null;
} 而 (!feof($fp));
返回假;
}
函数 xmpp_connect($options, $access_token) {
全局 $STREAM_XML、$AUTH_XML、$RESOURCE_XML、$SESSION_XML、$CLOSE_XML、$START_TLS;
$fp = open_connection($options['server']);
如果 (!$fp) {
返回假;
}
// 启动身份验证过程(使用 X-FACEBOOK_PLATFORM)
发送_xml($fp,$STREAM_XML);
if (!find_xmpp($fp, 'STREAM:STREAM')) {
返回假;
}
if (!find_xmpp($fp, 'MECHANISM', 'X-FACEBOOK-PLATFORM')) {
返回假;
}
// 开始 tls - 强制使用 OAUTH 令牌!!!!
send_xml($fp, $START_TLS);
if (!find_xmpp($fp, 'PROCEED', null, $proceed)) {
返回假;
}
stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
发送_xml($fp,$STREAM_XML);
if (!find_xmpp($fp, 'STREAM:STREAM')) {
返回假;
}
if (!find_xmpp($fp, 'MECHANISM', 'X-FACEBOOK-PLATFORM')) {
返回假;
}
// 从服务器获取挑战并解码
发送_xml($fp,$AUTH_XML);
if (!find_xmpp($fp, 'CHALLENGE', null, $challenge)) {
返回假;
}
$challenge = base64_decode($challenge);
$挑战 = urldecode($挑战);
parse_str($challenge, $challenge_array);
// 创建响应数组
$resp_array = 数组(
'方法' => $challenge_array['方法'],
'nonce' => $challenge_array['nonce'],
'access_token' => $access_token,
'api_key' => $options['app_id'],
'call_id' => 0,
'v' => '1.0',
);
// 创建签名
$response = http_build_query($resp_array);
// 发送响应并等待成功
$xml = ''。
base64_encode($response).'';
发送_xml($fp,$xml);
if (!find_xmpp($fp, 'SUCCESS')) {
返回假;
}
// 完成认证过程
发送_xml($fp,$STREAM_XML);
if (!find_xmpp($fp,'STREAM:STREAM')) {
返回假;
}
if (!find_xmpp($fp, 'STREAM:FEATURES')) {
返回假;
}
发送_xml($fp,$RESOURCE_XML);
if (!find_xmpp($fp, 'JID')) {
返回假;
}
发送_xml($fp,$SESSION_XML);
if (!find_xmpp($fp, 'SESSION')) {
返回假;
}
// 我们成功了!
发送_xml($fp,$CLOSE_XML);
print("认证完成
");
fclose($fp);
返回真;
}
//获取带有xmpp_login权限的access_token
函数 get_access_token($app_id, $app_secret, $my_url){
$code = $_REQUEST["code"];
如果(空($code)){
$dialog_url = "https://www.facebook.com/dialog/oauth?scope=xmpp_login"。
"&client_id=" 。$app_id 。“&redirect_uri=”。urlencode($my_url) ;
echo("top.location.href='" . $dialog_url . "'");
}
$token_url = "https://graph.facebook.com/oauth/access_token?client_id="
. $app_id 。“&redirect_uri=”。urlencode($my_url)
. “&client_secret=”。$app_secret
. “&代码=”。$代码;
$access_token = file_get_contents($token_url);
parse_str($access_token, $output);
返回($输出['access_token']);
}
函数 _main() {
print "Test platform connect for XMPP
";
$app_id='';
$app_secret='';
$my_url = "";
$uid = '';
$access_token = get_access_token($app_id,$app_secret,$my_url);
打印 "access_token: ".$access_token."
";
$选项 = 数组(
'uid' => $uid,
'app_id' => $app_id,
'服务器' => 'chat.facebook.com',
);
// 打印使用的选项
print "server: ".$options['server']."
";
print "uid: ".$options['uid']."
";
print "app id: ".$options['app_id']."
";
if (xmpp_connect($options, $access_token)) {
打印“完成
”;
} 别的 {
print "发生错误
";
}
}
_主要的();