ActionScript 3.0, PHP, ВКонтакте API 3.0
Для того чтобы понять этот урок, нужны некоторые знания создания Flash-приложений Вконтакте.
На сервере должен быть доступен cURL. Проверить можно способами из урока http://flapps.ru/forum/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'");
- /* http://flapps.ru */
- ?>
Необходимо изменить данные на свои
3. Файл добавления пользователя в базу - 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":"Ошибка безопасности!"}}';
- }
- /* http://flapps.ru */
- ?>
4. Файл получения 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":"Ошибка безопасности!"}}';
- }
- /* http://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 пишем код
- /*
- http://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("http://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("http://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);
- }
- }
- }
- }
- /* http://flapps.ru */
Ссылки http://flapps.ru/apps/vip/getuids.php и http://flapps.ru/apps/vip/add.php необходимо заменить на свои.
7. Загружаем swf файл в контакт
Приложение должно быть включено.
Без использования контейнера.
Если пользователь уже есть в списке и он захочет добавить себя ещё раз, то скрипт поведет себя не корректно. Доработайте его самостоятельно.
Исходник Чтобы увидеть ссылку - зарегистрируйтесь



