Я столкнулся с этим вопросом в 2016 году, есть гораздо более простые способы его реализации, чем принятый ответ и самый высокий голос.
- Используйте библиотеку XMPP PHP, наиболее распространенной из которых является:
https://github.com/fabiang/xmpp
- Хотя эта библиотека не поддерживает добавление пользователя из коробки, вы можете очень легко расширить его
вот класс, который я написал для добавления пользователя:
use Fabiang\Xmpp\Util\XML;
/**
* Register new user
* @param string $username
* @param string $password
* @param string $email
* @package XMPP\Protocol
* @category XMPP
*/
class Register implements ProtocolImplementationInterface
{
protected $username;
protected $password;
protected $email;
/**
* Constructor.
*
* @param string $username
* @param string $password
* @param string $email
*/
public function __construct($username, $password, $email)
{
$this->username = $username;
$this->password = $password;
$this->email = $email;
}
/**
* Build XML message
* @return type
*/
public function toString()
{
$query = "<iq type='set' id='%s'><query xmlns='jabber:iq:register'><username>%s</username><password>%s</password><email>%s</email></query></iq>";
return XML::quoteMessage($query, XML::generateId(), (string) $this->username, (string) $this->password, (string) $this->email);
}
}
- Вы должны включить внутриполосную регистрацию в файле ejabberd.cfg, поскольку по умолчанию это запрещено:
{доступ, регистрация, [{разрешить, все}]}.
Наконец, вот пример кода для использования этого класса:
private function registerChatUser($name, $password, $email)
{
$address = 'tcp://yourserverip:5222';
$adminUsername = 'youradmin';
$adminPassword = 'youradminpassword';
$options = new Options($address);
$options->setUsername($adminUsername)->setPassword($adminPassword);
$client = new Client($options);
$client->connect();
$register = new Register($name, $password, $email);
$client->send($register);
$client->disconnect();
}
Вызвать библиотеку не удастся, если на сервере нет действительного сертификата SSL. Либо поместите действительный сертификат, либо замените эту часть в SocketClient.php приведенным ниже фрагментом
// call stream_socket_client with custom error handler enabled
$handler = new ErrorHandler(
function ($address, $timeout, $flags) {
$options = [
'ssl' => [
'allow_self_signed' => true,
'verify_peer_name' => false,
],
];
$context = stream_context_create($options);
return stream_socket_client($address, $errno, $errstr, $timeout, $flags, $context);
},
$this->address,
$timeout,
$flags
);