интеграция биллинг и хостинг панель

WOLF_2010

Постоялец
Заблокирован
Регистрация
8 Окт 2011
Сообщения
86
Реакции
113
  • Автор темы
  • Заблокирован
  • #1
ребят разъясните пожалуйста как биллинг блокирует хостинг панель за неуплату клиенту?
вот например возьмем тот же xfes биллинг допустим и ispmagaer они связывают свой биллинг и хостинг панель по id что ль? (сильно не пинайте просто пока что не могу понять как это все связывается)
 
У большинства панелей есть API через которое по крону все блокируется - Для просмотра ссылки Войди или Зарегистрируйся
 
  • Автор темы
  • Заблокирован
  • #3
Цукер спасибо что откликнулись, это получается мне нужно писать дополнительный скрипт типа этого? Для просмотра ссылки Войди или Зарегистрируйся (если например хочу связать с vestacp)

просто в самом биллинге у меня крон уже имеется
<?

global $CFG,$UE,$AGREES;
$UE=$CFG['UE'];

$ORDERS=array(
'0'=>array('img'=>'c_888','text'=>'Еще не активирован'),
'1'=>array('img'=>'c_0f0','text'=>'Активно, работает'),
'X'=>array('img'=>'c_f00','text'=>'В очереди на удаление'),
'-'=>array('img'=>'c_f0f','text'=>'Отключен или заблокирован'),
'.'=>array('img'=>'c_0ff','text'=>'Выполнен, можно удалять'),
'8'=>array('img'=>'c_00f','text'=>'Работает постоянно')
);

global $ORDS;
$ORDS=array(
'0'=>'Новый',
'1'=>'Активный',
'X'=>'На удалении',
'-'=>'Отключен',
'.'=>'Выполнен',
'8'=>'Постоянный'
);

$REASONS=array(
'C'=>'Недостаточно средств на счету заказа',
'U'=>'По запросу владельца',
'X'=>'Нарушение договора-оферты',
'T'=>'Техническая неисправность',
'W'=>'Обслуживание персоналом'
);

function calc_seq($n,$x,$min,$mul) {
for ($i=2; $i<=$n; $i++) {
if ($x*$mul<=$min) return($min);
else $x*=$mul;
}
return($x);
}
function calc_price($s,$n) {
global $UE,$USER;
$r=isset($USER->ratio)?$USER->ratio:1; if ($r<0) $r=1;
if (!$s or !is_array($s)) return array('p'=>0,'p1'=>0,'d'=>0);
$d=$n>1?$s['dec']*$n:0;
$p1=round($s['price']*(1-$d)*$UE*$r,2);
$p=$p1*$n;
return(array('d'=>$d,'p1'=>$p1,'p'=>$p));
}
function calc_price_h($s,$n) {
$x=calc_price($s,$n);
$x['p']=round($x['p']);
$x['p1']=round($x['p1']);
$x['d']=round($x['d']*100);
return($x);
}

function hosting_core_users_list_head() {
$r=mysql_query("select user,count(*) from orders group by user");
$o=array(); while (list($id,$n)=mysql_fetch_row($r)) $o[$id]=$n;
}

function hosting_operation_admin($add) {
global $MODULE;
return module_url($MODULE,"admin/actions?$add");
}

function order_remove($id,$rm=false) {
global $USER;
if (!$o=get_sql_row('orders',"id=$id")) return;
$s=get_sql_row('hserv',"id=$o[service]");
$u=get_sql_row('users',"id=$o[user]");
$rm=$rm?",rm='1'":",rm='0'";
mysql_query("update orders set dt_block=now()$rm where id=$o[id]");
mysql_query("update hserv set rm='1' where user=0 and (select count(*) from orders where service=$s[id] and rm='0')<1");
sys_log('O','hosting.order',$o['id'],"Удален заказ");
if ($o['money']!=0) {
$o['money']=round($o['money'],2);
mysql_query("update orders set money=0 where id=$o[id]");
mysql_query("update users set money=money+$o[money] where id=$o[user]");
if ($o['money']>0) { $cr='I.O'; $db='I.U'; $dir='c'; }
else { $cr='I.U'; $db='I.X'; $dir='c'; }
if ($USER->id==$o['user']) $USER->fetch();
$m=new money();
$m->create($cr,$db,abs($o['money']),$u['id'],"Удаление заказа пользователя $u[id] ($u[login])");
$m->addapp('hosting.order',$o['id'],$dir);
sys_log('$','fin.money',$m->id,"Средства $o[money] Р. возвращены при удалении заказа #$o[id]");
}
}

