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

Темы только для ознакомления. Уроки по использованию старой версии ВКонтакте API и устаревших методов.

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

Сообщение Александр » 24 июл 2011, 16:35

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. Проверить можно способами из урока https://flapps.ru/forum/topic144.html

Изображение

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



1. Создадим базу для хранения id пользователей, ip адресов и даты добавления

В phpMyAdmin выполнить запрос для создания базы данных
  1. CREATE TABLE IF NOT EXISTS `app_vip` (
  2.   `id` int(9) AUTO_INCREMENT,
  3.   `uid` int(9) DEFAULT NULL,
  4.   `ip` INT UNSIGNED,
  5.   `add_date` datetime,
  6.   PRIMARY KEY  (`id`)
  7. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
  8. INSERT INTO `app_vip` (`uid`, `ip`,`add_date`) VALUES (1306422,INET_ATON("127.0.0.1"),NOW());



2. Создадим файл настроек settings.php

  1. <?php
  2. // данные доступа к базе данных
  3. $db_host="localhost";       // обычно не нужно изменять
  4. $db_user="flapps";        // имя пользователя БД
  5. $db_password="flapps";        // пароль БД
  6. $db_name = "flapps";      // имя БД
  7. $table_name = "app_vip";       // имя таблицы статистики. Если вы не меняли его в запросе, создающем БД, то и здесь менять его не надо
  8.  
  9. $api_id = 743131; // id приложения
  10. $secret_key = 'aafflAppSU123VH45pPF'; // защищенный ключ
  11.  
  12. // соединение с БД
  13. mysql_connect($db_host, $db_user, $db_password) or die (mysql_error());
  14. mysql_select_db($db_name) or die (mysql_error());
  15. mysql_query("SET NAMES 'utf8'");
  16.  
  17. /* https://flapps.ru */
  18. ?>

Необходимо изменить данные на свои


3. Файл главной страницы приложения index.html

  1. <html>
  2. <head>
  3. <link rel="stylesheet" href="css/style.css" type="text/css" />
  4. <script src="js/jquery-1.6.2.min.js" type="text/javascript"></script>
  5. <script src="js/code.js" type="text/javascript"></script>
  6. <script src="http://vkontakte.ru/js/api/xd_connection.js?2" type="text/javascript"></script>
  7. </head>
  8. <body>
  9. <div id="loader" style="display:none;"><img src="http://vk.com/images/upload.gif" alt="" width="32" height="8" border="0" /></div>
  10.  
  11.  
  12. <div id="users"></div>
  13. <a href="#" id="add_btn" title="">Добавить</a>
  14. <div class="error" style="display:none;"></div>
  15. <div class="success" style="display:none;"></div>
  16. <br /><br /><a href="https://flapps.ru">flapps.ru</a>
  17. </body>
  18. </html>



4. Файл оформления приложения style.css

Файл надо поместить в папку css.
  1. body {
  2.     padding:10px;
  3.     border:1px solid #DAE1E8;
  4.     font-family: tahoma, arial, verdana, sans-serif, Lucida Sans;
  5.     font-size: 11px;
  6.     background:#fff;
  7. }
  8. a:hover {
  9.     text-decoration:underline;
  10. }
  11.  
  12. .success {
  13.     background-color: #EFFFE8;
  14.     border: 1px solid #9BE888;
  15.     font-size: 11px;
  16.     margin: 8px;
  17.     padding: 8px 11px;
  18. }
  19. .error {
  20.     background-color: #FFEFE8;
  21.     border: 1px solid #E89B88;
  22.     font-size: 11px;
  23.     margin: 8px;
  24.     padding: 8px 11px;
  25. }
  26. #add_btn {
  27.     display:block;
  28.     clear:both;
  29. }
  30. .user_block {
  31.     border:1px solid #DAE1E8;
  32.     background:#F7F7F7;
  33.     text-align:center;
  34.     padding:5px;
  35.     margin:7px;
  36.     width:68px;
  37.     height:79px;
  38.     float:left;
  39. }
  40. .user_block a{
  41.     font-family: tahoma, arial, verdana, sans-serif, Lucida Sans;
  42.     font-size: 11px;
  43.     color:#2B587A;
  44.     text-decoration:none;
  45. }
  46.  
  47.  
  48. /* CSS for Ajax Loader */
  49. #loader {
  50.     width: 100%;
  51.     height: 100%;
  52.     position: fixed;
  53.     text-align: center;
  54.     z-index: 1000;
  55.     background-color: #fff;
  56.     opacity: 0.80;
  57. }
  58.  
  59. #loader img{
  60.     position: absolute;
  61.     left: 50%;
  62.     top: 50%;
  63.     margin: -40px 0 0 -40px;
  64. }
  65.  
  66.  
  67. /* https://flapps.ru */



