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

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

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

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

VIP в Flash-приложении (secure.withdrawVotes, getProfiles)
ActionScript 3.0, PHP, ВКонтакте API 3.0

ВНИМАНИЕ! ИСПОЛЬЗОВАТЬ ЭТОТ КОД НЕ РЕКОМЕНДУЕТСЯ. ОН УСТАРЕЛ.
1. В методах ВКонтакте API произошли изменения.
С 1 ноября 2012 года методы getUserBalance, secure.getBalance и secure.withdrawVotes были отключены.
Используйте актуальный способ - Payments API.
2. Использовать mysql не рекомендуется.
Поддержка расширения mysql будет удалена из PHP. Используйте mysqli или PDO.
3. Логика скрипта не продумана до конца и не пригодна для использования в готовом проекте в таком виде.
Если в базе не будет добавлено ни одного пользователя, то приложение не заработает.
Если пользователь уже есть в списке (не на первом месте) и он захочет добавить себя ещё раз, то скрипт поведет себя некорректно.
Если пользователь захочет добавить себя в список и нажмет отмену, то при пополнении баланса он автоматически добавится в список, т.к. будет вызвана функция onBalanceChanged.


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

На сервере должен быть доступен cURL. Проверить можно способами из урока topic144.html

Изображение

В уроке показано:
- работа с методом getUserBalance
- отправка данные на сервер с помощью ActionscScript
- получение данных от сервера в формате JSON и обработка в приложении
- списание голосов с баланса пользователя на счёт приложения



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. Файл добавления пользователя в базу - 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 */?> 

4. Файл получения 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 */ ?> 



5. Содержимое файла 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);    }}?> 

6. Создаём новый Flash документ и файл Main.as

В Main.as пишем код

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

