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());
Код: Выделить всё
<?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 */
7. Загружаем swf файл в контакт
Приложение должно быть включено.
Без использования контейнера.