5. Файл добавления пользователя в базу - add.php

  1. <?php
  2. header('Content-Type: application/json; charset=utf-8');
  3. include('settings.php');
  4. require 'vkapi.class.php';
  5.  
  6. $viewer_id = $_POST['viewer_id'];
  7. $auth_key = $_POST['auth_key'];
  8.  
  9. $real_key = md5($api_id."_".$viewer_id."_".$secret_key);
  10. if ($auth_key == $real_key){
  11.     $error=false;
  12.     $t='';
  13.  
  14.     // если добавляемый пользователь уже первый в списке, то не добавляем
  15.     // выбираем последнего пользователя
  16.     $query = 'SELECT `uid` FROM `'.$table_name.'` ORDER BY `id` DESC LIMIT 1;';
  17.     $sql = mysql_query($query);
  18.     $sql_data = mysql_fetch_array($sql);
  19.     if ($sql_data['uid']==$viewer_id) {
  20.         $t.= 'Вы уже на первом месте в списке!';
  21.         $error=true;
  22.     }
  23.        
  24.  
  25.     // если нет ошибки - записываем
  26.     if (!$error) {
  27.        
  28.         // списываем голоса и добавляем ссылку
  29.         $VK = new vkapi($api_id, $secret_key);
  30.         $resp = $VK->api('secure.withdrawVotes', array('uid'=>$viewer_id, 'votes'=>'100'));
  31.        
  32.         if ($resp['response']>0) {
  33.             $ip = getenv("REMOTE_ADDR");
  34.    
  35.             $query = 'INSERT INTO `'.$table_name.'` (`uid`, `ip`,`add_date`) VALUES ("'.mysql_real_escape_string($viewer_id).'",INET_ATON("'.$ip.'"),NOW());';
  36.             $sql = mysql_query($query);
  37.             echo '{"success":{"msg":"Вы добавлены!"}}';
  38.         } else {
  39.             switch($resp[error][error_code]) {
  40.                 case 502:
  41.                     echo '{"error":{"msg":"На вашем балансе недостаточно голосов!"}}';
  42.                     break;
  43.                 default:      
  44.                     echo '{"error":{"msg":"При добавлении ссылки произошла ошибка! Голоса не списаны."}}';
  45.             }
  46.         }
  47.     } else { // ошибка
  48.             echo '{"error":{"msg":"'.$t.'"}}';
  49.     }
  50. } // конец проверки auth_key
  51. else {
  52.     echo '{"error":{"msg":"Ошибка безопасности!"}}';
  53. }
  54.  
  55. /* https://flapps.ru */
  56. ?>
  57.  



6. Файл получения id пользователей из базы, для вывода в приложении - getuids.php

  1. <?php
  2. header('Content-Type: application/json; charset=utf-8');
  3. include('settings.php');
  4.  
  5. $viewer_id = $_POST['viewer_id'];
  6. $auth_key = $_POST['auth_key'];
  7.  
  8. $real_key = md5($api_id."_".$viewer_id."_".$secret_key);
  9. if ($auth_key == $real_key){
  10.     $query = 'SELECT `uid` FROM `'.$table_name.'` ORDER BY `id` DESC LIMIT 7;'
  11.     $sql = @mysql_query($query);
  12.     $num_rows = mysql_num_rows($sql);
  13.    
  14.     $json_str = '{"response":"';
  15.     while ($sql_data = @mysql_fetch_array($sql)) {
  16.         $json_str .= $sql_data['uid'].',';
  17.     }
  18.     //удаляем последнюю запятую
  19.     $json_str = substr($json_str, 0, -1);
  20.     $json_str .= '"}';
  21.    
  22.     echo $json_str;
  23. } // конец проверки auth_key
  24. else {
  25.     echo '{"error":{"msg":"Ошибка безопасности!"}}';
  26. }
  27.  
  28. /* https://flapps.ru */
  29.  
  30. ?>
  31.  



