Last active
August 29, 2015 14:14
-
-
Save eskrano/c0dbcfa04cc6f3ec51d9 to your computer and use it in GitHub Desktop.
pumpit-api
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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'] = ''; // файл для записи логов | |
?> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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); | |
?> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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