VIP в IFrame-приложении (secure.withdrawVotes, getProfiles)
Добавлено: 24 июл 2011, 16:35
VIP в приложении (secure.withdrawVotes, getProfiles)
HTML, CSS, PHP, JavaScript, ВКонтакте API 3.0
ВНИМАНИЕ! ИСПОЛЬЗОВАТЬ ЭТОТ КОД НЕ РЕКОМЕНДУЕТСЯ. ОН УСТАРЕЛ.
1. В методах ВКонтакте API произошли изменения.
С 1 ноября 2012 года методы getUserBalance, secure.getBalance и secure.withdrawVotes были отключены.
Используйте актуальный способ - Payments API.
2. Использовать mysql не рекомендуется.
Поддержка расширения mysql будет удалена из PHP. Используйте mysqli или PDO.
3. Логика скрипта не продумана до конца и не пригодна для использования в готовом проекте в таком виде.
Если в базе не будет добавлено ни одного пользователя, то приложение не заработает.
Если пользователь уже есть в списке (не на первом месте) и он захочет добавить себя ещё раз, то скрипт поведет себя некорректно.
Если пользователь захочет добавить себя в список и нажмет отмену, то при пополнении баланса он автоматически добавится в список, т.к. будет вызвана функция onBalanceChanged.
Для того чтобы понять этот урок, нужны некоторые знания создания IFrame-приложений Вконтакте.
В этом показано как работать с методом secure.withdrawVotes (API 3.0) с использованием vkapi.class.php.
Приведен код клиентской части приложения с проверкой баланса пользователя и серверная часть со списанием голосов на счёт приложения.
На сервере должен быть доступен cURL. Проверить можно способами из урока topic144.html
В уроке показано:
- работа с методом getUserBalance
- алгоритм работы приложения в зависимости от баланса
- отправка данные на сервер с помощью jQuery
- использование изображения предзагрузчика
- списание голосов с баланса пользователя на счёт приложения
1. Создадим базу для хранения id пользователей, ip адресов и даты добавления
В phpMyAdmin выполнить запрос для создания базы данных
2. Создадим файл настроек settings.php
Необходимо изменить данные на свои
3. Файл главной страницы приложения index.html
4. Файл оформления приложения style.css
Файл надо поместить в папку css.
5. Файл добавления пользователя в базу - add.php
6. Файл получения id пользователей из базы, для вывода в приложении - getuids.php
7. Содержимое файла vkapi.class.php
8. Файл с кодом JavaScript - code.js
Файл надо положить в папку js.
Ссылки:
https://flapps.ru/apps/vip/getuids.php
https://flapps.ru/apps/vip/add.php
Нужно заменить на пути к своим файлам.
9. Файл jquery-1.6.2.min.js
Файл можно скачать здесь http://code.jquery.com/jquery-1.6.2.min.js
Необходимо положить его в папку js.
HTML, CSS, PHP, JavaScript, ВКонтакте API 3.0
ВНИМАНИЕ! ИСПОЛЬЗОВАТЬ ЭТОТ КОД НЕ РЕКОМЕНДУЕТСЯ. ОН УСТАРЕЛ.
1. В методах ВКонтакте API произошли изменения.
С 1 ноября 2012 года методы getUserBalance, secure.getBalance и secure.withdrawVotes были отключены.
Используйте актуальный способ - Payments API.
2. Использовать mysql не рекомендуется.
Поддержка расширения mysql будет удалена из PHP. Используйте mysqli или PDO.
3. Логика скрипта не продумана до конца и не пригодна для использования в готовом проекте в таком виде.
Если в базе не будет добавлено ни одного пользователя, то приложение не заработает.
Если пользователь уже есть в списке (не на первом месте) и он захочет добавить себя ещё раз, то скрипт поведет себя некорректно.
Если пользователь захочет добавить себя в список и нажмет отмену, то при пополнении баланса он автоматически добавится в список, т.к. будет вызвана функция onBalanceChanged.
Для того чтобы понять этот урок, нужны некоторые знания создания IFrame-приложений Вконтакте.
В этом показано как работать с методом secure.withdrawVotes (API 3.0) с использованием vkapi.class.php.
Приведен код клиентской части приложения с проверкой баланса пользователя и серверная часть со списанием голосов на счёт приложения.
На сервере должен быть доступен cURL. Проверить можно способами из урока topic144.html
В уроке показано:
- работа с методом getUserBalance
- алгоритм работы приложения в зависимости от баланса
- отправка данные на сервер с помощью jQuery
- использование изображения предзагрузчика
- списание голосов с баланса пользователя на счёт приложения
1. Создадим базу для хранения id пользователей, ip адресов и даты добавления
В phpMyAdmin выполнить запрос для создания базы данных
Код: Выделить всё
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());
2. Создадим файл настроек settings.php
Код: Выделить всё
<?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'"); /* https://flapps.ru */?>
3. Файл главной страницы приложения index.html
Код: Выделить всё
<html><head><link rel="stylesheet" href="css/style.css" type="text/css" /> <script src="js/jquery-1.6.2.min.js" type="text/javascript"></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="https://flapps.ru">flapps.ru</a></body></html>
4. Файл оформления приложения style.css
Файл надо поместить в папку css.
Код: Выделить всё
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;} /* https://flapps.ru */
5. Файл добавления пользователя в базу - add.php
Код: Выделить всё
<?phpheader('Content-Type: application/json; charset=utf-8');include('settings.php');require 'vkapi.class.php'; $viewer_id = $_POST['viewer_id'];$auth_key = $_POST['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); $resp = $VK->api('secure.withdrawVotes', array('uid'=>$viewer_id, 'votes'=>'100')); if ($resp['response']>0) { $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 { switch($resp[error][error_code]) { case 502: echo '{"error":{"msg":"На вашем балансе недостаточно голосов!"}}'; break; default: echo '{"error":{"msg":"При добавлении ссылки произошла ошибка! Голоса не списаны."}}'; } } } else { // ошибка echo '{"error":{"msg":"'.$t.'"}}'; }} // конец проверки auth_keyelse { echo '{"error":{"msg":"Ошибка безопасности!"}}';} /* https://flapps.ru */?>
6. Файл получения id пользователей из базы, для вывода в приложении - getuids.php
Код: Выделить всё
<?phpheader('Content-Type: application/json; charset=utf-8');include('settings.php'); $viewer_id = $_POST['viewer_id'];$auth_key = $_POST['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":"Ошибка безопасности!"}}';} /* https://flapps.ru */ ?>
7. Содержимое файла vkapi.class.php
Код: Выделить всё
<?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
Файл надо положить в папку js.
Код: Выделить всё
$(document).ready(function(){var viewer_id;var auth_key;var wasPayBox = false; // было открыто окно "Внесите 1 голос", при нажатии на кнопку "Добавить" 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('https://flapps.ru/apps/vip/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 + '"><img src="' + data.response[i].photo + '" /></a><a href="http://vk.com/id' + data.response[i].uid + '">' + data.response[i].first_name + ' ' + data.response[i].last_name + '</a></div>'; } $('#users').html(usersListHtml); }); } $('#loader').fadeOut(1000); }, "json");} // баланс был измененVK.addCallback("onBalanceChanged", onBalanceChanged); function onBalanceChanged(settings) { if (wasPayBox) { wasPayBox = false; $('#add_btn').click(); }} // отправляем на сервер$('#add_btn').click(function() { VK.api("getUserBalance", function(data) { // если баланс меньше 1 голоса, то выводим окно "пополнить" if (data.response<100) { VK.callMethod("showPaymentBox",1); wasPayBox = true; } else { $('.error').hide(); $('#loader').show(); $.post('https://flapps.ru/apps/vip/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"); } });return false;}); }); /* https://flapps.ru */
https://flapps.ru/apps/vip/getuids.php
https://flapps.ru/apps/vip/add.php
Нужно заменить на пути к своим файлам.
9. Файл jquery-1.6.2.min.js
Файл можно скачать здесь http://code.jquery.com/jquery-1.6.2.min.js
Необходимо положить его в папку js.