7. Содержимое файла vkapi.class.php

  1. <?php
  2.  
  3. /**
  4.  * VKAPI class for vk.com social network
  5.  *
  6.  * @package server API methods
  7.  * @link http://vk.com/developers.php
  8.  * @autor Oleg Illarionov
  9.  * @version 1.0
  10.  */
  11.  
  12. class vkapi {
  13.     var $api_secret;
  14.     var $app_id;
  15.     var $api_url;
  16.    
  17.     function vkapi($app_id, $api_secret, $api_url = 'api.vk.com/api.php') {
  18.         $this->app_id = $app_id;
  19.         $this->api_secret = $api_secret;
  20.         if (!strstr($api_url, 'http://')) $api_url = 'http://'.$api_url;
  21.         $this->api_url = $api_url;
  22.     }
  23.    
  24.     function api($method,$params=false) {
  25.         if (!$params) $params = array();
  26.         $params['api_id'] = $this->app_id;
  27.         $params['v'] = '3.0';
  28.         $params['method'] = $method;
  29.         $params['timestamp'] = time();
  30.         $params['format'] = 'json';
  31.         $params['random'] = rand(0,10000);
  32.         ksort($params);
  33.         $sig = '';
  34.         foreach($params as $k=>$v) {
  35.             $sig .= $k.'='.$v;
  36.         }
  37.         $sig .= $this->api_secret;
  38.         $params['sig'] = md5($sig);
  39.         $query = $this->api_url.'?'.$this->params($params);
  40.         $res = file_get_contents($query);
  41.         return json_decode($res, true);
  42.     }
  43.    
  44.     function params($params) {
  45.         $pice = array();
  46.         foreach($params as $k=>$v) {
  47.             $pice[] = $k.'='.urlencode($v);
  48.         }
  49.         return implode('&',$pice);
  50.     }
  51. }
  52. ?>
  53.  



8. Файл с кодом JavaScript - code.js