class order {

function order($id=0) {
$this->id=$id;
$this->fetch($id);
}

function clean() {
$o=get_sql_fields('orders');
$o['id']=0;
foreach ($o as $p=>$v) $this->$p=$v;
}

function fetch($id=0) {
global $USER;
if ($id!=0) $this->id=$id;
if ($this->id) {
if (!$o=get_sql_row('orders',"id='$this->id'")) $this->clean();
else foreach ($o as $p=>$v) $this->$p=$v;
}
else $this->clean();
if ($this->id) {
if ($this->user!=$USER->id and !$USER->allowed('a')) $this->clean();
}
}

function store1($p,$v=null) {
if (!$this->id) return false;
if (!isset($this->$p)) return false;
if ($v==null) $v=$this->$p;
mysql_query("update users set $p='$v' where id=$this->id");
return true;
}

function info() {
if (!$this->id) return "";
global $ORDS;
$h=get_sql_row('hosts',"id='$this->host'");
$s=get_sql_row('hserv',"id='$this->service'");
$tip=array();
$tip[]="<b>ID:</b> $this->id";
if ($this->st) $tip[]='<b>Статус:</b> '.$ORDS[$this->st];
if ($this->dt) $tip[]="<b>Создан:</b> $this->dt";
if ($this->rm=='1' and $this->dt_block) $tip[]="<b>Удалён:</b> $this->dt";
if (isset($this->money)) $tip[]='<b>Счёт:</b> '.round($this->money,2).' Р.';
$tip[]='';
if ($s) $tip[]="<b>Услуга:</b> $s[name]";
if ($this->num) $tip[]="<b>Срок:</b> $this->num";
if ($this->name) $tip[]="<b>Название:</b> $this->name";
$tip[]='';
if ($h) $tip[]="<b>Сервер:</b> ".($h['purl']?"<a href='$h[purl]' title='$h[pname]'>$h[name]</a>":$h['name']);
if ($this->login) $tip[]="<b>Логин/ID:</b> $this->login";
if ($this->ip) $tip[]="<b>IP:</b> $this->ip";
$tip=implode('<br>',$tip);
return $tip;
}

function linkto($text='') {
global $USER;
if (!$this->id) return('(нет)');
if (!$USER->allowed('a')) return "Заказ #$this->id";
if ($text=='') $text=module_to('hosting',"admin/orders?edit=$this->id","Заказ #$this->id");
$s='<nobr>'.$text.' ';
$s.=skin_tt_load(self_url("_CLEAN&TOOLTIP_ORDER=$this->id")).'</nobr>';
return($s);
}

}

