Технический вопрос по работе с API

Технические вопросы по UTM 5.0
Ответить
RuleZzz
Сообщения: 2
Зарегистрирован: Пт фев 17, 2017 15:58

Технический вопрос по работе с API

Сообщение RuleZzz »

Здравствуйте!

У меня сейчас стоит задача написать страницу регистрации абонентов для монтажников и я столкнулся с непониманием, как добавить сервисную связку с IP-адресом и MAC-адресом абонента.

Сборка: 5.3-001
Работаю с помощью: https://github.com/k-shym/URFAClient
API.XML взял с самого сервера

На текущий момент у меня сделано так:
создаю пользователя:

Код: Выделить всё

rpcf_add_user_new=0x2125
выдаю ему группу:

Код: Выделить всё

rpcf_add_group_to_user=0x2552
устанавливаю ему тариф:

Код: Выделить всё

rpcf_link_user_tariff=0x3018
все эти действия проходят как нужно, но дальше мне нужно к тарифу добавить сервисную связку, пробовал следующие функции:

Код: Выделить всё

rpcf_add_ip_slink_ex=0x2928
rpcf_add_iptraffic_service_link_ipv6=0x292c
сейчас остановился на 0x2928 но ответы что там, что там одинаковы

На текущий момент функция из api.xml выглядит следующим образом:

Код: Выделить всё

<function name="rpcf_add_ip_slink_ex" id="0x2928">
        <input>
            <integer name="user_id"/>
            <integer name="account_id" default="basic_account"/>
            <integer name="service_id"/>
            <integer name="tariff_link_id" default="0"/>
            <integer name="discount_period_id"/>
            <integer name="start_date" default="now&#40;&#41;"/>
            <integer name="expire_date" default="max_time&#40;&#41;"/>
            <integer name="unabon" default="0"/>
            <integer name="unprepay" default="0"/>
            <integer name="ip_groups_count" default="size&#40;ip_address&#41;"/>
            <for name="i" from="0" count="size&#40;ip_address&#41;">
                <ip_address name="ip" array_index="i"/>
                <integer name="mask" array_index="i" default="-1"/>
                <string name="mac" array_index="i" default=""/>
                <string name="iptraffic_login" array_index="i" default=""/>
                <string name="iptraffic_allowed_cid" array_index="i" default=""/>
                <string name="iptraffic_password" array_index="i" default=""/>
                <integer name="ip_not_vpn" array_index="i" default="0"/>
                <integer name="dont_use_fw" array_index="i" default="0"/>
                <integer name="router_id" array_index="i" default="0"/>
            </for>
            <integer name="quotas_count" default="size&#40;quota&#41;"/>
            <for name="i" from="0" count="size&#40;quota&#41;">
                <integer name="tclass_id" array_index="i"/>
                <long name="quota" array_index="i"/>
            </for>
        </input>
        <output>
            <integer name="slink_id" />
        </output>
    </function>
Данные которые отправляю:

Код: Выделить всё

$data&#91;'rpcf_add_ip_slink_ex'&#93; = &#91;
    'user_id' => $userResponse&#91;'user_id'&#93;,
    'account_id' => $userResponse&#91;'basic_account'&#93;,
    'service_id' => $service_id,
    'tariff_link_id' => $tariff_link_id&#91;'tariff_link_id'&#93;,
    'discount_period_id' => $discount_periods&#91;'id'&#93;,
    'unprepay' => 1,
    'ip_address' => &#91;
        &#91;
            'ip' => $ip_address,
            'mask' => $mask,
            'mac' => $mac,
            'ip_not_vpn' => $ip_not_vpn,
        &#93;
    &#93;
&#93;;
В ответ на текущую конструкцию я получаю

Код: Выделить всё

slink_id=0
А в debug.log

Код: Выделить всё

