Skip to content

Instantly share code, notes, and snippets.

@eskrano
Last active August 29, 2015 14:14
Show Gist options
  • Save eskrano/c0dbcfa04cc6f3ec51d9 to your computer and use it in GitHub Desktop.
Save eskrano/c0dbcfa04cc6f3ec51d9 to your computer and use it in GitHub Desktop.
pumpit-api
<?php
$pumpit_params = array();
$pumpit_params['APP_ID'] = 4; // id игры, выдает администрация Pumpit
$pumpit_params['API_HOST'] = "http://pumpit.ru/riba_api/?"; // HOST PUMPIT
$pumpit_params['KEY_API'] = ''; // ключ подписи ко всем запросам кроме биллинговых, выдает администрация Pumpit
$pumpit_params['KEY_BILLING'] = ''; // ключ подписи для биллинговых запросов, выдает администрация Pumpit
$pumpit_params['LOG'] = ''; // файл для записи логов
?>
<?php
require_once 'pumpit-config.php';
// Описание класса
class Pumpit
{
var $param;
var $app_id;
var $key_api;
var $key_billing;
// Конструктор
function Pumpit($param)
{
$this->param = $param;
$this->app_id = $this->param['APP_ID'];
$this->key_api = $this->param['KEY_API'];
$this->key_billing = $this->param['KEY_BILLING'];
$this->param['CONTEXT'] = array(
'http' => array(
'method' => 'GET',
'request_fulluri' => true,
'timeout' => 10
)
);
}
// Запрос виджетов
function getWidgets($p_sid='')
{
$result = false;
$res = $this->sendRequest($p_sid, 'GetWidgets', '');
if ( $res )
{
$result = array();
$result['status'] = sprintf("%d", $res->{'status'});
$result['err_info'] = sprintf("%s", $res->{'err_info'});
$result['header'] = sprintf("%s", $res->{'header'});
$result['footer'] = sprintf("%s", $res->{'footer'});
}
return $result;
}
// Запрос профиля пользователя
function getMyProfile($p_sid='')
{
$result = false;
$res = $this->sendRequest($p_sid, 'GetMyProfile', '');
if ( $res )
{
$result = array();
$result['status'] = sprintf("%d", $res->{'status'});
$result['err_info'] = sprintf("%s", $res->{'err_info'});
$result['reg_time'] = sprintf("%s", $res->{'reg_time'});
$result['login'] = sprintf("%d", $res->{'login'});
$result['nick'] = sprintf("%s", $res->{'nick'});
$result['sex'] = sprintf("%d", $res->{'sex'});
$result['coin'] = sprintf("%s", $res->{'coin'});
if ( isset($res->{'avatar'}) )
{
$result['avatar'] = sprintf("%s", $res->{'avatar'});
}
}
return $result;
}
// Запрос на перевод денег со счета абонента в приложение
function doIncAppAccount($p_sid='', $coin='', $params=array(), $burl='')
{
$query = array();
$query['app_id'] = $this->app_id;
$query['action'] = 'DoIncAppAccount';
$query['p_sid'] = $p_sid;
$query['coin'] = $coin;
$query['burl'] = $burl;
// Если есть необязательные параметры такие как desc, app_tid, app_uid
if ( !empty($params) )
{
foreach ( $params as $key => $value )
{
$query[$key] = $value;
}
}
// Формируем подпись запроса
$sig = $this->getSig($query, true);
$url = $this->param['API_HOST'];
// Собираем URL с сортировкой по ключам
ksort($query);
foreach ( $query as $key => $value )
{
// Исключаем параметр sig
if ( strtolower($key) != 'sig' )
{
$url .= urlencode($key) . "=" . urlencode($value) . "&";
}
}
$url .= "sig=" . $sig;
return $url;
}
// Запрос на авторизацию пользователя
function doPumpitLogin($p_sid='', $burl='')
{
$query = array();
$query['app_id'] = $this->app_id;
$query['action'] = 'DoPumpitLogin';
$query['p_sid'] = $p_sid;
$query['burl'] = $burl;
// Формируем подпись запроса
$sig = $this->getSig($query);
$url = $this->param['API_HOST'];
// Собираем URL с сортировкой по ключам
ksort($query);
foreach ( $query as $key => $value )
{
// Исключаем параметр sig
if ( strtolower($key) != 'sig' )
{
$url .= urlencode($key) . "=" . urlencode($value) . "&";
}
}
$url .= "sig=" . $sig;
return $url;
}
// Запрос на доступ к кошельку Pumpit
function doPumpitPayment($p_sid='', $burl='')
{
$query = array();
$query['app_id'] = $this->app_id;
$query['action'] = 'DoPumpitPayment';
$query['p_sid'] = $p_sid;
$query['burl'] = $burl;
// Формируем подпись запроса
$sig = $this->getSig($query);
$url = $this->param['API_HOST'];
// Собираем URL с сортировкой по ключам
ksort($query);
foreach ( $query as $key => $value )
{
// Исключаем параметр sig
if ( strtolower($key) != 'sig' )
{
$url .= urlencode($key) . "=" . urlencode($value) . "&";
}
}
$url .= "sig=" . $sig;
return $url;
}
// Запрос на возврат абонента в Pumpit
function doPumpitBack($p_sid='')
{
$query = array();
$query['app_id'] = $this->app_id;
$query['action'] = 'DoPumpitBack';
$query['p_sid'] = $p_sid;
// Формируем подпись запроса
$sig = $this->getSig($query);
$url = $this->param['API_HOST'];
// Собираем URL с сортировкой по ключам
ksort($query);
foreach ( $query as $key => $value )
{
// Исключаем параметр sig
if ( strtolower($key) != 'sig' )
{
$url .= urlencode($key) . "=" . urlencode($value) . "&";
}
}
$url .= "sig=" . $sig;
return $url;
}
// Функция формирования подписи
function getSig($query, $billing=false)
{
$str = "";
// Собираем строку для подписи с сортировкой по ключам
ksort($query);
foreach ( $query as $key => $value )
{
// Исключаем параметр sig
if ( strtolower($key) != 'sig' )
{
$str .= $key . "=" . $value;
}
}
$appkey = ($billing) ? $this->key_billing : $this->key_api;
return md5($str.$appkey);
}
// Отправить запрос
function sendRequest($p_sid, $action, $param, $billing=false)
{
$query = array();
$query['app_id'] = $this->app_id;
$query['action'] = $action;
$query['p_sid'] = $p_sid;
// Формируем подпись запроса
$sig = $this->getSig($query, $billing);
$url = $this->param['API_HOST'];
// Собираем URL с сортировкой по ключам
ksort($query);
foreach ( $query as $key => $value )
{
// Исключаем параметр sig
if ( strtolower($key) != 'sig' )
{
$url .= urlencode($key) . "=" . urlencode($value) . "&";
}
}
$url .= "sig=" . $sig;
$connection = stream_context_create($this->param['CONTEXT']);
$data = file_get_contents($url, false, $connection);
if ( $data )
{
$json = json_decode($data);
if ( $json )
{
return $json;
}
else
{
$this->logError("Unexpected response for request"."\n".$data);
}
}
else
{
$this->logError("Unable to send request"."\n"."P_SID=".$p_sid." ACTION=".$action." PARAM=".$param." BILLING=".$billing);
}
return false;
}
// Функция проверки валидности запросов от pumpit
function checkRequest($query_string, $billing=false)
{
$result = false;
parse_str($query_string, $query);
if ( $query['sig'] == $this->getSig($query, $billing) )
{
$result = true;
}
return $result;
}
// Логирование ошибок
function logError($txt)
{
if (isset($this->param['LOG']) && $this->param['LOG'] && ($handle = fopen($this->param['LOG'], 'a')))
{
$tmp = "[".date('Y-m-d H:i:s')."]\n";
$tmp .= "Error. ".$txt."\n";
fwrite($handle, $tmp);
fclose($handle);
}
}
}
$pumpit = new Pumpit($pumpit_params);
?>
<?php
session_start();
// Если сессия пустая или сброс сессии,то пользователь не авторизован
if ( !isset($_SESSION['p_sid']) || !empty($_GET['logout']) )
{
$_SESSION['pumpit_id'] = 0;
$_SESSION['p_sid'] = '';
$_SESSION['p_user_info'] = array();
}
// Сохраняем в сессии заголовки проксирования
if ( !isset($_SESSION['x_host']) && isset($_SERVER['HTTP_X_HOST']) )
{
$_SESSION['x_host'] = $_SERVER['HTTP_X_HOST'];
}
if ( !isset($_SESSION['x_partner']) && isset($_SERVER['HTTP_X_PARTNER']) )
{
$_SESSION['x_partner'] = $_SERVER['HTTP_X_PARTNER'];
}
include_once 'pumpit-class.php';
// Обработка запросов GetAppOnline, DoLogin и PaymentOk приходящих от Pumpit
// Если пришел запрос GetAppOnline, то нужно вернуть число пользователей онлайн
if ( !empty($_GET['action']) && ($_GET['action'] == 'GetAppOnline') && $pumpit->checkRequest($_SERVER['QUERY_STRING']) )
{
// Здесь реализовывается логика определения пользователей online и передается ответ Pumpit
$online_number = 307;
$xml_response = '<?xml version="1.0" encoding="utf-8"?>
<response>
<online>'.$online_number.'</online>
</response>
';
echo $xml_response;
exit();
}
// Если пришел запрос DoLogin то записываем в сессию
if ( !empty($_GET['action']) && ($_GET['action'] == 'DoLogin') && $pumpit->checkRequest($_SERVER['QUERY_STRING']) )
{
$_SESSION['pumpit_id'] = $_GET['login'];
$_SESSION['p_sid'] = $_GET['p_sid'];
$res = $pumpit->getMyProfile($_GET['p_sid']);
if ( $res )
{
$_SESSION['p_user_info'] = $res;
}
if ( !empty($_GET['url']) )
{
// Здесь нужно перекинуть пользователя по запрашиваемому url
}
}
// Если пришел запрос PaymentOk то надо нотифицировать Pumpit о том что запрос принят и деньги переведены в игру
if ( !empty($_GET['action']) && ($_GET['action'] == 'PaymentOk') && $pumpit->checkRequest($_SERVER['QUERY_STRING'], true) )
{
$query_string = $_SERVER['QUERY_STRING'];
parse_str($query_string, $query);
/* Теперь массив query содержит следующие данные
action - приходит всегда
amount - приходит всегда
app_id - приходит всегда
coin - приходит всегда
login - приходит всегда
trans_id - приходит всегда
sig - приходит всегда
app_tid - приходит если был передан при запросе DoIncAppAccount как элемент массива третим параметром
app_uid - приходит если был передан при запросе DoIncAppAccount как элемент массива третим параметром
Здесь надо реализовать логику зачисления и отправить Pumpit ответ
если зачисление успешно то $ans = '<status>OK</status>';
если зачисление не успешно то $ans = '<status>CANCEL</status>';
*/
$ans = '<status>CANCEL</status>';
echo $ans;
exit();
}
// Методы типа «Do...» вызываются путем перенаправления
// Если пользователь не авторизован, то авторизуем
if ( !empty($_GET['action']) && ($_GET['action'] == 'auth') )
{
$url = $pumpit->doPumpitLogin($_SESSION['p_sid']);
header("Location: $url");
exit();
}
// Если пользователь хочет купить что-либо в игре
if ( !empty($_GET['action']) && ($_GET['action'] == 'pay') )
{
$url = $pumpit->doIncAppAccount($_SESSION['p_sid'], $_GET['coin']);
header("Location: $url");
exit();
}
// Если пользователь хочет перейти в кошелек Pumpit
if ( !empty($_GET['action']) && ($_GET['action'] == 'wallet') )
{
$url = $pumpit->doPumpitPayment($_SESSION['p_sid']);
header("Location: $url");
exit();
}
// Если пользователь хочет вернуться в Pumpit
if ( !empty($_GET['action']) && ($_GET['action'] == 'back') )
{
$url = $pumpit->doPumpitBack($_SESSION['p_sid']);
header("Location: $url");
exit();
}
?>
<html>
<head>
<meta content="text/html; charset=utf-8" />
</head>
<body>
<div>
<h3>API клиента Pumpit</h3>
<a href="http://1685544596.pumpit.ru/">Тестовая зона</a>
</div>
<br/>
<div>
<fieldset>
<legend><b>Данные для приложения</b></legend>
APP_ID = <?php echo $pumpit->app_id; ?><br/>
KEY_API = <?php echo $pumpit->key_api; ?><br/>
KEY_BILLING = <?php echo $pumpit->key_billing; ?><br/>
</fieldset>
</div>
<br/>
<div>
<fieldset>
<legend><b>Проксирование</b></legend>
HTTP_X_HOST <?php if ( isset($_SESSION['x_host'])) echo $_SESSION['x_host']; ?> <br/>
HTTP_X_PARTNER <?php if ( isset($_SESSION['x_partner'])) echo $_SESSION['x_partner']; ?> <br/>
</fieldset>
</div>
<br/>
<div>
<fieldset>
<legend><b>Виджеты</b></legend>
<?php
$widgets = $pumpit->getWidgets($_SESSION['p_sid']);
echo "Хедер" . "<br/>";
echo $widgets['header'];
echo "Футер" . "<br/>";
echo $widgets['footer'];
?>
</fieldset>
</div>
<br/>
<div>
<fieldset>
<legend><b>Сессия</b></legend>
<?php
echo "Pumpit ID - " . $_SESSION['pumpit_id'] . "<br/>";
echo "Pumpit SID - " . $_SESSION['p_sid'] . "<br/><br/>";
echo '<a href="?logout=1">Сбросить сессию</a>';
?>
</fieldset>
</div>
<br/>
<div>
<fieldset>
<legend><b>Информация по профилю абонента</b></legend>
<?php
if ( $_SESSION['p_sid'] )
{
$status = $_SESSION['p_user_info']['status'];
if ( empty($status) )
{
$sex = $_SESSION['p_user_info']['sex'];
if ( $sex == 1 )
{
$sex = 'мужской';
}
elseif ( $sex == 2 )
{
$sex = 'женский';
}
else
{
$sex = 'не указан';
}
echo "Логин: " . $_SESSION['p_user_info']['login'] . "<br/>";
echo "Ник: " . $_SESSION['p_user_info']['nick'] . "<br/>";
echo "Время регистрации: " . $_SESSION['p_user_info']['reg_time'] . "<br/>";
echo "Число монет: " . $_SESSION['p_user_info']['coin'] . "<br/>";
echo "Пол: " . $sex . "<br/>";
if ( isset($_SESSION['p_user_info']['avatar']) )
{
echo "<img src=\"".$_SESSION['p_user_info']['avatar']."\" alt=\"аватар\" />" . "<br/>";
}
}
elseif ( $status == 21 )
{
echo "Пользователь не найден";
}
}
else
{
echo "<p>Пользователь не авторизован</p>";
echo '<form action="">';
echo '<input type="hidden" value="auth" name="action" />';
echo '<input name="button" value="Авторизоваться" type="submit" onclick=""/>';
echo '</form>';
}
?>
</fieldset>
</div>
<br/>
<?php
if ( $_SESSION['p_sid'] )
{
?>
<div>
<fieldset>
<legend><b>Кнопки</b></legend>
<form action="">
<input type="hidden" value="wallet" name="action" />
<input name="button" value="Кошелек" type="submit" onclick=""/>
</form>
<form action="">
<input type="hidden" value="back" name="action" />
<input name="button" value="Вернуться" type="submit" onclick=""/>
</form>
</fieldset>
<br/>
<form action="">
<fieldset>
<legend><b>Покупка чего-либо</b></legend>
<input type="hidden" value="1" name="coin" />
<input type="hidden" value="pay" name="action" />
<span>Купить за <span><input name="button" value="1 монета" type="submit" onclick=""/>
</fieldset>
</form>
</div>
<?php
}
?>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment