VIP в приложении (secure.withdrawVotes, getProfiles)

Для того чтобы понять этот урок, нужны некоторые знания создания IFrame-приложений Вконтакте.

В этом показано как работать с методом secure.withdrawVotes (API 3.0) с использованием vkapi.class.php.
Приведен код клиентской части приложения с проверкой баланса пользователя и серверная часть со списанием голосов на счёт приложения.

На сервере должен быть доступен cURL.



В уроке показано:
- работа с методом 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'");
?>


Необходимо изменить данные на свои

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="http://flapps.ru">flapps.ru</a>
</body>
</html>

4. Файл оформления приложения style.cssФайл надо поместить в папку css.
Ном</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;
}

5. Файл добавления пользователя в базу - add.php
<?php
header('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);
$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_key
else {
echo '{"error":{"msg":"Ошибка безопасности!"}}';
}
?>

6. Файл получения id пользователей из базы, для вывода в приложении - getuids.php
<?php
header('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_key
else {
echo '{"error":{"msg":"Ошибка безопасности!"}}';
}
?>

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('http://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;
$('#addLink_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('http://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;
});
 
});
 

Нужно заменить на пути к своим файлам.

9. Файл jquery-1.6.2.min.js
Теги:
secure.withdrawVotes, getProfiles, вконтакте
Добавлено: 15 Августа 2013 01:48:03 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...