urfaclient на php

Вопросы по сопутствующим продуктам производства партнеров
Ответить
Wishmaster
Сообщения: 309
Зарегистрирован: Сб апр 16, 2005 11:44

Сообщение Wishmaster »

Magnum72 писал(а):
ds писал(а):Можете подсказать что означает max_time() например в rpcf_save_account :
<integer name="block_end_date" default="max_time()"/>
Означает максимально возможное с точки зрения биллинга время 2037 год вообщем :)
Конкретно в этом случае означает:
выставить дату завершения блокировки (если не указано явно) в дофига

есть аналогичная переменная в апи now() = текущее время.
Если судить по БД, то как правило, все бессрочные даты кончаются на 2000000000 в unixtime. (это 18.05.2033 03:33:20). Предлагаю, чтобы не путаться, в дальнейшем, в скрипте php-urfa-client использовать именно эту величину в качестве max_time().
Можно даже внедрить ее в основную часть.
Функции date("U") и time() в php, по всей видимости, являются полными аналогами функции now() в API.

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

ds, да именно function rpcf_get_prepaid_units($slink_id) , но что то работать не хочет.
Делаю
$prepaid = rpcf_get_prepaid_units(3060);
print_r($prepaid);

В дебаге

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

 Info  &#58; Jan 10 20&#58;59&#58;37 RPCConn&#58; Card user <test000@127.0.0.1> is connecting
 Info  &#58; Jan 10 20&#58;59&#58;37 RPCConn&#91;SSL&#93;<test000@127.0.0.1>&#58; Access granted to &#91;SSL&#93;<test000@127.0.0.1> &#40;UID&#58; -21&#41;
?Debug &#58; Jan 10 20&#58;59&#58;37 RPCConn&#91;SSL&#93;<test000@127.0.0.1>&#58; SSL type requested&#58; SSLv3&#40;2&#41;
?Debug &#58; Jan 10 20&#58;59&#58;37 RPCConn&#91;SSL&#93;<test000@127.0.0.1>&#58; Call&#58; 0x5500 &#40;__rpcs_get_prepaid_units&#41;
?Debug &#58; Jan 10 20&#58;59&#58;37 RPCConn&#91;SSL&#93;<test000@127.0.0.1>&#58; Real Call&#58; 0x5500 &#40;__rpcs_get_prepaid_units&#41;
?Debug &#58; Jan 10 20&#58;59&#58;37 RPCConn&#91;SSL&#93;<test000@127.0.0.1>&#58; Call 0x5500 &#40;__rpcs_get_prepaid_units&#41; finished...
?Debug &#58; Jan 10 20&#58;59&#58;37 RPCConn&#91;SSL&#93;<test000@127.0.0.1>&#58; Stream cleared
 Warn  &#58; Jan 10 20&#58;59&#58;37 RPCConn&#91;SSL&#93;<test000@127.0.0.1>&#58; Session closed
