ejabberd 或 openfire 等 xmpp 服务端 注册新用户的问题

但丁_ 2014-06-11 11:43:44
最近需要用PHP 实现 向ejabberd 和openfire 服务端注册新用户,php方面 尝试了 jaxl 和xmpPHP ,都没有实现,相关文档非常少,基本上只有 如何发送信息,用代码注册新用户 的资料非常少,在这里向各位同学求助,还请不吝赐教,万分感谢。

目前问题:无法实现 新用户的注册。
...全文
262 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
风.foxwho 2014-06-12
  • 打赏
  • 举报
回复
有数据库了,直接插裤,最简单了
但丁_ 2014-06-11
  • 打赏
  • 举报
回复
我贴下我的代码吧。
我是在本地测试的,xmpp 服务端用的是openfire
网上看到有篇 jaxl 注册 openfire 用户的blog
然后跟着改了下代码


//引入核心文件
require_once './jaxl/jaxl.php';
error_reporting(E_ALL);
//初始化配置

$client = new JAXL(array(
"jid" => "reg",
"host" => "127.0.0.1",
"port" => "5222",
"log_level" => JAXL_DEBUG
));
var_dump($client);

$client->require_xep(array('0077'));

$form = array();

function wait_for_register_response($event, $args) {
global $client, $form;

if ($event == 'stanza_cb') {
$stanza = $args[0];
if ($stanza->name == 'iq') {
$form['type'] = $stanza->attrs['type'];
if ($stanza->attrs['type'] == 'result') {
echo "registration successful" . PHP_EOL . "shutting down..." . PHP_EOL;
$client->send_end_stream();
return "logged_out";
} else if ($stanza->attrs['type'] == 'error') {
$error = $stanza->exists('error');
echo "registration failed with error code: " . $error->attrs['code'] . " and type: " . $error->attrs['type'] . PHP_EOL;
echo "error text: " . $error->exists('text')->text . PHP_EOL;
echo "shutting down..." . PHP_EOL;
$client->send_end_stream();
return "logged_out";
} else {
echo "Error";
}
}
} else {
_notice("unhandled event $event rcvd");
}
}

function wait_for_register_form($event, $args) {
global $client, $form, $regdata; // reg data 為需求資料陣列
$stanza = $args[0];
$query = $stanza->exists('query', NS_INBAND_REGISTER);

if ($query) {

$instructions = $query->exists('instructions');
if ($instructions) {
echo $instructions->text . PHP_EOL;
}
foreach ($query->childrens as $k => $child) {
if ($child->name != 'instructions') {
// 原始 example 的 readline 改寫
$form[$child->name] = $regdata[$child->name];
}
}
// 移除無用欄位
unset($form["x"], $form["name"]);

$client->xeps['0077']->set_form($stanza->attrs['from'], $form);
return "wait_for_register_response";
} else {
$$client->send_end_stream();
return "logged_out";
}
}

// 取得註冊表單
$client->add_cb('on_stream_features', function($stanza) {
global $client, $domain; // $domain 請自行設定全域變數
$client->xeps['0077']->get_form($domain);
return "wait_for_register_form";
});

$client->start();
echo 'OK';


然后他说这个 相当于一直接受用户注册,往这个页面 提交 信息即可,但是不能以表单形式提交过来,要以ajax 提交,这个就搞不明白了。他要提交的东西 是个数组


一个数组你怎么用ajax提交,没搞懂,他最关键的部分 没有写出来。
但是他后面又确实在openfire 里面注册成功了,所以没办法来请教大家了,
我又找了另一个 博客代码是这样的

class xmpp {

public function register_user($username, $password) {
require_once './jaxl/jaxl.php';

$this->client = new JAXL(array(
'jid' => 'reg',
'host' => '127.0.0.1',
'port' => '5222',
'log_level' => JAXL_DEBUG
));

// var_dump($this->client);
$this->username = $username;

$this->password = $password;

$this->client->require_xep(array(
'0077' // InBand Registration
));
$thisClassObject = & $this;

$this->client->add_cb('on_stream_features', function($stanza) use(&$thisClassObject) {
$thisClassObject->client->xeps['0077']->get_form('localhost');
return array($thisClassObject, 'wait_for_register_form');
});

$this->client->start();

return;
}

public function wait_for_register_response($event, $args) {

if ($event == 'end_stream') {
return;
} else if ($event == 'stanza_cb') {
$stanza = $args[0];
echo '<pre>';
print_r($stanza);
if ($stanza->name == 'iq') {
if ($stanza->attrs['type'] == 'result') {
echo "registration successful" . PHP_EOL . "shutting down..." . PHP_EOL;
$client->send_end_stream();
return 'logged_out';
} else if ($stanza->attrs['type'] == 'error') {
$error = $stanza->exists('error');
echo "registration failed with error code: " . $error->attrs['code'] . " and type: " . $error->attrs['type'] . PHP_EOL;
echo "error text: " . $error->exists('text')->text . PHP_EOL;
echo "shutting down..." . PHP_EOL;
$client->send_end_stream();
return "logged_out";
}
}
}
}

public function wait_for_register_form($event, $args) {

$stanza = $args[0];
$query = $stanza->exists('query', NS_INBAND_REGISTER);
if ($query) {
$form = array();
$instructions = $query->exists('instructions');
if ($instructions) {
echo $instructions->text . PHP_EOL;
}

$this->client->xeps['0077']->set_form($stanza->attrs['from'], array('username' => $this->username, 'password' => $this->password));
return array($this, "wait_for_register_response");
} else {
$client->send_end_stream();
return "logged_out";
}
}

}

$xmppObj = new xmpp();
var_dump($xmppObj->register_user('user', 'password'));


这个也无法实现注册。只有一个程序打印的错误信息
registration failed with error code: 400 and type: modify
xuyanlu 2014-06-11
  • 打赏
  • 举报
回复
导致无法实现新用户注册的问题是什么?你做到哪遇到问题了?
深圳phper 2014-06-11
  • 打赏
  • 举报
回复
楼主信提供的息量,太少了,高手来了都不好定位呀。

20,359

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