Кодим Iframe приложение для Вконтакте

Dik

Хозяин
Команда форума
Администратор
Репутация
500 / 882
Так как чаще всего при разработке игр (основная масса приложений в контакте – это игры) для хранения персонализированной временной информации на сервере используется механизм сессий ($_SESSION). Мы сталкнемся с одной проблемой, специфичной для IE и IFrame приложений – это нежелание активироваться сессии во фрейме, то есть глобальный массив $_SESSION не будет создаваться, когда страница будет подгружаться через фрейм. Для того что бы сессия активировалась необходимо передать спецефический header (все рабочие файлы должны начинаться со следующих строк):
Код:
<?php
header('P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"'); 
session_start();
Следующим важным шагом является авторизация пользователя Вконтакте в нашем IFrame приложении. Как я уже писал, при первой загрузки приложения пользователем, контакт передает ряд данных приложению через get-запрос.
http://gvozd.org/index.php?api_url=http://...settings=1&
viewer_id=19998&viewer_type=0&user_id=0&group_id=0&is_app_user=1&
auth_key=ec6d4bb6d6838e80e39273b78aede757&language=0&parent_language=0&lc_name=deab711a
Ключевыми для нас являются viewer_id и auth_key (они соответствуют друг другу как логин и пароль, то есть для каждого пользователя(viewer_id) существует свой уникальный auth_key).

auth_key является хэшем строки в которую входит ID приложения, ID пользователя контакта и секретный ключ со страницы «ПЛАТЕЖИ», более точно: auth_key = md5(api_id + '_' + viewer_id + '_' + api_secret).
Это значит, что перед тем как начать работать с пользователем, нам необходимо провести проверку: соответствует ли auth_key хэшу строки.

Разберем следующий код:
Код:
$api_secret = "u9cRCJveDmP2r5SqcHqa";
$api_id     = "1930735";
if (!$_SESSION['id'])
{
        $auth_key   = $_GET['auth_key'];
        $viewer_id  = $_GET['viewer_id'];
        if(!md5($api_id."_".$viewer_id."_".$api_secret)==$auth_key) exit('key incorrect');
        $_SESSION['id'] = $viewer_id;
        header ('Location: index.php');
        exit();
}
Пример 1. Пользователь первый раз открывает наше приложение:
Так как переменной сессии $_SESSION['id'] не существует, то будет выполняться условие. В первых строках мы получаем переменные: $auth_key и $viewer_id, из тех данных, которые нам передал Вконтакте. Следующее условие является самым важным участком проверки пользователя – мы сверяем auth_key с хэшем строки, если проверка не пройдена (это значит, что кто-то подделал переменные), то прекращаем выполнение скрипта. Если же проверка пройдена, то переменной сессии $_SESSION['id'] присваиваем ID пользователя Вконтакте (авторизация пройдена – можно добавить дополнительную проверку, выбрать информацию по этому пользователю из базы, если его не существует, занести пользователя в базу данных). Затем перегружаем страницу.

Пример 2. Перезагрузка страницы:
Так как переменная сессии уже существует, то блок с авторизацией будет пропущен и пойдет дальнейшее выполнение скрипта, где и будет основной скрипт игры.

Первыми строками нашей первой странички, которая подгружается через IFrame, будут:
Код:
<?
header('P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"'); 
session_start();

$api_secret = "u9cRCJveDmP2r5SqcHqa";
$api_id     = "1930735";

if (!$_SESSION['id'])
{
        $auth_key   = $_GET['auth_key'];
        $viewer_id  = $_GET['viewer_id'];
        if(!md5($api_id."_".$viewer_id."_".$api_secret)==$auth_key) exit('key incorrect');
        $_SESSION['id'] = $viewer_id;
        header ('Location: index.php');
        exit();
} 

//основной скрипт
?>

Источник: devtown.ru
 
Вобщем я создал его, подключил jquery-1.4.2.min.js, создал ещё два файла, в одном (vk.php):
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'><?php
// данные доступа к базе данных
$db_host="localhost"; // обычно не нужно изменять
$db_user="user"; // имя пользователя БД
$db_password="pass"; // пароль БД
$db_name = "bdname"; // имя БД
$table_name = "stat"; // имя таблицы статистики. Если вы не меняли его в запросе, создающем БД, то и здесь менять его не надо

// данные приложения
$app_id = '1923519'; // id приложения
$api_secret = 'key'; // защищенный ключ приложения


$auth_key = $_POST['auth_key'];
$viewer_id = $_POST['viewer_id'];

$real_key = md5($app_id."_".$viewer_id."_".$api_secret);
if ($auth_key == $real_key){
// соединение с БД
mysql_connect($db_host, $db_user, $db_password) or die (mysql_error());
mysql_select_db($db_name) or die (mysql_error());
mysql_query("SET NAMES 'utf8'");

// Выполняем запрос: если пользователя с таким id ещё нет в БД, то добавляем, если есть, то обновляем запись, прибавляя одно посещение (`visits` = (`visits`+1))
$query = 'INSERT INTO `'.$table_name.'` (`uid`, `last_date`) VALUES ("'.$viewer_id.'","'.time().'") ON DUPLICATE KEY UPDATE `visits` = (`visits`+1), `last_date`="'.time().'";';
$sql = @mysql_query($query);
echo "OK";

}
?></div>
Во втором (vk.html):
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=cp1251" />
<title>Untitled Document</title>

<script src="js/jquery-1.4.2.min.js" type="text/javascript"></script>

<script src="http://vkontakte.ru/js/api/xd_connection.js?2" type="text/javascript"></script>

<script type="text/javascript" charset="cp1251" >
$(document).ready(function(){ // когда страница загрузится
VK.init(function() {
// получаем flashVars
var parts=document.location.search.substr(1).split("&");
var flashVars={}, curr;
for (i=0; i<parts.length; i++) {
curr = parts.split('=');
flashVars[curr[0]] = curr[1];
}

// вытаскиваем viewer_id и auth_key из полученных переменных
var viewer_id = flashVars['viewer_id'];
var auth_key = flashVars['auth_key'];


// отправляем post запрос, передаём viewer_id и auth_key
$.post(' ,
{ "character": viewer_id, "passwrd": auth_key },
function(data){
$('#result').html(data);
});
});

});

</script>
</head>
<body>
<div id="result">http://xgbase.ru/</div>
</body>
</html></div>
Вот.... и нужно сделать, чтобы он один раз зарегался, а потом проверял если есть человек в БД, то авторизовал, если нету, то сначала регал а потом авторизовал... в теме вроде описано это всё, но вот куда какой код вписать я так и не понял... =(
 
Рассказали бы лучше,как например сделать покупку каких либо прав)
Или рассылку уведомлений.
 
Некропостеры









 
О, темка дика всплыла... Ох,чуть слезу робот не пустил *sad* стока лет уже прошло..
 
Сверху