?Debug &#58; Jan 10 20&#58;59&#58;37 RPCConn&#91;SSL&#93;<test000@127.0.0.1>&#58; Session stored for UID -21 from <127.0.0.1>
?Debug &#58; Jan 10 20&#58;59&#58;37 RPCConn&#91;SSL&#93;<test000@127.0.0.1>&#58; Session closed...
Но вывод нулевой, т.е. результата нет :(

Аватара пользователя
ds
Сообщения: 380
Зарегистрирован: Пн сен 18, 2006 14:06

Сообщение ds »

Странно, у меня работает. А в дебаге тоже самое

slink_id правильный?

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

$prepaid = rpcf_get_prepaid_units&#40;969&#41;;
print_r&#40;$prepaid&#41;;


Array
&#40;
    &#91;bytes_in_mbyte&#93; => 1048576
    &#91;pinfo_size&#93; => 8
    &#91;0&#93; => Array
        &#40;
            &#91;id&#93; => 10
            &#91;old&#93; => 0
            &#91;cur&#93; => 41943040
        &#41;

    &#91;1&#93; => Array
        &#40;
            &#91;id&#93; => 11
            &#91;old&#93; => 0
            &#91;cur&#93; => 0
        &#41;

    &#91;2&#93; => Array
        &#40;
            &#91;id&#93; => 20
            &#91;old&#93; => 0
            &#91;cur&#93; => 0
        &#41;

    &#91;3&#93; => Array
        &#40;
            &#91;id&#93; => 500
            &#91;old&#93; => 0
            &#91;cur&#93; => 0
        &#41;

    &#91;4&#93; => Array
        &#40;
            &#91;id&#93; => 700
            &#91;old&#93; => 0
            &#91;cur&#93; => 0
        &#41;

    &#91;5&#93; => Array
        &#40;
            &#91;id&#93; => 800
            &#91;old&#93; => 0
            &#91;cur&#93; => 0
        &#41;

    &#91;6&#93; => Array
        &#40;
            &#91;id&#93; => 900
            &#91;old&#93; => 0
            &#91;cur&#93; => 0
        &#41;

    &#91;7&#93; => Array
        &#40;
            &#91;id&#93; => 10000
            &#91;old&#93; => 0
            &#91;cur&#93; => 0
        &#41;

&#41;

Аватара пользователя
ds
Сообщения: 380
Зарегистрирован: Пн сен 18, 2006 14:06

Сообщение ds »

Если судить по БД, то как правило, все бессрочные даты кончаются на 2000000000 в unixtime. (это 18.05.2033 03:33:20). Предлагаю, чтобы не путаться, в дальнейшем, в скрипте php-urfa-client использовать именно эту величину в качестве max_time().
Можно даже внедрить ее в основную часть.
Функции date("U") и time() в php, по всей видимости, являются полными аналогами функции now() в API.
Согласен, тогда в socket.php пишем

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

function now&#40;&#41; &#123;
  return time&#40;&#41;;
&#125;

function max_time&#40;&#41; &#123;
   return 2000000000;
&#125;
тогда rpcf_save_account бедет выглядеть так: если block_start_date и block_end_date будут -1, то передадутся значения по умолчанию.
Массив $account общий для rpcf_save_account, rpcf_get_accountinfo, rpcf_add_account

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

function rpcf_save_account&#40;$account_id,$account, $block_start_date, $block_end_date, $block_recalc_abon, $block_recalc_prepaid, $unlimited ,$discount_period_id&#41; &#123; //0x2032

    if &#40;!urfa_call&#40;0x2032&#41;&#41; &#123;
        print "Error calling function ". __FUNCTION__ ."\n";
        return FALSE;
    &#125;
    if &#40;$block_start_date == -1&#41;
       $block_start_date = now&#40;&#41;;
    if &#40;$block_end_date == -1&#41;
       $block_end_date = max_time&#40;&#41;;

    $packet = new Packet&#40;&#41;;
    $packet->DataSetInt&#40;$account_id&#41;;
    $packet->DataSetInt&#40;$discount_period_id&#41;;
    $packet->DataSetDouble&#40;$account&#91;'credit'&#93;&#41;;
    $packet->DataSetInt&#40;$account&#91;'is_blocked'&#93;&#41;;
    if &#40;$account&#91;'is_blocked'&#93;!=0&#41; &#123;
       $packet->DataSetInt&#40;$block_start_date&#41;;
       $packet->DataSetInt&#40;$block_end_date&#41;;
    &#125;
    $packet->DataSetInt&#40;$account&#91;'dealer_account_id'&#93;&#41;;
    $packet->DataSetDouble&#40;$account&#91;'vat_rate'&#93;&#41;;
    $packet->DataSetDouble&#40;$account&#91;'sale_tax_rate'&#93;&#41;;
    $packet->DataSetInt&#40;$account&#91;'int_status'&#93;&#41;;
    $packet->DataSetInt&#40;$block_recalc_abon&#41;;
    $packet->DataSetInt&#40;$block_recalc_prepaid&#41;;
    $packet->DataSetInt&#40;$unlimited&#41;;
    urfa_send_param&#40;$packet&#41;;
    urfa_get_data&#40;&#41;;
&#125;

Аватара пользователя
ds
Сообщения: 380
Зарегистрирован: Пн сен 18, 2006 14:06

Сообщение ds »

Kayfolom писал(а):ds, да именно function rpcf_get_prepaid_units($slink_id) , но что то работать не хочет.
Делаю
$prepaid = rpcf_get_prepaid_units(3060);
print_r($prepaid);

В дебаге

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

 Info  &#58; Jan 10 20&#58;59&#58;37 RPCConn&#58; Card user <test000@127.0.0.1> is connecting
 Info  &#58; Jan 10 20&#58;59&#58;37 RPCConn&#91;SSL&#93;<test000@127.0.0.1>&#58; Access granted to &#91;SSL&#93;<test000@127.0.0.1> &#40;UID&#58; -21&#41;
?Debug &#58; Jan 10 20&#58;59&#58;37 RPCConn&#91;SSL&#93;<test000@127.0.0.1>&#58; SSL type requested&#58; SSLv3&#40;2&#41;
?Debug &#58; Jan 10 20&#58;59&#58;37 RPCConn&#91;SSL&#93;<test000@127.0.0.1>&#58; Call&#58; 0x5500 &#40;__rpcs_get_prepaid_units&#41;
?Debug &#58; Jan 10 20&#58;59&#58;37 RPCConn&#91;SSL&#93;<test000@127.0.0.1>&#58; Real Call&#58; 0x5500 &#40;__rpcs_get_prepaid_units&#41;
?Debug &#58; Jan 10 20&#58;59&#58;37 RPCConn&#91;SSL&#93;<test000@127.0.0.1>&#58; Call 0x5500 &#40;__rpcs_get_prepaid_units&#41; finished...
?Debug &#58; Jan 10 20&#58;59&#58;37 RPCConn&#91;SSL&#93;<test000@127.0.0.1>&#58; Stream cleared
 Warn  &#58; Jan 10 20&#58;59&#58;37 RPCConn&#91;SSL&#93;<test000@127.0.0.1>&#58; Session closed
?Debug &#58; Jan 10 20&#58;59&#58;37 RPCConn&#91;SSL&#93;<test000@127.0.0.1>&#58; Session stored for UID -21 from <127.0.0.1>
?Debug &#58; Jan 10 20&#58;59&#58;37 RPCConn&#91;SSL&#93;<test000@127.0.0.1>&#58; Session closed...
Но вывод нулевой, т.е. результата нет :(
Поправлюсь, если slink_id неправильный, выдавалась ошибка Call to a member function DataGetInt() on a non-object in /home/ivan/urfaclient/functions.php. На всех существующих результат был. Забыл проверить на неправильный slink. Надо было сделать так:

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

function rpcf_get_prepaid_units&#40;$slink_id&#41; &#123; //0x5500
    $ret=array&#40;&#41;;
    if &#40;!urfa_call&#40;0x5500&#41;&#41; &#123;
        print "Error calling function ". __FUNCTION__ ."\n";
        return FALSE;
    &#125;
    $packet = new Packet&#40;&#41;;
    $packet->DataSetInt&#40;$slink_id&#41;;
    urfa_send_param&#40;$packet&#41;;
    if &#40;$x = urfa_get_data&#40;&#41;&#41; &#123;
      $ret&#91;'bytes_in_mbyte'&#93; = $x->DataGetInt&#40;&#41;;
      $x = urfa_get_data&#40;&#41;;
      $ret&#91;'pinfo_size'&#93; = $x->DataGetInt&#40;&#41;;
      for&#40;$i=0;$i<$ret&#91;'pinfo_size'&#93;;$i++&#41; &#123;
          $x = urfa_get_data&#40;&#41;;
          $pinfo&#91;'id'&#93; = $x->DataGetInt&#40;&#41;;
          $pinfo&#91;'old'&#93; = $x->DataGetLong&#40;&#41;;
          $pinfo&#91;'cur'&#93; = $x->DataGetLong&#40;&#41;;
          $ret&#91;&#93;=$pinfo;
      &#125;
      urfa_get_data&#40;&#41;;
    &#125;
    return $ret;
&#125;
 
Теперь при ошибке выдается пустой массив.

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

У меня php затыкается в DataGetLong на return bin2long($this->data[$num]);

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

    function DataGetLong&#40;&#41; &#123;
	$num = $this->iterator;
	$this->iterator++;
	return bin2long&#40;$this->data&#91;$num&#93;&#41;;
    &#125;
В функцию передается

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

Packet Object
                (
                    [version] => 35
                    &#91;code&#93; => 200
                    [len] => 36
                    [iterator] => 2
                    [attr] => Array
                        (
                        )
                     [sock] => Resource id #8
                    [data] => Array
                        (
                            [0] => 
 
                            [1] => 
                            [2] => )&#65533;RR
                        )
                 )
&#91;/code&#93;

Если заменить DataGetLong на DataGetDouble, то все работает, но размер предоплаченного равен 3.4391450867057E-315 ;) Реальная цифра 663,844Мб

