zorn-v/urfa-client

基于api.xml的UTM5 NetUp计费系统的通用PHP客户端

v2.2.5 2020-09-16 05:30 UTC

This package is auto-updated.

Last update: 2024-08-29 05:24:40 UTC


README

基于api.xml的UTM5 NetUp计费系统的通用PHP客户端

安装

composer require zorn-v/urfa-client

依赖

  • UTM 5.3-005 >=
  • PHP 7.1 >=
  • 扩展: OpenSSL, SimpleXML, Hash, Filter

参数描述

示例

以函数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属性,则参数被认为是可选的。

从api.xml获取函数rpcf_add_user_new的完整参数描述

require __DIR__ . '/vendor/autoload.php';

$urfa = new \UrfaClient\UrfaClient();
var_export($urfa->method('rpcf_add_user_new'));
array (
  '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' =>
  array (
    0 =>
    array (
      'parameter_id' => 0,
      'parameter_value' => '',
    ),
  ),
  'groups_count' =>
  array (
    0 =>
    array (
      'groups' => 0,
    ),
  ),
  'is_blocked' => 0,
  'balance' => 0,
  'credit' => 0,
  'vat_rate' => 0,
  'sale_tax_rate' => 0,
  'int_status' => 0,
)

基于此描述,保留必要的参数,参数顺序不重要。

如前所述,UTM5的开发者没有达成函数描述格式的统一。因此,出现了关于数组中for参数命名的问题。因此,我们决定使用api.xml中前一个属性的名称作为名称(在某些情况下可能会出现问题)。在我们的例子中将是这样的

array(
    // ...
    'parameters_count' => array(
        array(
            'parameter_id' => 0,
            'parameter_value' => 'м',
        ),
        array(
            'parameter_id' => 1,
            'parameter_value' => '13.06.2014',
        ),
    ),
    'groups_count' => array(
        array(
            'groups' => 1000,
        ),
        array(
            'groups' => 1001,
        ),
    ),
    // ...
)

如果遇到error元素,将抛出异常XML Described error:,然后是错误的属性。

条件if很简单,如果为真,则进入内部。内容处理方式如上所述。

最终,我们得到了创建用户的最小参数集

require __DIR__ . '/vendor/autoload.php';

$options = [
    'login'    => 'init',
    'password' => 'init',
    'host'  => 'localhost',
];
$urfa = new \UrfaClient\UrfaClient($options);

$result = $urfa->rpcf_add_user_new(array(
    'login'=>'test',
    'password'=>'test',
));

变量$result将包含元素output中描述的数据。

debug选项

如果您想查看具体发送或接收的字节,可以这样做

<?php

require __DIR__ . '/vendor/autoload.php';

$options = [
    'host' => 'localhost',
    'login' => 'init',
    'password' => 'init',
    'debug' => true,
];

class Logger extends \Psr\Log\AbstractLogger
{
    public function log($level, $message, array $context = array())
    {
        echo $level.' '.$message."\n";
    }
}

$urfa = new \UrfaClient\UrfaClient($options, new Logger());
print_r($urfa->rpcf_whoami());

可能的问题

  • 在UTM-5.3-005-update2版本上进行了测试
  • 未测试api.xml中的所有功能
  • 未实现PHP x32的long类型传输
  • 更新api.xml时,务必检查使用的功能

变更日志

CHANGELOG.md