function cron() {
global $MODULE,$PAR,$CFG,$USER;
$P=$PAR['hosting'];
mysql_query("lock tables config WRITE");
mysql_query("update config set val=val+1 where module='hosting' and par='CRON'");
$r=mysql_query("select val from config where module='hosting' and par='CRON'");
list($cron)=mysql_fetch_row($r);
mysql_query("unlock tables");
if ($cron%$P['CRON_PERIOD']!=0) return;

// Обработка не активированных заказов
$r=mysql_query("select id from orders where st='0' and rm='0' and timestampdiff(day,dt,now())>=3");
while (list($id)=mysql_fetch_row($r)) {
$o=get_sql_row('orders',"id=$id");
$s=get_sql_row('hserv',"id=$o[service]");
$u=user_array($o['user']);
$p=calc_price_h($s,$o['num']);
$a="Заказ не активирован 3 дня, удалён автоматически";
if (round($o['money'],2)>0) {
mysql_query("update users set money=money+$o[money] where id=$o[user]");
$a.=" (возвращено $o[money] Р.)";
$m=new money();
$m->create('I.O','I.U',$o['money'],$u['id'],'Удаление неактивированного заказа');
$m->addapp('hosting.order',$o['id'],'c');
}
sys_log('O','hosting.order',$id,$a);
$x=array_merge(mail_tpl_mkpar('ORDER_',$o),mail_tpl_mkpar('SERVICE_',$s),mail_tpl_mkpar('PRICE_',$p),mail_tpl_mkpar('USER_',$u));
$x['ORDER_MONEY']=round($x['ORDER_MONEY'],2);
if ($t=mail_tpl_get('mail_user_order_newrm')) mail_tpl_mail($t,$u['email'],$x);
mysql_query("delete from orders where id=$id");
}
?>

// Удаление неиспользуемых тарифов
mysql_query("delete from hserv where user!=0 and timestampdiff(day,dt,now())>=3 and (select count(*) from orders where service=hserv.id)=0");
mysql_query("update hserv set rm='1' where user!=0 and timestampdiff(day,dt,now())>=3 and (select count(*) from orders where service=hserv.id and rm='0')<1");

// Обработка активных и блокированных заказов
$ss=get_sql_table("hservices.id");
$hs=array();
$hosts=get_sql_table("hosts.id");
$orders=get_sql_table("orders.id","rm='0' and (st='1' or st='-')",'user',"timestampdiff(day,dt_block,now())blocked, timestampdiff(day,dt_pay,now())pay, timestampdiff(month,dt,now())months, timestampdiff(day,dt,now())days");
$u=array('id'=>0);
foreach ($orders as $id=>$o) if ($o['pay']) {
mysql_query("update orders set dt_pay=concat(curdate(),' ',time(dt)) where id='$id'");
$o['id']=$id;
if (!isset($hs[$o['service']])) {
$s=get_sql_row('hserv',"id=$o[service]");
$hs[$o['service']]=$s;
}
else $s=$hs[$o['service']];
if (!$s['daily']) continue;
if ($u['id']!=$o['user']) {
$u=user_array($o['user']);
}
$h=isset($hosts[$o['host']])?$hosts[$o['host']]:array('id'=>0,'name'=>'(не указан)');
$p=calc_price_h($s,$o['num']); $dec=$p['p1']/date('t');
if (round($dec,2)==0) continue;
if ($o['num']<$o['months'] and $o['num']<$s['max']) {
$o['num']=$o['months'];
mysql_query("update orders set num='$o[months]' where id='$id'");
}
$block=($o['num']>12)?12:$o['num'];
if ($block>$o['minus']) $block=$o['minus'];
if ($block<1) $block=1;
switch ($o['st']) {
case '1':
if ($o['free']>0) {
mysql_query("update orders set free=free-1 where id='$id'");
continue;
}
$decr=round($dec*$o['pay'],2);
if ($o['money']>0 and $u['ref']) {
$am=($o['money']-$decr)<0?$o['money']:$decr;
user_refpay($u['id'],$am);
}
$o['money']=round($o['money'],2)-$decr;
mysql_query("update orders set money=money-$decr,spent=spent+$decr where id=$id");
$m=new money();
$m->create('I.O','I.X',$decr,$u['id'],"$o[dt_pay] - ".date('Y-m-d H:i:s'));
$m->addapp('hosting.order',$id,'c');
$o['daysleft']=floor($o['money']/$decr);
if ($o['daysleft']<0) $o['daysleft']=($o['block']-$o['pay']>0)?$o['block']-$o['pay']:0;
$x=array_merge(mail_tpl_mkpar('ORDER_',$o),mail_tpl_mkpar('SERVICE_',$s),mail_tpl_mkpar('PRICE_',$p),mail_tpl_mkpar('USER_',$u));
$x['ORDER_MONEY']=round($x['ORDER_MONEY'],2);
if ($o['money']<$dec) {
if ($o['block']<1) $o['block']=$block;
else $o['block']-=$o['pay'];
mysql_query("update orders set block='$o[block]' where id='$id'");
if ($o['block']<1) {
if ($t=mail_tpl_get('mail_user_order_block')) mail_tpl_mail($t,$u['email'],$x);
if ($t=mail_tpl_get('mail_admin_order_block')) mail_tpl_mail($t,$CFG['SITE_EMAIL'],$x);
mysql_query("update orders set st='-',reason='C',dt_block=now(),block=$block where id=$o[id]");
$r=array('access'=>'a','user'=>$u['id'],'subj'=>$o['id'],'object'=>'hosting.order',
'rem'=>"Автозаявка: необходимо заблокировать заказ '$o[login]' на сервере '$h[name]'.");
$a=new operation(0,$r);
$a->set_cat('suspend'); $a->store();
$m="Заказ автоматически заблокирован.";
sys_log('O','hosting.order',$id,$m);
mysql_query("insert into tasks set dt=now(),op='$a->id',subj='$o[id]',task='block'");
}
else {
if ($t=mail_tpl_get('mail_user_order_aminus')) mail_tpl_mail($t,$u['email'],$x);
}
}
elseif ($o['money']<$decr*3) {
if ($t=mail_tpl_get('mail_user_order_aminus')) mail_tpl_mail($t,$u['email'],$x);
}
else {
if ($o['block']) {
$o['block']=0;
mysql_query("update orders set block='$o[block]' where id='$id'");
}
}
break;
case '-': if ($o['reason']=='C' or $o['reason']=='U' or $o['reason']=='X') {
$o['block']-=$o['pay'];
$x=array_merge(mail_tpl_mkpar('ORDER_',$o),mail_tpl_mkpar('SERVICE_',$s),mail_tpl_mkpar('PRICE_',$p),mail_tpl_mkpar('USER_',$u));
$x['ORDER_MONEY']=round($x['ORDER_MONEY'],2);
if ($o['block']<1) {
if ($t=mail_tpl_get('mail_user_order_nprm')) mail_tpl_mail($t,$u['email'],$x);
if ($t=mail_tpl_get('mail_admin_order_nprm')) mail_tpl_mail($t,$CFG['SITE_EMAIL'],$x);
mysql_query("update orders set st='X',block=0,dt_block=now(),reason='C' where id=$id");
order_remove($o['id'],true);
$r=array('access'=>'a','user'=>$u['id'],'subj'=>$o['id'],'object'=>'hosting.order',
'rem'=>"Автозаявка: необходимо удалить заказ '$o[login]' с сервера '$h[name]'.");
$a=new operation(0,$r);
$a->set_cat('remove'); $a->store();
$m="Заказ автоматически удалён.";
sys_log('O','hosting.order',$id,$m);
mysql_query("insert into tasks set dt=now(),op='$a->id',subj='$o[id]',task='remove'");
}
else {
mysql_query("update orders set block=$o[block] where id=$id");
if ($t=mail_tpl_get('mail_user_order_bminus')) mail_tpl_mail($t,$u['email'],$x);
}
} break;
default:
break;
}
}
}