Аватара пользователя
ds
Сообщения: 380
Зарегистрирован: Пн сен 18, 2006 14:06

Сообщение ds »

У меня php затыкается в DataGetLong на return bin2long($this->data[$num]);
php скомпилирован с поддержкой --enable-bcmatch?

А что пхп выдает?

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

print PHP_INT_SIZE; 
и
print bcmul&#40;1048576,4294967296&#41;;
Или я накосячил? Завтра буду разбираться в общем

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

Видимо без --enable-bcmatch, без него никак?

print PHP_INT_SIZE; выдает 4

print bcmul(1048576,4294967296); - не работает :(

Аватара пользователя
ds
Сообщения: 380
Зарегистрирован: Пн сен 18, 2006 14:06

Сообщение ds »

Kayfolom писал(а):Видимо без --enable-bcmatch, без него никак?

print PHP_INT_SIZE; выдает 4

print bcmul(1048576,4294967296); - не работает :(
Да, никак. Если переделать на нормальное умножение, вычитание и т.д., то результат будет вида 3.43E+10 вместо например 34300000123, т.е рез-т будет приведен к типу double. Соответственно младшие разряды потеряются (в примере 123 округлится до 0).

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

Все операции с типом long из urfa - ф-ций следует производить именно через bcmatch.

И заменять DataGetLong на DataGetDouble нельзя, они при передаче от биллинга кодируются по разному.

Wishmaster
Сообщения: 309
Зарегистрирован: Сб апр 16, 2005 11:44

Сообщение Wishmaster »

2 ds

Я тут подумал, так как реализованных функций уже много, то может возникнуть путаница, что было реализовано, а что нет, может, целесообразно разделить функции на 4 типа, каждый тип в отдельный файл и инклудить их?

например:

func_admin_get.php
func_admin_set.php

func_user_get.php
func_user_set.php

По сути ничего не изменится, а вот наглядность будет более понятной.

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

Поставили bcmath и все замечательно заработало.
Предложение на будущее - может вывод функций в xml заворачивать, чтоб не париться с собственным парсингом при дальнейшем использовании?

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

Добавляю от себя

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

function rpcf_user5_change_password&#40;$old_password,$new_password,$new_password_ret&#41; &#123; //-0x4021
    $ret=array&#40;&#41;;
    if &#40;!urfa_call&#40;-0x4021&#41;&#41; &#123;
	print "Error calling function ". __FUNCTION__ ."\n";
	return FALSE;
    &#125;
    $packet = new Packet&#40;&#41;;
    $packet->DataSetString&#40;$old_password&#41;;
    $packet->DataSetString&#40;$new_password&#41;;
    $packet->DataSetString&#40;$new_password_ret&#41;;
    urfa_send_param&#40;$packet&#41;;
    $x = urfa_get_data&#40;&#41;;
    $ret&#91;'result'&#93;=$x->DataGetInt&#40;&#41;;
    urfa_get_data&#40;&#41;;
    return $ret;
&#125;
Проверил - работает

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

А как лучше реализовать вызов пользовательских и системных функций одновременно в пределах одной сессии?

Сейчас приходится делать urfa_login под юзером, делаем дела, потом urfa_close(), далее опять urfa_login под системным пользователем и т.д.

Может сделать urfa_login_user и urfa_login_system? И одну общую для них urfa_close().

Если я правильно понял код, то надо всего навсего ввести две глобальные переменные $socket, к примеру $socket_user и $socket_system?

bobr
Сообщения: 29
Зарегистрирован: Ср июл 18, 2007 11:09

Сообщение bobr »

поправильному нужно все переписать на классы :)

Аватара пользователя
ds
Сообщения: 380
Зарегистрирован: Пн сен 18, 2006 14:06

Сообщение ds »

bobr писал(а):поправильному нужно все переписать на классы :)
Будут вам классы, но чуть позже. И xml тоже будет :)

Ответить