URFAClient
URFAClient PHP (api.xml)
Install / Use
/learn @k-shym/URFAClientREADME
URFAClient
Универсальный PHP клиент для биллинговой системы NetUp UTM5 на основе api.xml
Установка (composer)
composer require k-shym/urfa-client "^2.0"
Зависимости
- UTM 5.2.1-008 >=
- PHP 5.4 >=
- Ext: JSON, OpenSSL, SimpleXML, Hash, Filter
Описание параметров
| option | default | описание | |-----------|--------------------|---------------------------------------------------------------------------------------------------------------------------------------------------| | login* | — | логин администратора или пользователя | | password* | — | пароль администратора или пользователя соответственно | | address* | — | адрес ядра UTM5 | | port | 11758 | порт ядра UTM5 | | timeout | 30 | время ожидания ответа от сервера | | protocol | auto | ssl или tls (доступно с версии UTM-5.3-002-update16) или auto (доступно с версии UTM-5.3-005-update2, работает с OpenSSL 1.1) | | admin | true | указываем какой пользователь подключается, если TRUE предоставляет сертификат admin.crt для соединения, используется только для протокола ssl | | api | api_53-006.xml | путь до файла api.xml |
CMD
bin/urfaclient -h
The options are as follows:
[-a, --api <path> ] Path to api.xml
[-f, --function <name>] Name function from api.xml
[-t, --type <type>] Type return (array, json, xml), default: array
[-l, --list] List of functions from api.xml
[-h, --help ] This help
[-v, --version ] Version URFAClient
Пример
Рассмотрим пример использования библиотеки на примере функции rpcf_add_user_new, у нас есть XML описание:
<function name="rpcf_add_user_new" id="0x2125">
<input>
<string name="login"/>
<string name="password"/>
<string name="full_name" default=""/>
<integer name="is_juridical" default="0"/>
<string name="jur_address" default=""/>
<string name="act_address" default=""/>
<string name="flat_number" default=""/>
<string name="entrance" default=""/>
<string name="floor" default=""/>
<string name="district" default=""/>
<string name="building" default=""/>
<string name="passport" default=""/>
<integer name="house_id" default="0"/>
<string name="work_tel" default=""/>
<string name="home_tel" default=""/>
<string name="mob_tel" default=""/>
<string name="web_page" default=""/>
<string name="icq_number" default=""/>
<string name="tax_number" default=""/>
<string name="kpp_number" default=""/>
<string name="email" default=""/>
<integer name="bank_id" default="0"/>
<string name="bank_account" default=""/>
<string name="comments" default=""/>
<string name="personal_manager" default=""/>
<integer name="connect_date" default="0"/>
<integer name="is_send_invoice" default="0"/>
<integer name="advance_payment" default="0"/>
<integer name="switch_id" default="0"/>
<integer name="port_number" default="0"/>
<integer name="binded_currency_id" default="810"/>
<integer name="parameters_count" default="size(parameter_value)"/>
<for name="i" from="0" count="size(parameter_value)">
<integer name="parameter_id" array_index="i"/>
<string name="parameter_value" array_index="i"/>
</for>
<integer name="groups_count" default="size(groups)"/>
<for name="i" from="0" count="size(groups)">
<integer name="groups" array_index="i"/>
</for>
<integer name="is_blocked" default="0"/>
<double name="balance" default="0.0"/>
<double name="credit" default="0.0"/>
<double name="vat_rate" default="0.0"/>
<double name="sale_tax_rate" default="0.0"/>
<integer name="int_status" default="1"/>
</input>
<output>
<integer name="user_id"/>
<if variable="user_id" value="0" condition="eq">
<integer name="error_code"/>
<string name="error_description"/>
</if>
<if variable="user_id" value="0" condition="ne">
<integer name="basic_account"/>
</if>
</output>
</function>
И так, нам нужно описать входные параметры (элемент input) в ассоциативный массив.
Если в элементе присутствует атрибут default, параметр считается необязательным.
Получаем полное описание параметров функции rpcf_add_user_new из api.xml:
bin/urfaclient -f rpcf_add_user_new -t json
{
"login": "",
"password": "",
"full_name": "",
"is_juridical": 0,
"jur_address": "",
"act_address": "",
"flat_number": "",
"entrance": "",
"floor": "",
"district": "",
"building": "",
"passport": "",
"house_id": 0,
"work_tel": "",
"home_tel": "",
"mob_tel": "",
"web_page": "",
"icq_number": "",
"tax_number": "",
"kpp_number": "",
"email": "",
"bank_id": 0,
"bank_account": "",
"comments": "",
"personal_manager": "",
"connect_date": 0,
"is_send_invoice": 0,
"advance_payment": 0,
"switch_id": 0,
"port_number": 0,
"binded_currency_id": 0,
"parameters_count": [
{
"parameter_id": 0,
"parameter_value": ""
}
],
"groups_count": [
{
"groups": 0
}
],
"is_blocked": 0,
"balance": 0,
"credit": 0,
"vat_rate": 0,
"sale_tax_rate": 0,
"int_status": 0
}
На основе данного описания оставляем необходимые нам параметры, порядок параметров неважен.
Как было замечено, разработчики UTM5 не пришли к единому формату описания функций. Отсюда возник вопрос, какое имя давать параметру for для элементов массива?
Поэтому было принято решение, в качестве имени использовать имя атрибута счетчика *_count. В нашем случае будет так:
[
// ...
'parameters_count' => [
[
'parameter_id' => 0,
'parameter_value' => 'м',
],
[
'parameter_id' => 1,
'parameter_value' => '13.06.2014',
],
],
'groups_count' => [
[
'groups' => 1000,
],
[
'groups' => 1001,
],
],
// ...
];
Если попадется элемент error будет выброшено исключение XML Described error:, а далее атрибуты ошибки.
C условиями if все просто, если истина, то заходим внутрь. И содержание обрабатывается, как описано выше.
В итоге, получаем минимальный набор параметров для создания пользователя:
require __DIR__ . '/vendor/autoload.php';
use URFAClient\URFAClient;
$urfa = URFAClient::init([
'login' => 'init',
'password' => 'init',
'address' => 'localhost',
]);
$result = $urfa->rpcf_add_user_new([
'login'=>'test',
'password'=>'test',
]);
$result = $urfa->rpcf_add_user_new('{
"login": "test2",
"password": "test2"
}');
В переменную $result попадут данные которые описаны в элементе output.
Тесты
docker-compose up -d
docker exec -t urfa composer install
docker exec -t urfa vendor/bin/phpunit --coverage-text
Возможные проблемы
- Тестировалось на версии биллинга UTM-5.3-003, UTM-5.4-004 и UTM-5.5-015
- Тестировались не все функции из api.xml
- При обновлении api.xml обязательно проверяйте используемые функции
По возникшим проблемам присылайте api.xml и полную версию ядра UTM5. Удачи!
Related Skills
node-connect
353.3kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
111.7kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
353.3kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
353.3kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
