VIP в IFrame-приложении ( Payments API - новая платёжка)

Готовые уроки IFrame + ВКонтакте API

VIP в IFrame-приложении ( Payments API - новая платёжка)

Сообщение 12funteam89 » 21 июн 2013, 15:20

Просил помощи на форуме что бы помогли переделать старый урок под новую платежку, так и не дождался. Решил все сам наковырять)
Вот выкладываю, может кому пригодится.
Изображение

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

  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. /* http://flapps.ru */
  18. ?>


Конечно же заменяя данные на свои.

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

  1. <html>
  2. <head>
  3. <link rel="stylesheet" href="css/style.css" type="text/css" />
  4.  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></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="http://flapps.ru">flapps.ru</a>
  17. </body>
  18. </html>


4. Файл оформления приложения style.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. /* http://flapps.ru */


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


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

  1. <?php
  2. header('Content-Type: application/json; charset=utf-8');
  3. include('settings.php');
  4.  
  5. $viewer_id = $_REQUEST['viewer_id'];
  6. $auth_key = $_REQUEST['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. /* http://flapps.ru */
  29.  
  30. ?>


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. ?>


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

  1. $(document).ready(function(){
  2. var viewer_id;
  3. var auth_key;
  4.  
  5.     VK.init(function() {
  6.         VK.loadParams(document.location.href);
  7.         viewer_id = VK.params.viewer_id;
  8.         auth_key = VK.params.auth_key;
  9.         updateUsers();
  10.     });
  11.  
  12.  
  13.  
  14. // обновление последних пользователей
  15. function updateUsers() {
  16.   $('#loader').show();
  17.     $.post('http://вашсайт/getuids.php', { "viewer_id": viewer_id, "auth_key": auth_key },
  18.  
  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 + '" target="_blank"><img src="' + data.response[i].photo + '" /></a><a href="http://vk.com/id' + data.response[i].uid + '"target="_blank">' + 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.  
  44.   function order() {
  45.     var params = {
  46.       type: 'item',
  47.       item: 'item1'
  48.     };
  49.     VK.callMethod('showOrderBox', params);
  50.   }
  51.  
  52.   var callbacksResults = document.getElementById('callbacks');
  53.  
  54.  
  55.   VK.addCallback('onOrderSuccess', function(order_id) {
  56.  
  57.  
  58.   $('#loader').show();
  59.     $.post('http://вашсайт/add.php', {"viewer_id": viewer_id, "auth_key": auth_key},
  60.                     function(data){
  61.                         if (data.success) {
  62.                             $('.success').html(data.success.msg);
  63.                             $('.error').slideUp();
  64.                             $('.success').slideDown();
  65.                         } else {
  66.                             $('.error').html(data.error.msg);
  67.                             $('.success').slideUp();
  68.                             $('.error').slideDown();
  69.                         }
  70.                         updateUsers();
  71.                     }, "json");
  72.                    
  73.    
  74.                    
  75.                    
  76.                    
  77.                    
  78.                    
  79.                    
  80.    
  81.   });
  82.   VK.addCallback('onOrderFail', function() {
  83.     callbacksResults.innerHTML += '<br />onOrderFail';
  84.   });
  85.   VK.addCallback('onOrderCancel', function() {
  86.     callbacksResults.innerHTML += '<br />onOrderCancel';
  87.   });
  88.  
  89.  $('#add_btn').click(function() {
  90.  order();
  91.  });
  92.  });
  93.  


9. Файл payment.php
В настройках платежей приложения указываем путь к этому файлу.
  1.  
  2. <?php
  3. header("Content-Type: application/json; encoding=utf-8");
  4.  
  5. $secret_key = '    '; // Защищенный ключ приложения
  6.  
  7. $input = $_POST;
  8.  
  9. // Проверка подписи
  10. $sig = $input['sig'];
  11. unset($input['sig']);
  12. ksort($input);
  13. $str = '';
  14. foreach ($input as $k => $v) {
  15.   $str .= $k.'='.$v;
  16. }
  17.  
  18. if ($sig != md5($str.$secret_key)) {
  19.   $response['error'] = array(
  20.     'error_code' => 10,
  21.     'error_msg' => 'Несовпадение вычисленной и переданной подписи запроса.',
  22.     'critical' => true
  23.   );
  24. } else {
  25.   // Подпись правильная
  26.   switch ($input['notification_type']) {
  27.     case 'get_item':
  28.       // Получение информации о товаре
  29.       $item = $input['item']; // наименование товара
  30.  
  31. if ($item == 'item1') {
  32.         $response['response'] = array(
  33.           'item_id' => 25,
  34.           'title' => 'Статус VIP',
  35.           'photo_url' => 'ссылка к картинке',
  36.           'price' => 1
  37.         );
  38.       }  else {
  39.         $response['error'] = array(
  40.           'error_code' => 20,
  41.           'error_msg' => 'Товара не существует.',
  42.           'critical' => true
  43.         );
  44.       }
  45.       break;
  46.  
  47. case 'get_item_test':
  48.       // Получение информации о товаре в тестовом режиме
  49.       $item = $input['item'];
  50.       if ($item == 'item1') {
  51.         $response['response'] = array(
  52.           'item_id' => 125,
  53.           'title' => 'Статус VIP',
  54.           'photo_url' => 'ссылка к картинке',
  55.           'price' => 1
  56.         );
  57.       } else {
  58.         $response['error'] = array(
  59.           'error_code' => 20,
  60.           'error_msg' => 'Товара не существует.',
  61.           'critical' => true
  62.         );
  63.       }
  64.       break;
  65.  
  66. case 'order_status_change':
  67.       // Изменение статуса заказа
  68.       if ($input['status'] == 'chargeable') {
  69.         $order_id = intval($input['order_id']);
  70.  
  71. // Код проверки товара, включая его стоимость
  72.         $app_order_id = 1; // Получающийся у вас идентификатор заказа.
  73.  
  74. $response['response'] = array(
  75.           'order_id' => $order_id,
  76.           'app_order_id' => $app_order_id,
  77.         );
  78.       } else {
  79.         $response['error'] = array(
  80.           'error_code' => 100,
  81.           'error_msg' => 'Передано непонятно что вместо chargeable.',
  82.           'critical' => true
  83.         );
  84.       }
  85.       break;
  86.  
  87. case 'order_status_change_test':
  88.       // Изменение статуса заказа в тестовом режиме
  89.       if ($input['status'] == 'chargeable') {
  90.         $order_id = intval($input['order_id']);
  91.  
  92. $app_order_id = 1; // Тут фактического заказа может не быть - тестовый режим.
  93.  
  94. $response['response'] = array(
  95.           'order_id' => $order_id,
  96.           'app_order_id' => $app_order_id,
  97.         );
  98.       } else {
  99.         $response['error'] = array(
  100.           'error_code' => 100,
  101.           'error_msg' => 'Передано непонятно что вместо chargeable.',
  102.           'critical' => true
  103.         );
  104.       }
  105.       break;
  106.   }
  107. }
  108.  
  109. echo json_encode($response);
  110. ?>


Знаю что присутствует лишний код, но главное что работает)
Изображение

За это сообщение автора 12funteam89 поблагодарили - 2:
Koval, Грачик
Аватара пользователя
12funteam89

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

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

Google
 



Re: VIP в IFrame-приложении ( Payments API - новая платёжка)

Сообщение Грачик » 06 июл 2013, 16:40

не работает. я что то не вижу кода в payment.php который добавлял бы значения в бд. Мне кажется поэтому не работает!
Грачик

 
Сообщения: 162
Зарегистрирован: 08 фев 2013, 16:04
Благодарил (а): 21 раз.
Поблагодарили: 1 раз.

Re: VIP в IFrame-приложении ( Payments API - новая платёжка)

Сообщение Грачик » 06 июл 2013, 17:30

Простите всё работает. моя вина!

спасибо
Грачик

 
Сообщения: 162
Зарегистрирован: 08 фев 2013, 16:04
Благодарил (а): 21 раз.
Поблагодарили: 1 раз.

Re: VIP в IFrame-приложении ( Payments API - новая платёжка)

Сообщение IndieGD » 06 июл 2013, 17:59

Мда, урок конечно замечательный, стоит мне только вбить в адресной строке
  1. http://адрес_вашего_приложения/add.php?viewer_id=мой_id&auth_key=мой_auth_key

и я стану VIP-ом бесплатно)
IndieGD

 
Сообщения: 124
Зарегистрирован: 28 май 2013, 19:20
Благодарил (а): 1 раз.
Поблагодарили: 34 раз.

Re: VIP в IFrame-приложении ( Payments API - новая платёжка)

Сообщение Evegeniy » 06 июл 2013, 18:20

Буду кэпом но все же. В коде уязвимость и IndieGD прав. Не используйте такую систему у себя :)
Evegeniy

 
Сообщения: 51
Зарегистрирован: 21 фев 2013, 16:49
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.


Вернуться в Уроки IFrame ВКонтакте



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

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