cron();
 
Последнее редактирование модератором:
  • Автор темы
  • Заблокирован
  • #4
просто знаю что xfes свою деятельность начали в 2008 году, думаю их биллинг как то заточен под Api, может кто знает как к их биллингу привязывать хостинг панели?
P.s только не пишите чтоб спросил у xfes, я пытался спросить они не отвечают нигде....
 
Последнее редактирование:
  • Автор темы
  • Заблокирован
  • #5

Вложения

  • сервер.png
    сервер.png
    124,8 KB · Просмотры: 19
У них скорее всего самопис.
Ту ссылку на whmcs - это модуль к нему для панельку, тобиш это модуль ставить в билинг и настраивается данные доступа.
Я совсем понял остальное что вы имеете ввиду - сформулируйте както иначе вопрос... или подскажите что в итоге вы хотите получить я вам помогу... подскажу.. в какую сторону гуглить и думать
 
  • Автор темы
  • Заблокирован
  • #7
Цукер да вы правы у них биллинг самописанный, я спросил имеется ли у них API на что они мне ответили

Katorukishi (Михеева Юлия Сергеевна) 2014-08-21 21:05:06
Он не интегрируется с Vestacp, и с другими панелями управления. Никто эту интеграцию не делал. API биллинга на этом сайте конфиденциальны, как вы понимаете. Настраивались вручную, для внутреннего использования.

я вот не знаю как быть если нету API, как биллинг настроить вручную к vestaCp?
 
  • Автор темы
  • Заблокирован
  • #8
У большинства панелей есть API через которое по крону все блокируется - Для просмотра ссылки Войди или Зарегистрируйся
а есть пример как подключить биллинг систему без Api к API панели VestaCP?

или может есть вариант как написать для биллинга API?
 
Последнее редактирование:
  • Автор темы
  • Заблокирован
  • #9
:(похоже с такой задачей никто мне не поможет....
 
  • Автор темы
  • Заблокирован
  • #10
цукер подскажите хоть как привязать к крону пользователя чтоб крон биллинга заблокировал пользователя и хостинг панель не открывалась пока он не оплатит?
 
Назад
Сверху