/* https://flapps.ru/forum/ - форум о создании приложений */package {    import flash.display.*;    import flash.events.*;    import flash.net.*;    import vk.APIConnection;    import vk.events.*;    import vk.api.serialization.json.JSON;    import flash.text.*;    import fl.containers.UILoader;     public class VipUsers extends Sprite    {        public var api_id:Number;        public var viewer_id;        public var sid:String;        public var secret:String;        var auth_key;        var wasPayBox = false;// было открыто окно "Внесите 1 голос", при нажатии на кнопку "Добавить"        var VK:APIConnection;         public function VipUsers()        {            // получаем flashVars            var flashVars:Object = stage.loaderInfo.parameters as Object;/*            // для тестирования локально, вводим свои данные здесь и раскоменчиваем код            flashVars['api_id'] = 743131;            flashVars['viewer_id'] = 1306422;            flashVars['sid'] = 'a1006fd1e8gb9bd669e1119280166bc6cb9110b8a111550333bf041301';            flashVars['secret'] = '7ef8l6a4p8';*/            // присваиваем переменным значения из flashVars            api_id = flashVars['api_id'];            viewer_id = flashVars['viewer_id'];            sid = flashVars['sid'];            secret = flashVars['secret'];            auth_key = flashVars['auth_key'];             // инициализация VK            VK = new APIConnection(flashVars);             add_btn.addEventListener(MouseEvent.CLICK,addUid);                        // вешаем слушатель на событие изменения баланса            VK.addEventListener('onBalanceChanged',onBalanceChanged);                        // обновляем аватарки пользователей            updateUsers();        }           // добавление пользователя в базу        function addUid(e:Event):void        {            // проверяем баланс            VK.api('getUserBalance', {}, onBalanceLoaded, onError);        }         private function onBalanceLoaded(data: Object):void        {             if (data < 100)            {// не достаточно голосов                VK.callMethod("showPaymentBox",1);                wasPayBox = true;            }            else            {                var loader:URLLoader = new URLLoader();                var request:URLRequest = new URLRequest("https://flapps.ru/apps/vip/add.php");                request.method = URLRequestMethod.POST;                var vars:URLVariables = new URLVariables();                vars['auth_key'] = auth_key;                vars['viewer_id'] = viewer_id;                request.data = vars;                loader.addEventListener(Event.COMPLETE,uidAdded);                loader.load(request);            }        }         // uid был отправлен и был получен ответ от сервера        function uidAdded(event:Event):void        {            var json_data = JSON.decode(event.target.data);            result_tf.text = json_data.error.msg;             // обновляем аватарки пользователей            updateUsers();        }          // обновление аватарок пользователей        function updateUsers()        {            var loader:URLLoader = new URLLoader();            var request:URLRequest = new URLRequest("https://flapps.ru/apps/vip/getuids.php");            request.method = URLRequestMethod.POST;            var vars:URLVariables = new URLVariables();            vars['auth_key'] = auth_key;            vars['viewer_id'] = viewer_id;            request.data = vars;            loader.addEventListener(Event.COMPLETE,onUsersUpdate);            loader.load(request);        }          function onUsersUpdate(event:Event):void        {            var json_data = JSON.decode(event.target.data);            // список id пользователей            var uidsVip = json_data.response;            // получаем профили            VK.api('getProfiles', {uids:uidsVip,fields:'photo' }, onProfilesLoaded, onError);        }         private function onProfilesLoaded(data: Object):void        {            // количество полученных профилей            var count = data.length;             // массив блоков с информацией о пользователях            var usersBoxArray = new Array();                        // стиль текста            var textformat:TextFormat = new TextFormat();            textformat.align = TextFormatAlign.CENTER;             textformat.font = 'Tahoma';            textformat.size = 11;            textformat.color = 0x2B587A;             for (var i=0; i<count; i++)            {                // создаем MovieClip, в котором будет ава и имя пользователя                var user_box = new MovieClip;                // рамка блока                user_box.graphics.beginFill(0xDAE1E8);                user_box.graphics.drawRect(0,0,80,95);                // заливка блока                user_box.graphics.beginFill(0xF7F7F7);                user_box.graphics.drawRect(1,1,78,93);                user_box.graphics.endFill();                                user_box.x = 10 + i * 85;                user_box.y = 10;                user_box.buttonMode = true;                user_box.useHandCursor = true;                user_box.mouseChildren = false;                // добавляем фото                var user_photo:UILoader = new UILoader  ;                user_photo.autoLoad = true;                user_photo.scaleContent = false;                user_photo.source = data[i]['photo'];                user_photo.move(15,10);                user_box.addChild(user_photo);                // добавляем имя                var user_name_tf:TextField = new TextField  ;                user_name_tf.width = 80;                user_name_tf.height = 40;                user_name_tf.wordWrap = true;                user_name_tf.defaultTextFormat = textformat;                user_name_tf.text = data[i]['first_name'] + "\n" + data[i]['last_name'];                user_name_tf.x = 0;                user_name_tf.y = 60;                user_box.addChild(user_name_tf);                 usersBoxArray.push(user_box);                addChild(usersBoxArray[i]);                        // записываем id пользователя в массив                usersBoxArray[i].uid = data[i]['uid'];                // клик по блоку                usersBoxArray[i].addEventListener(MouseEvent.CLICK, function(e:MouseEvent){                                    //navigateToURL(new URLRequest('http://vkontakte.ru/id' + data[i]['uid']));                                    trace('http://vkontakte.ru/id' + e.currentTarget.uid);                                });            }        }          // если произошла ошибка        private function onError(data: Object):void        {            result_tf.text = data.error_msg;        }                // баланс изменен        private function onBalanceChanged(e:CustomEvent):void        {            // если пополнение баланса была вызвано приложением автоматически, то пробуем отправить снова            if (wasPayBox) {                wasPayBox = false;                addUid(null);            }        }            }} /* https://flapps.ru */
Ссылки https://flapps.ru/apps/vip/getuids.php и https://flapps.ru/apps/vip/add.php необходимо заменить на свои.


7. Загружаем swf файл в контакт

Приложение должно быть включено.
Без использования контейнера.
Evgesha
ЗАБАНЕН!
Сообщения: 279
Зарегистрирован: 07 июн 2011, 20:36

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

Сообщение Evgesha »

Хороший урок!
Аватара пользователя
112
Модератор
Модератор
Сообщения: 2215
Зарегистрирован: 02 фев 2010, 21:53

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

Сообщение 112 »

Пытаюсь сделать перелистывания по кнопке ,чтоб следующие колонки показывало.

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

  var user_box = new MovieClip;function onProfilesLoaded(data: Object):void        { ... for (var i=0; i<count; i++)            {                // создаем MovieClip, в котором будет ава и имя пользователя                // рамка блока                user_box.graphics.beginFill(0xDAE1E8);                user_box.graphics.drawRect(0,0,80,95);                // заливка блока                user_box.graphics.beginFill(0xF7F7F7);                user_box.graphics.drawRect(1,1,78,93);                user_box.graphics.endFill();                               user_box.x = 10 + i * 85;                user_box.y = 10;                user_box.buttonMode = true;                user_box.useHandCursor = true;                user_box.mouseChildren = false; ...            }} b_right.addEventListener(MouseEvent.CLICK, function(event:MouseEvent) {user_box.x=user_box.x-85; })
Все липнится на одно место
Изображение
как решать то?
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

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

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

112
Добавлять все аватарки на мувиклип. Когда нужно заменить другими аватарами, удалить с мувиклипа все старые и добавить новые.

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

// удалить все с avatars_mcwhile (avatars_mc.numChildren > 0) {    avatars_mc.removeChildAt(0);}
Аватара пользователя
112
Модератор
Модератор
Сообщения: 2215
Зарегистрирован: 02 фев 2010, 21:53

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

Сообщение 112 »

Александр писал(а):112
Добавлять все аватарки на мувиклип. Когда нужно заменить другими аватарами, удалить с мувиклипа все старые и добавить новые.

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

// удалить все с avatars_mcwhile (avatars_mc.numChildren > 0) {    avatars_mc.removeChildAt(0);}
Т.е и имена тоже на мувиклип цеплять?Т.к их тоже надо перелистнуть,и смысл тогда мувиклипа?А координатами x,y ничего не сделать?
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

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

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

Да, целиком все user_box на один мувиклип.
Как ты хочешь сделать координатами? Сдвинуть все предыдущие блоки с информацией и добавить новые? Тогда лучше всё равно двигать один мувиклип, на котором будут находится другие.
Если у тебя всегда одинаковое количество блоков, то можно просто создать их вручную и только менять

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

user1_photo.source = data[i]['photo'];//иuser1_name_tf.text = data[i]['first_name'] + "\n" + data[i]['last_name'];
Аватара пользователя
112
Модератор
Модератор
Сообщения: 2215
Зарегистрирован: 02 фев 2010, 21:53

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

Сообщение 112 »

Александр
Да...Именно хочу передвигать user_box ,user_box'у прибавлялось/отнималось бы по 85.Т.е пролистывалось бы ровно на 1 блок.Мне кажется это самый простой способ решение проблем.Вот я еще до сих пор не могу понять чем вызвано такое Изображение
ведь просто переменную вынес из цикла.
Вручную ,думал об этом.Но этих блоков будет не менее 100.Мне кажется ,что передвигать x'ом будет удобнее...или нет?
Еще так же можно передвигать массив usersBoxArray ,думаю так даже будет лучше...
Аватара пользователя
Евгений
FL Team
FL Team
Сообщения: 776
Зарегистрирован: 10 июн 2010, 11:01

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

Сообщение Евгений »

112, можно не парится и использовать уже готовый компонент Paged Carousel http://developer.yahoo.com/flash/astra- ... mples.html
Bull
Сообщения: 26
Зарегистрирован: 12 сен 2011, 11:07

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

Сообщение Bull »

Все делаю как сказано в статье. Загружаю swf в контакт и там только кнопка добавить которая не работает.
Аватара пользователя
112
Модератор
Модератор
Сообщения: 2215
Зарегистрирован: 02 фев 2010, 21:53

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

Сообщение 112 »

Евгений
Спасибо :)
Bull
Значит что-то не так,кроссдомен на хост есть?приложение включено?с аккаунта гл администратора тестишь?
Ответить