294 lines
12 KiB
PHP
294 lines
12 KiB
PHP
<?
|
||
die('Что-то тут не так...');
|
||
/*
|
||
* Класс обработчика запроса от GameDealer.ru
|
||
* by victor niko
|
||
* niko@gamedealer.ru
|
||
* skype: victornikoua
|
||
* 14.09.2012
|
||
*
|
||
* $old = new Model_PartnerProjects_GamedealerReq;
|
||
$result = $old->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 = '<gdanswer>'."\n";
|
||
foreach($arr as $k => $v){
|
||
$xml .= '<'.$k.'>'."";
|
||
if(is_array($v)){
|
||
|
||
|
||
foreach($v as $itemkey => $itemvalue){
|
||
if(is_array($itemvalue)){
|
||
$xml .= ' <item ';
|
||
foreach($itemvalue as $itemvalue_k => $itemvalue_v)$xml .= ' '.$itemvalue_k.'="'.$itemvalue_v.'" ';
|
||
$xml .= '></item>'."\n";
|
||
}else{
|
||
$xml .= '<'.$itemkey.'>'.$itemvalue.'</'.$itemkey.'>'."\n";
|
||
}
|
||
}
|
||
}else {
|
||
$xml .= $v;
|
||
}
|
||
$xml .= '</'.$k.'>'."\n";
|
||
|
||
}
|
||
$xml .= '</gdanswer>';
|
||
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 '<?xml version="1.0" encoding="utf-8"?>
|
||
<gamedealer>
|
||
<method>check_login</method>
|
||
<nick>'.$nick.'</nick>
|
||
<projectid>1</projectid>
|
||
<sign>'.md5($nick.$method.md5($this->gamedealerkey)).'</sign>
|
||
</gamedealer>';
|
||
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 '<?xml version="1.0" encoding="utf-8"?>
|
||
<gamedealer>
|
||
<method>pay</method>
|
||
<nick>'.$nick.'</nick>
|
||
<projectid>'.$projectid.'</projectid>
|
||
<amount>'.$amount.'</amount>
|
||
<payid>'.$payid.'</payid>
|
||
<sign>'.$sign.'</sign>
|
||
</gamedealer>';
|
||
|
||
break;
|
||
|
||
case 'getpacages':
|
||
//список пакетов
|
||
|
||
return '<?xml version="1.0" encoding="utf-8"?>
|
||
<gamedealer>
|
||
<projectid>1</projectid>
|
||
<method>'.$method.'</method>
|
||
<sign>'.md5('1'.$method.md5($this->gamedealerkey)).'</sign>
|
||
</gamedealer>';
|
||
break;
|
||
|
||
case 'check_balance':
|
||
//баланс
|
||
|
||
return '<?xml version="1.0" encoding="utf-8"?>
|
||
<gamedealer>
|
||
<projectid>1</projectid>
|
||
<method>'.$method.'</method>
|
||
<sign>'.md5('1'.$method.md5($this->gamedealerkey)).'</sign>
|
||
</gamedealer>';
|
||
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'=>'Администратор');
|
||
}
|
||
|
||
|
||
|
||
}
|
||
?>
|