1

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 "发生错误
"; } } _主要的();

文档:https ://developers.facebook.com/docs/chat/

4

1 回答 1

2

在函数 recv_xml 中替换

$xml = fread($fp, $size);

$xml = fread($fp, $size);

if (!preg_match('/^</', $xml)) {
    $xml = '<' . $xml;
}
于 2013-09-29T12:46:34.103 回答