Файл надо положить в папку js.
  1. $(document).ready(function(){
  2. var viewer_id;
  3. var auth_key;
  4. var wasPayBox = false; // было открыто окно "Внесите 1 голос", при нажатии на кнопку "Добавить"
  5.  
  6.     VK.init(function() {
  7.         VK.loadParams(document.location.href);
  8.         viewer_id = VK.params.viewer_id;
  9.         auth_key = VK.params.auth_key;
  10.         updateUsers();
  11.     });
  12.  
  13.  
  14.  
  15. // обновление последних пользователей
  16. function updateUsers() {
  17.     $('#loader').show();
  18.     $.post('https://flapps.ru/apps/vip/getuids.php', { "viewer_id": viewer_id, "auth_key": auth_key },
  19.                         function(data){
  20.                             if (data.response) {
  21.                                 // из полученного списка uid получаем профили
  22.                                 var uidsVip = data.response;
  23.                                 VK.api("getProfiles", {uids:uidsVip,fields:"photo"}, function(data) {
  24.                                     // количество полученных профилей
  25.                                     var count = data.response.length;
  26.                                     var usersListHtml = '';
  27.                                     for(var i=0;i<count;i++){
  28.                                         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>';
  29.                                     }
  30.                                     $('#users').html(usersListHtml);
  31.                                 });
  32.                                
  33.                                
  34.                                                    
  35.                             }
  36.                             $('#loader').fadeOut(1000);
  37.                         }, "json");
  38. }
  39.  
  40.  
  41.  
  42. // баланс был изменен
  43. VK.addCallback("onBalanceChanged", onBalanceChanged);
  44. function onBalanceChanged(settings) {
  45.     if (wasPayBox) {
  46.         wasPayBox = false;
  47.         $('#add_btn').click();
  48.     }
  49. }
  50.  
  51.  
  52.  
  53. // отправляем на сервер
  54. $('#add_btn').click(function() {
  55.     VK.api("getUserBalance", function(data) {
  56.         // если баланс меньше 1 голоса, то выводим окно "пополнить"
  57.         if (data.response<100) {
  58.             VK.callMethod("showPaymentBox",1);
  59.             wasPayBox = true;
  60.         } else {
  61.                 $('.error').hide();
  62.  
  63.                 $('#loader').show();
  64.                 $.post('https://flapps.ru/apps/vip/add.php', {"viewer_id": viewer_id, "auth_key": auth_key},
  65.                     function(data){
  66.                         if (data.success) {
  67.                             $('.success').html(data.success.msg);
  68.                             $('.error').slideUp();
  69.                             $('.success').slideDown();
  70.                         } else {
  71.                             $('.error').html(data.error.msg);
  72.                             $('.success').slideUp();
  73.                             $('.error').slideDown();
  74.                         }
  75.                         updateUsers();
  76.                     }, "json");
  77.                    
  78.             }
  79.              
  80.              
  81.     });
  82. return false;
  83. });
  84.        
  85. });
  86.  
  87.  
  88.  
  89. /* 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.

За это сообщение автора Александр поблагодарил:
T710MA
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
 
Автор темы
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45
Откуда: Санкт-Петербург
Благодарил (а): 126 раз.
Поблагодарили: 771 раз.

Чтобы убрать блок с рекламой, зарегистрируйтесь на форуме или войдите.

Google
 



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

Сообщение boombast1k » 24 июл 2011, 22:13

УРАААААААААААА!!!! Спасибо большое
Аватара пользователя
boombast1k

 
Сообщения: 332
Зарегистрирован: 23 июн 2011, 07:31
Благодарил (а): 14 раз.
Поблагодарили: 14 раз.

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

Сообщение boombast1k » 24 июл 2011, 22:53

а как сделать чтоб они в строчку вылазили а не в столбик?
Аватара пользователя
boombast1k

 
Сообщения: 332
Зарегистрирован: 23 июн 2011, 07:31
Благодарил (а): 14 раз.
Поблагодарили: 14 раз.

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

Сообщение boombast1k » 25 июл 2011, 00:29

ой все, просто я ступил :oops:
Аватара пользователя
boombast1k

 
Сообщения: 332
Зарегистрирован: 23 июн 2011, 07:31
Благодарил (а): 14 раз.
Поблагодарили: 14 раз.

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

Сообщение $Sasha$ » 09 авг 2011, 20:31

Не робит почему-то.
Всё время крутится прелоадер.
$Sasha$

 
Сообщения: 47
Зарегистрирован: 06 авг 2011, 20:07
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

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

Сообщение Александр » 09 авг 2011, 20:33

$Sasha$
В Charles что видишь?
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
 
Автор темы
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45
Откуда: Санкт-Петербург
Благодарил (а): 126 раз.
Поблагодарили: 771 раз.

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

Сообщение $Sasha$ » 09 авг 2011, 20:35

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

я сменил платформу прилы и забыл поменять api_id & secret_key
$Sasha$

 
Сообщения: 47
Зарегистрирован: 06 авг 2011, 20:07
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

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

Сообщение 12funteam89 » 12 сен 2011, 19:13

Все время грузиться прелоадер, в чем проблема?
charles посмотрел вроде все норм.
Изображение
Аватара пользователя
12funteam89

 
Сообщения: 99
Зарегистрирован: 29 окт 2010, 15:34
Откуда: Санкт-Петербург
Благодарил (а): 4 раз.
Поблагодарили: 2 раз.

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

Сообщение Александр » 13 сен 2011, 22:29

12funteam89
Напиши ссылку на приложение.
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
 
Автор темы
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45
Откуда: Санкт-Петербург
Благодарил (а): 126 раз.
Поблагодарили: 771 раз.

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

Сообщение kirikfas » 27 сен 2011, 18:10

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

 
Сообщения: 46
Зарегистрирован: 17 июн 2011, 08:39
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

След.

Вернуться в Неактуальные уроки (API 2.0 и устаревшие методы)



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron