Вот выкладываю, может кому пригодится.
1. Создадим базу для хранения id пользователей, ip адресов и даты добавления
Код: Выделить всё
CREATE TABLE IF NOT EXISTS `app_vip` ( `id` int(9) AUTO_INCREMENT, `uid` int(9) DEFAULT NULL, `ip` INT UNSIGNED, `add_date` datetime, PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;INSERT INTO `app_vip` (`uid`, `ip`,`add_date`) VALUES (1306422,INET_ATON("127.0.0.1"),NOW());
Код: Выделить всё
<?php// данные доступа к базе данных$db_host="localhost"; // обычно не нужно изменять$db_user="flapps"; // имя пользователя БД$db_password="flapps"; // пароль БД$db_name = "flapps"; // имя БД$table_name = "app_vip"; // имя таблицы статистики. Если вы не меняли его в запросе, создающем БД, то и здесь менять его не надо $api_id = 743131; // id приложения$secret_key = 'aafflAppSU123VH45pPF'; // защищенный ключ // соединение с БД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'"); /* http://flapps.ru */?>
3. Файл главной страницы приложения index.html
Код: Выделить всё
<html><head><link rel="stylesheet" href="css/style.css" type="text/css" /> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script><script src="js/code.js" type="text/javascript"></script><script src="http://vkontakte.ru/js/api/xd_connection.js?2" type="text/javascript"></script></head><body><div id="loader" style="display:none;"><img src="http://vk.com/images/upload.gif" alt="" width="32" height="8" border="0" /></div> <div id="users"></div><a href="#" id="add_btn" title="">Добавить</a><div class="error" style="display:none;"></div><div class="success" style="display:none;"></div><br /><br /><a href="http://flapps.ru">flapps.ru</a></body></html>
Код: Выделить всё
body { padding:10px; border:1px solid #DAE1E8; font-family: tahoma, arial, verdana, sans-serif, Lucida Sans; font-size: 11px; background:#fff;}a:hover { text-decoration:underline;} .success { background-color: #EFFFE8; border: 1px solid #9BE888; font-size: 11px; margin: 8px; padding: 8px 11px;}.error { background-color: #FFEFE8; border: 1px solid #E89B88; font-size: 11px; margin: 8px; padding: 8px 11px;}#add_btn { display:block; clear:both;}.user_block { border:1px solid #DAE1E8; background:#F7F7F7; text-align:center; padding:5px; margin:7px; width:68px; height:79px; float:left;}.user_block a{ font-family: tahoma, arial, verdana, sans-serif, Lucida Sans; font-size: 11px; color:#2B587A; text-decoration:none;} /* CSS for Ajax Loader */#loader { width: 100%; height: 100%; position: fixed; text-align: center; z-index: 1000; background-color: #fff; opacity: 0.80;} #loader img{ position: absolute; left: 50%; top: 50%; margin: -40px 0 0 -40px;} /* http://flapps.ru */
Код: Выделить всё
<?phpheader('Content-Type: application/json; charset=utf-8');include('settings.php');require 'vkapi.class.php'; $viewer_id = $_REQUEST['viewer_id'];$auth_key = $_REQUEST['auth_key']; $real_key = md5($api_id."_".$viewer_id."_".$secret_key);if ($auth_key == $real_key){ $error=false; $t=''; // если добавляемый пользователь уже первый в списке, то не добавляем // выбираем последнего пользователя $query = 'SELECT `uid` FROM `'.$table_name.'` ORDER BY `id` DESC LIMIT 1;'; $sql = mysql_query($query); $sql_data = mysql_fetch_array($sql); if ($sql_data['uid']==$viewer_id) { $t.= 'Вы уже на первом месте в списке!'; $error=true; } // если нет ошибки - записываем if (!$error) { // списываем голоса и добавляем ссылку $VK = new vkapi($api_id, $secret_key); $ip = getenv("REMOTE_ADDR"); $query = 'INSERT INTO `'.$table_name.'` (`uid`, `ip`,`add_date`) VALUES ("'.mysql_real_escape_string($viewer_id).'",INET_ATON("'.$ip.'"),NOW());'; $sql = mysql_query($query); echo '{"success":{"msg":"Вы добавлены!"}}'; } else { // ошибка echo '{"error":{"msg":"'.$t.'"}}'; }} // конец проверки auth_keyelse { echo '{"error":{"msg":"Ошибка безопасности!"}}';} /* http://flapps.ru */?>
Код: Выделить всё
<?phpheader('Content-Type: application/json; charset=utf-8');include('settings.php'); $viewer_id = $_REQUEST['viewer_id'];$auth_key = $_REQUEST['auth_key']; $real_key = md5($api_id."_".$viewer_id."_".$secret_key);if ($auth_key == $real_key){ $query = 'SELECT `uid` FROM `'.$table_name.'` ORDER BY `id` DESC LIMIT 7;'; $sql = @mysql_query($query); $num_rows = mysql_num_rows($sql); $json_str = '{"response":"'; while ($sql_data = @mysql_fetch_array($sql)) { $json_str .= $sql_data['uid'].','; } //удаляем последнюю запятую $json_str = substr($json_str, 0, -1); $json_str .= '"}'; echo $json_str;} // конец проверки auth_keyelse { echo '{"error":{"msg":"Ошибка безопасности!"}}';} /* http://flapps.ru */ ?>
Код: Выделить всё
<?php /** * VKAPI class for vk.com social network * * @package server API methods * @link http://vk.com/developers.php * @autor Oleg Illarionov * @version 1.0 */ class vkapi { var $api_secret; var $app_id; var $api_url; function vkapi($app_id, $api_secret, $api_url = 'api.vk.com/api.php') { $this->app_id = $app_id; $this->api_secret = $api_secret; if (!strstr($api_url, 'http://')) $api_url = 'http://'.$api_url; $this->api_url = $api_url; } function api($method,$params=false) { if (!$params) $params = array(); $params['api_id'] = $this->app_id; $params['v'] = '3.0'; $params['method'] = $method; $params['timestamp'] = time(); $params['format'] = 'json'; $params['random'] = rand(0,10000); ksort($params); $sig = ''; foreach($params as $k=>$v) { $sig .= $k.'='.$v; } $sig .= $this->api_secret; $params['sig'] = md5($sig); $query = $this->api_url.'?'.$this->params($params); $res = file_get_contents($query); return json_decode($res, true); } function params($params) { $pice = array(); foreach($params as $k=>$v) { $pice[] = $k.'='.urlencode($v); } return implode('&',$pice); }}?>
8. Файл с кодом JavaScript - code.js
Код: Выделить всё
$(document).ready(function(){var viewer_id;var auth_key; VK.init(function() { VK.loadParams(document.location.href); viewer_id = VK.params.viewer_id; auth_key = VK.params.auth_key; updateUsers(); }); // обновление последних пользователейfunction updateUsers() { $('#loader').show(); $.post('http://вашсайт/getuids.php', { "viewer_id": viewer_id, "auth_key": auth_key }, function(data){ if (data.response) { // из полученного списка uid получаем профили var uidsVip = data.response; VK.api("getProfiles", {uids:uidsVip,fields:"photo"}, function(data) { // количество полученных профилей var count = data.response.length; var usersListHtml = ''; for(var i=0;i<count;i++){ usersListHtml += '<div class="user_block"><a href="http://vk.com/id' + data.response[i].uid + '" title="' + data.response[i].first_name + ' ' + data.response[i].last_name + '" target="_blank"><img src="' + data.response[i].photo + '" /></a><a href="http://vk.com/id' + data.response[i].uid + '"target="_blank">' + data.response[i].first_name + ' ' + data.response[i].last_name + '</a></div>'; } $('#users').html(usersListHtml); }); } $('#loader').fadeOut(1000); }, "json");} function order() { var params = { type: 'item', item: 'item1' }; VK.callMethod('showOrderBox', params); } var callbacksResults = document.getElementById('callbacks'); VK.addCallback('onOrderSuccess', function(order_id) { $('#loader').show(); $.post('http://вашсайт/add.php', {"viewer_id": viewer_id, "auth_key": auth_key}, function(data){ if (data.success) { $('.success').html(data.success.msg); $('.error').slideUp(); $('.success').slideDown(); } else { $('.error').html(data.error.msg); $('.success').slideUp(); $('.error').slideDown(); } updateUsers(); }, "json"); }); VK.addCallback('onOrderFail', function() { callbacksResults.innerHTML += '<br />onOrderFail'; }); VK.addCallback('onOrderCancel', function() { callbacksResults.innerHTML += '<br />onOrderCancel'; }); $('#add_btn').click(function() { order(); }); });
В настройках платежей приложения указываем путь к этому файлу.
Код: Выделить всё
<?php header("Content-Type: application/json; encoding=utf-8"); $secret_key = ' '; // Защищенный ключ приложения $input = $_POST; // Проверка подписи $sig = $input['sig']; unset($input['sig']); ksort($input); $str = ''; foreach ($input as $k => $v) { $str .= $k.'='.$v; } if ($sig != md5($str.$secret_key)) { $response['error'] = array( 'error_code' => 10, 'error_msg' => 'Несовпадение вычисленной и переданной подписи запроса.', 'critical' => true ); } else { // Подпись правильная switch ($input['notification_type']) { case 'get_item': // Получение информации о товаре $item = $input['item']; // наименование товара if ($item == 'item1') { $response['response'] = array( 'item_id' => 25, 'title' => 'Статус VIP', 'photo_url' => 'ссылка к картинке', 'price' => 1 ); } else { $response['error'] = array( 'error_code' => 20, 'error_msg' => 'Товара не существует.', 'critical' => true ); } break; case 'get_item_test': // Получение информации о товаре в тестовом режиме $item = $input['item']; if ($item == 'item1') { $response['response'] = array( 'item_id' => 125, 'title' => 'Статус VIP', 'photo_url' => 'ссылка к картинке', 'price' => 1 ); } else { $response['error'] = array( 'error_code' => 20, 'error_msg' => 'Товара не существует.', 'critical' => true ); } break; case 'order_status_change': // Изменение статуса заказа if ($input['status'] == 'chargeable') { $order_id = intval($input['order_id']); // Код проверки товара, включая его стоимость $app_order_id = 1; // Получающийся у вас идентификатор заказа. $response['response'] = array( 'order_id' => $order_id, 'app_order_id' => $app_order_id, ); } else { $response['error'] = array( 'error_code' => 100, 'error_msg' => 'Передано непонятно что вместо chargeable.', 'critical' => true ); } break; case 'order_status_change_test': // Изменение статуса заказа в тестовом режиме if ($input['status'] == 'chargeable') { $order_id = intval($input['order_id']); $app_order_id = 1; // Тут фактического заказа может не быть - тестовый режим. $response['response'] = array( 'order_id' => $order_id, 'app_order_id' => $app_order_id, ); } else { $response['error'] = array( 'error_code' => 100, 'error_msg' => 'Передано непонятно что вместо chargeable.', 'critical' => true ); } break; } } echo json_encode($response); ?>