k-shym/urfa-client

Universal PHP client billing system NetUp UTM5 based api.xml

2.1.0 2023-07-09 14:31 UTC

This package is auto-updated.

Last update: 2024-05-11 17:51:40 UTC


README

PHP Version Require Latest Version Total Downloads

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. Удачи!