init(); die((($result))); */ class Model_PartnerProjects_GamedealerReq{ private $allowIp = array( '127.0.0.1' ); private $gamedealerkey = '12345677'; var $projectid = 1; function init(){ $ip = $_SERVER['REMOTE_ADDR']; if(!in_array($ip,$this->allowIp))return $this->xml(array('status'=>-10,'desc'=>'ErrIP')); //рабочий режим //$xml = file_get_contents('php://input'); //тестовый режим. Параметры: check_balance / pay / getpacages / check_login $xml = $this->testxml('check_balance'); $result = $this->parse($xml); if(!is_object($result))return $this->xml(array('status'=>-50,'desc'=>'ErrorInitParse')); if(isset($result->method)){ $methodname = 'gamedealer_'.(string)$result->method; if(!method_exists($this, $methodname))return $this->xml(array('status'=>-20,'desc'=>'ErrMethod')); try{ $resulttry = $this->$methodname($result); return $this->xml($resulttry); }catch(Exception $e){} } return $this->xml(array('status'=>-10,'desc'=>'MethodError '.$methodname.isset($e)?$e->getMessage():false)); } private function _sign($method,$params=array()){ return md5(implode($params).$method.md5($this->gamedealerkey)); } /*Генератор XML-ответа*/ function xml($arr=false){ header("Content-type: text/xml; charset=utf-8"); if(!$arr)$arr = array('status'=>-1,'desc'=>"ErrorXML"); $xml = ''."\n"; foreach($arr as $k => $v){ $xml .= '<'.$k.'>'.""; if(is_array($v)){ foreach($v as $itemkey => $itemvalue){ if(is_array($itemvalue)){ $xml .= ' $itemvalue_v)$xml .= ' '.$itemvalue_k.'="'.$itemvalue_v.'" '; $xml .= '>'."\n"; }else{ $xml .= '<'.$itemkey.'>'.$itemvalue.''."\n"; } } }else { $xml .= $v; } $xml .= ''."\n"; } $xml .= ''; return $xml; } //проверка счета-акканта function gamedealer_check_login($params){ $bank = isset($params->nick)?(int)$params->nick:false; $projectid = isset($params->projectid)?(int)$params->projectid:false; $sign = isset($params->sign)?(string)$params->sign:false; $hash = $this->_sign('check_login',array($bank)); if($sign!=$hash)return array('status'=>-10,'desc'=>'SignError'); $check = $this->checkLoginByBank($bank); if(isset($check['login'])){ return array('status'=>1,'desc'=>'Счет указан верно','addinfo'=>$check['login']); } return array('status'=>-100,'desc'=>'Ошибка проверки счета'); } //запрос на оплату function gamedealer_pay($params){ $bank = isset($params->nick)?(int)$params->nick:false; $projectid = isset($params->projectid)?(int)$params->projectid:false; $sign = isset($params->sign)?(string)$params->sign:false; $paymentid = isset($params->payid)?(int)$params->payid:false; // уникальный номер платежа $amount = isset($params->amount)?number_format((float)$params->amount,'2','.',''):false; //сумма в игровой валюте $pacageid = isset($params->pacageid)?(int)$params->pacageid:''; //идентификатор покупки опции в ГД. если нету - платеж на счет юзера $partneritemid = isset($params->partneritemid)?(int)$params->partneritemid:''; //идентификатор продукта в вашей системе $additemid = isset($params->additemid)?(int)$params->additemid:''; //дополнительный идентификатор пакета $paymethodid = isset($params->paymethodid)?(string)$params->paymethodid:false; //метод оплаты по системе геймдилер // может быть пустым) $hash = $this->_sign('pay',array($bank,$projectid.$pacageid.$amount,$paymentid)); if($sign!=$hash)return array('status'=>-10,'desc'=>'SignError'); if($amount<0.01)return array('status'=>-20,'desc'=>'сумма слишком маленькая'); $check = $this->checkLoginByBank($bank); if(!isset($check['login']))return array('status'=>-10,'desc'=>'Ошибка логина. счет неверный'); //логин перса добываем return $this->oldbk_dopayment($paymentid,$bank,$projectid,$pacageid,$partneritemid,$amount,$check['login'],$additemid); } function gamedealer_check_balance($params){ $projectid = isset($params->projectid)?(int)$params->projectid:false; $sign = isset($params->sign)?(string)$params->sign:false; $method = 'check_balance'; if($sign != $this->_sign($method,array('projectid'=>$projectid)))return array('status'=>-10,'desc'=>"errSign"); $balance = 500; return array('status'=>1,'desc'=>"Balance: ".$balance,'balance'=>$balance); //баланс в игре } function gamedealer_getpacages($params){ $sign = isset($params->sign)?(string)$params->sign:false; $projectid = isset($params->projectid)?(int)$params->projectid:false; $method = 'getpacages'; if($sign != $this->_sign($method,array('projectid'=>$projectid)))return array('status'=>-10,'desc'=>"errSign"); return array( 'status'=>1, 'desc'=>'Список снизу :)', 'pacages'=>array( array( 'title'=>'Название сильвера', 'price'=>20, 'partneritemid'=>1 //ид в системе игры ), array( 'title'=>'Название сильвера 2', 'price'=>20, 'partneritemid'=>1 //ид в системе игры ), ) ); } function parse($xml){ try{ return simplexml_load_string($xml); }catch(Exception $e){ return false; } } //тестовый интерфейс function testxml($method='check_login'){ switch($method){ case 'check_login': $nick = 243; return ' check_login '.$nick.' 1 '.md5($nick.$method.md5($this->gamedealerkey)).' '; break; case 'pay': $amount= 0.01; $nick = 243; $projectid = 1; $payid = 112222; //$bank,$projectid.$pacageid.$amount,$paymentid #echo "$nick.$projectid.$amount.$payid.$method"; $sign = md5($nick.$projectid.$amount.$payid.$method.md5($this->gamedealerkey)); return ' pay '.$nick.' '.$projectid.' '.$amount.' '.$payid.' '.$sign.' '; break; case 'getpacages': //список пакетов return ' 1 '.$method.' '.md5('1'.$method.md5($this->gamedealerkey)).' '; break; case 'check_balance': //баланс return ' 1 '.$method.' '.md5('1'.$method.md5($this->gamedealerkey)).' '; break; } } //прием оплаты private function oldbk_dopayment($paymentid,$bank,$projectid,$pacageid,$partneritemid,$amount,$login,$additemid){ //$additemid - дополнительный дентификатор пакета. например - ID клана //если оплата на клан - projectid = 20099 // pacageid = 25 //partneritemid = 1 (в вашей системе)// additemid = 5 //идентификатор клана //если пакеты if($pacageid){ //если покупка билетов - то количество = amount/price ну и там округлять, остаток на счет. return array('status'=>1,'desc'=>'Сильвер аккаунт успешно оплачен','paymentid'=>1); //уникальный номер платежа в системе проекта. }else{ //просто оплата на баланс по счету return array('status'=>1,'desc'=>'Счет попонен','paymentid'=>1); //уникальный номер платежа в системе проекта. //или return array('status'=>3,'desc'=>'Аккаунт уже оплачен с таким payid','paymentid'=>1);//уникальный номер платежа в системе проекта. } return array('status'=>-10,'desc'=>'Ошибка поиска карты/сильвера и т.п. или сумма не та'); } //проверка счета function checkLoginByBank($bank){ return array('status'=>1,'desc'=>'Bank exissts','login'=>'Администратор'); } } ?>