Feb 17 16&#58;15&#58;24 ?Debug &#58; bc9b4700 RPCConn&#91;SSL&#93;<init@127.0.0.1>&#58; Call&#58; 0x2928 &#40;rpcf_add_iptraffic_service_link_ex&#41;
Feb 17 16&#58;15&#58;24 ?Debug &#58; bc9b4700 RPCConn&#91;SSL&#93;<init@127.0.0.1>&#58; Real Call&#58; 0x2928 &#40;rpcf_add_iptraffic_service_link_ex&#41;
Feb 17 16&#58;15&#58;24 ?Debug &#58; bc9b4700 RPCServer@0.0.0.0&#58; unabon=<1> unprepay=<0> recalc_type=<0> recalc_traffic=<0>
Feb 17 16&#58;15&#58;24  ERROR &#58; bc9b4700 RPCServer@0.0.0.0&#58; Exception in void* rpcf_add_iptraffic_service_link_ex&#40;void*&#41;&#58; #22
Feb 17 16&#58;15&#58;24 ?Debug &#58; bc9b4700 RPCConn&#91;SSL&#93;<init@127.0.0.1>&#58; Call 0x2928 &#40;rpcf_add_iptraffic_service_link_ex&#41; finished in 0.04 sec
Мои догадки:
- либо я использую не ту функцию
- либо помимо этого всего мне нужно сделать ещё что-то
- либо неправильно отправляю переменные API-Серверу

Cramac
Сообщения: 454
Зарегистрирован: Сб июл 01, 2006 17:59

Сообщение Cramac »

тут уже это было, но как то так:

Код: Выделить всё

function URFA_add_tarif &#40;$urfa, $user_id, $account_id, $tariff_id, $discount_period_id, $ip_add, $netmask_add, $login_add, $password_add&#41;
	&#123;
	# Получаем информацию об услугах тарифа 
	$tsvc = $urfa->rpcf_get_tariff&#40;array&#40;"tariff_id"=>$tariff_id&#41;&#41;; 
	print_r&#40;$tsvc&#41;;

	//Подключаем тариф
	  $param&#91;"user_id"&#93;=$user_id;
      $param&#91;"account_id"&#93;=$account_id;
      $param&#91;"tariff_current"&#93;=$tariff_id;
      $param&#91;"discount_period_id"&#93;=$discount_period_id;
	  $param&#91;"change_now"&#93;="0";
	$tariff_link_id = $urfa->rpcf_link_user_tariff&#40;$param&#41;;
	print_r&#40;$tariff_link_id&#41;;

	# Поделючение всех услуг 
	$max = count&#40;$tsvc&#91;'services_count'&#93;&#41;; 

	for &#40; $i = 0; $i < $max; $i++ &#41; 
		&#123; 
		$srv_in_tarif  = $tsvc&#91;'services_count'&#93;&#91;$i&#93;; 
		
		$service_new = array&#40;&#41;; 
		$service_new&#91;'user_id'&#93; 		= $user_id; 
		$service_new&#91;'account_id'&#93; 		= $account_id; 
		$service_new&#91;'return_type'&#93; 	= ''; 
		$service_new&#91;'service_id'&#93;			= $srv_in_tarif&#91;'service_id_array'&#93;;
		$service_new&#91;'service_type'&#93;		= $srv_in_tarif&#91;'service_type_array'&#93;; 
		$service_new&#91;'tariff_link_id'&#93; 	= $tariff_link_id&#91;'tariff_link_id'&#93;; 

		if &#40; $srv_in_tarif&#91;'service_type_array'&#93; == '2' &#41; &#123; 
			# Периодическая услуга 

			$service_new&#91;'discount_period_id'&#93; = $discount_period_id; 
			$service_new&#91;'policy_id'&#93; = 1; 
			
			# Добавляем услугу 
			$report = $urfa->rpcf_add_periodic_slink_ex&#40;$service_new&#41;;
			&#125; 
		if &#40; $srv_in_tarif&#91;'service_type_array'&#93; == '3' &#41; 
			&#123; 
			# Передача трафика 
			$service_new&#91;'service_id'&#93; = $srv_in_tarif&#91;'service_id_array'&#93;; 
			$service_new&#91;'tplink_id'&#93; = $service_new&#91;'tariff_link_id'&#93;; 
			$service_new&#91;'discount_period_id'&#93; = $discount_period_id; 
			$service_new&#91;'start_date'&#93; = time&#40;&#41;; 
			$service_new&#91;'expire_date'&#93; = mktime&#40;0,0,0,1,1,2030&#41;;
			
			$service_new&#91;'policy_id'&#93; = 1; 
			$service_new&#91;'unabon'&#93; = 0; 
			$service_new&#91;'unprepay'&#93; = 0; 
			//$service_new&#91;'ip_address'&#93; = array&#40;&#41;; 

			# Подключаем IP 
			$service_new&#91;'ip_groups_count'&#93;&#91;&#93; = array&#40; 
				'ip' => $ip_add, 
				'mac' => "", 
				'allowed_cid' => "",
				'mask' => $netmask_add, 
				'login'=> $login_add, 
				'password'=> $password_add,
				'is_skip_radius' => 0,
				'is_skip_rfw' => 0,
				'router_id' => 0
				&#41;; 
				
			$service_new&#91;'quota'&#93; = array&#40;&#41;; 
			
			# Добавляем услугу 
			$report = $urfa->rpcf_add_iptraffic_service_link_ipv6&#40;$service_new&#41;;
			&#125; 

		 
		&#125; 

	&#125;	

RuleZzz
Сообщения: 2
Зарегистрирован: Пт фев 17, 2017 15:58

Сообщение RuleZzz »

Спасибо, я решил эту проблему (именно создание сервисной связкой) другим способом, используя не k-shym/URFAClient, а другие классы для работы с API

Код: Выделить всё

    public function rpcf_add_ip_slink_ex&#40;$data&#41;
    &#123;
        if &#40;!$this->urfa->call&#40;0x2928&#41;&#41; &#123;
            print "Error calling function " . __FUNCTION__ . "\n";
            return FALSE;
        &#125;

        $this->urfa->put_int&#40;$data&#91;'user_id'&#93;&#41;;//user_id
        $this->urfa->put_int&#40;$data&#91;'account_id'&#93;&#41;;//account_id
        $this->urfa->put_int&#40;$data&#91;'service_id'&#93;&#41;;//service_id
        $this->urfa->put_int&#40;$data&#91;'tariff_link_id'&#93;&#41;;//tariff_link_id
        $this->urfa->put_int&#40;$data&#91;'discount_period_id'&#93;&#41;;//discount_period_id
        $this->urfa->put_int&#40;time&#40;&#41;&#41;;//start_date
        $this->urfa->put_int&#40;time&#40;&#41; + &#40;365*24*3600&#41;&#41;;//expire_date
        $this->urfa->put_int&#40;1&#41;;//unabon
        $this->urfa->put_int&#40;1&#41;;//unprepay
        $this->urfa->put_int&#40;1&#41;;//ip_groups_count
        $this->urfa->put_int&#40;ip2long&#40;$data&#91;'ip_address'&#93;&#41;&#41;;//ip_address
        $this->urfa->put_int&#40;$data&#91;'mask'&#93;&#41;;//mask
        $this->urfa->put_string&#40;$data&#91;'mac'&#93;&#41;;//mac
        $this->urfa->put_string&#40;''&#41;;//iptraffic_login
        $this->urfa->put_string&#40;''&#41;;//iptraffic_allowed_cid
        $this->urfa->put_string&#40;''&#41;;//iptraffic_password
        $this->urfa->put_int&#40;$data&#91;'ip_not_vpn'&#93;&#41;;//ip_not_vpn
        $this->urfa->put_int&#40;0&#41;;//dont_use_fw
        $this->urfa->put_int&#40;0&#41;;//router_id
        $this->urfa->put_int&#40;0&#41;;//quotas_count
        $this->urfa->send&#40;&#41;;

        $ret = $this->urfa->get_int&#40;&#41;;//slink_id

        $this->urfa->finish&#40;&#41;;

        return $ret;
    &#125;

Ответить