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

Темы только для ознакомления. Уроки по использованию старой версии ВКонтакте API и устаревших методов.
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45
Откуда: Санкт-Петербург

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

Сообщение Александр »

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 выполнить запрос для создания базы данных

Код: Выделить всё

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.
Аватара пользователя
boombast1k
Сообщения: 332
Зарегистрирован: 23 июн 2011, 07:31

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

Сообщение boombast1k »

УРАААААААААААА!!!! Спасибо большое
Аватара пользователя
boombast1k
Сообщения: 332
Зарегистрирован: 23 июн 2011, 07:31

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

Сообщение boombast1k »

а как сделать чтоб они в строчку вылазили а не в столбик?
Аватара пользователя
boombast1k
Сообщения: 332
Зарегистрирован: 23 июн 2011, 07:31

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

Сообщение boombast1k »

ой все, просто я ступил :oops:
$Sasha$
Сообщения: 47
Зарегистрирован: 06 авг 2011, 20:07

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

Сообщение $Sasha$ »

Не робит почему-то.
Всё время крутится прелоадер.
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45
Откуда: Санкт-Петербург

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

Сообщение Александр »

$Sasha$
В Charles что видишь?
$Sasha$
Сообщения: 47
Зарегистрирован: 06 авг 2011, 20:07

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

Сообщение $Sasha$ »

извиняюсь нашёл ответ на свой вопрос.

я сменил платформу прилы и забыл поменять api_id & secret_key
Аватара пользователя
12funteam89
Сообщения: 99
Зарегистрирован: 29 окт 2010, 15:34
Откуда: Санкт-Петербург

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

Сообщение 12funteam89 »

Все время грузиться прелоадер, в чем проблема?
charles посмотрел вроде все норм.
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45
Откуда: Санкт-Петербург

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

Сообщение Александр »

12funteam89
Напиши ссылку на приложение.
kirikfas
Сообщения: 46
Зарегистрирован: 17 июн 2011, 08:39

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

Сообщение kirikfas »

У меня почему то не получается. Я все сделал, но тестирование не запускается. Я все вписал, базу создал. Александр, вы можете мне кинуть полный исходник, а то у меня не получается. И какой вы посоветуете бесплатный и платный хостинг, который подходит под все параметры.
Ответить