ActionScript 3.0 (Adobe Flash CS4) + PHP.
Метода secure.transferVotes нет. Работать не будет!
Это приложение не будет проверено. В непроверенные приложения пользователи не могут вносить голоса. Проверить работу приложения смогут только администраторы приложения.
На бесплатном хостинге скорее всего не будет работать. Проверьте есть ли на вашем хостинге cURL topic144.html
Если на вашем хостинге есть CURL, но при этом есть и реклама, которая автоматически встраивается в скрипты, то приложение не будет работать корректно.
На дешевых хостингах может возникать ошибка из-за большого различия timestamp с вконтактовским.
Используется сторонняя библиотека VkApi, для работы с методами Вконтакте API и библиотека стандартных GUI-компонентов. Всё это находится в архиве с исходником.
1. Добавляем на сцену:
Текстовые поля с именами:
- uid_to_tf (поле ввода id того, кому будут передаваться голоса)
- votes_tf (поле ввода количества передаваемых голосов)
- user_name_tf (динамическое поле, в котором будет выводиться имя пользователя)
- result_tf (поле, в котором будет выводиться результат)
Другие необходимые для работы кнопки, будут созданы программно в коде.
2. Создаём Main.as и пишем код:
Код: Выделить всё
package { import flash.net.*; import flash.display.*; import flash.events.*; import flash.text.*; import vk.*; public class Main extends Sprite { private var api_id:Number=1727522;// id вашего приложения private var api_secret:String="m1fE3mX36rb";// секретный ключ private var viewer_id; private var externalXML:XML; private var loader:URLLoader=new URLLoader; private var photoLoader:Loader=new Loader; private var api:VkApiNode; private var url_loader:URLLoader; private var url_request:URLRequest; private var query:String; private var uids:Array; private var fields:Array; public function Main():void { // подключаем библиотеку стандартных GUI-компонентов вконтакте VK.init( this, "http://api.vkontakte.ru/swf/vk_gui-0.3.swf" ); } public function onVKLoaded():void { // создаём кнопки var btn1:* =VK.createSquareButton("Передать",257,45); addChild(btn1); var btn2:* =VK.createSquareButton("Проверить",85,45); addChild(btn2); var params:Object=LoaderInfo(root.loaderInfo).parameters; viewer_id=params['viewer_id']; btn1.addEventListener(MouseEvent.CLICK,btn1Click); btn2.addEventListener(MouseEvent.CLICK,btn2Click); } public function btn1Click(e:MouseEvent):void { // передача голосов result_tf.text = 'Ждите...'; var params:Object=LoaderInfo(root.loaderInfo).parameters; var loader:URLLoader=new URLLoader ; var request:URLRequest=new URLRequest("https://flapps.ru/transfervotes.php");// адрес вашего скрипта request.method=URLRequestMethod.POST; var vars:URLVariables=new URLVariables ; vars['auth_key']=params['auth_key']; vars['uid_from']=params['viewer_id']; vars['uid_to']=uid_to_tf.text; vars['votes']=votes_tf.text; request.data=vars; loader.addEventListener(HTTPStatusEvent.HTTP_STATUS,onError); loader.addEventListener(Event.COMPLETE,onComplete); loader.load(request); } private function onComplete(event:Event):void { var loader:URLLoader=event.target as URLLoader; if (loader!=null) { result_tf.text=loader.data; } else { result_tf.text='Ошибка!'; } } private function onError(event:Event):void { result_tf.text = 'Ошибка! Попробуйте позже.'; } public function btn2Click(e:MouseEvent):void { // загрузка имени и аватарки пользователя, которому будем передавать голоса fields=['first_name,last_name,photo_big']; uids=[uid_to_tf.text]; getProfiles(uids,fields); } public function getProfiles(uid:Array,fields:Array):void { // функция загрузки профиля пользователя if (fields.length==0) { fields=null; } api=new VkApiNode(viewer_id,api_id,api_secret); query=api.getProfiles(uid,fields); url_request=new URLRequest(query); url_loader=new URLLoader ; url_loader.addEventListener(Event.COMPLETE,onProfileLoad); url_loader.load(url_request); } private function onProfileLoad(e:Event):void { // обрабатываем полученные данные профиля пользователя if (url_loader!=null) { externalXML=new XML(url_loader.data); user_name_tf.text=externalXML..first_name+' '+externalXML..last_name; var photo=externalXML..photo_big; url_request=new URLRequest(photo); photoLoader.load(url_request); photoLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,onPhotoLoaded); } else { trace("Error!"); } } private function onPhotoLoaded(e:Event):void { // отображаем аватарку photoLoader.x=340; photoLoader.y=30; addChild(photoLoader); } }}
3. Подключаем Main.as к fla
Если не знаете как, то посмотрите как это было сделано в этом уроке topic3.html
4. Создаём файл transfervotes.php и пишем в него код:
Код: Выделить всё
<?require('VkApi.class.php'); // находится в архиве с исходником $app_id = '1727522'; // id приложения$api_secret = 'qwertyuiopasdfghjklzxcvbnm'; // Защищенный ключ function get_url($query) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $query); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 10); return curl_exec($ch); curl_close($ch);} $auth_key = $_POST['auth_key']; // auth_key из FlashVars приложения$uid_from = $_POST['uid_from']; // id просматривающего приложение // Рассчитывается ключ авторизации$real_key = md5($app_id."_".$uid_from."_".$api_secret); if ($auth_key == $real_key){$api = new VkApiNode($app_id, $api_secret);$uid_to = $_POST['uid_to'];$votes = ($_POST['votes']*100); // Количество голосов (1 голос = 100)$query = $api->transferVotes($uid_from, $uid_to, $votes); $result = new SimpleXMLElement(get_url($query)); if ($result->transferred>0) echo 'Голоса успешно переведены!';else { switch($result->error_code) { case 2: echo "Приложение выключено!"; break; case 151: echo "Неверное количество голосов!"; break; case 152: echo "Неверный id пользователя (from)"; break; case 153: echo "Неверный id пользователя (to)"; break; case 502: echo "На балансе недостаточно голосов!"; break; default: echo "При переводе голоса произошла ошибка!"; } }}else echo 'error';?>
5. Создаём файл crossdomain.xml
Код: Выделить всё
<cross-domain-policy><allow-access-from domain="*.vkontakte.ru" /><allow-access-from domain="*.vk.com" /></cross-domain-policy>
6. Загружаем файлы на сервер
Файл crossdomain.xml загрузить в корневой каталог.
transfervotes.php - в любой каталог, но вместе с файлом VkApi.class.php(в архиве с исходником).
7. Загружаем приложение в контакт
- Если приложение выключено, то включаем.
- Если включен контейнер, то выключаем.
8. Всё готово!
Исходник https://flapps.ru/example/transfervotes.rar