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

Готовые уроки IFrame + ВКонтакте API
Ответить
Аватара пользователя
12funteam89
Сообщения: 99
Зарегистрирован: 29 окт 2010, 15:34

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

Сообщение 12funteam89 »

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

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

Код: Выделить всё

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. Файл главной страницы приложения index.html

Код: Выделить всё

<html><head><link rel="stylesheet" href="css/style.css" type="text/css" /> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script><script src="js/code.js" type="text/javascript"></script><script src="http://vkontakte.ru/js/api/xd_connection.js?2" type="text/javascript"></script></head><body><div id="loader" style="display:none;"><img src="http://vk.com/images/upload.gif" alt="" width="32" height="8" border="0" /></div>  <div id="users"></div><a href="#" id="add_btn" title="">Добавить</a><div class="error" style="display:none;"></div><div class="success" style="display:none;"></div><br /><br /><a href="http://flapps.ru">flapps.ru</a></body></html>
4. Файл оформления приложения style.css

Код: Выделить всё

body {    padding:10px;    border:1px solid #DAE1E8;    font-family: tahoma, arial, verdana, sans-serif, Lucida Sans;    font-size: 11px;    background:#fff;}a:hover {    text-decoration:underline;} .success {    background-color: #EFFFE8;    border: 1px solid #9BE888;    font-size: 11px;    margin: 8px;    padding: 8px 11px;}.error {    background-color: #FFEFE8;    border: 1px solid #E89B88;    font-size: 11px;    margin: 8px;    padding: 8px 11px;}#add_btn {    display:block;    clear:both;}.user_block {    border:1px solid #DAE1E8;    background:#F7F7F7;    text-align:center;    padding:5px;    margin:7px;    width:68px;    height:79px;    float:left;}.user_block a{    font-family: tahoma, arial, verdana, sans-serif, Lucida Sans;    font-size: 11px;    color:#2B587A;    text-decoration:none;}  /* CSS for Ajax Loader */#loader {    width: 100%;    height: 100%;    position: fixed;    text-align: center;    z-index: 1000;    background-color: #fff;    opacity: 0.80;} #loader img{    position: absolute;    left: 50%;    top: 50%;    margin: -40px 0 0 -40px;}  /* http://flapps.ru */
5. Файл добавления пользователя в базу - add.php

Код: Выделить всё

 <?phpheader('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);                                   $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 { // ошибка            echo '{"error":{"msg":"'.$t.'"}}';    }} // конец проверки auth_keyelse {    echo '{"error":{"msg":"Ошибка безопасности!"}}';} /* http://flapps.ru */?>
6. Файл получения id пользователей из базы, для вывода в приложении - getuids.php

Код: Выделить всё

<?phpheader('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_keyelse {    echo '{"error":{"msg":"Ошибка безопасности!"}}';} /* http://flapps.ru */ ?>
7. Содержимое файла 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);    }}?>

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

Код: Выделить всё

$(document).ready(function(){var viewer_id;var auth_key;     VK.init(function() {        VK.loadParams(document.location.href);        viewer_id = VK.params.viewer_id;        auth_key = VK.params.auth_key;        updateUsers();    });   // обновление последних пользователейfunction updateUsers() {  $('#loader').show();    $.post('http://вашсайт/getuids.php', { "viewer_id": viewer_id, "auth_key": auth_key },                         function(data){                            if (data.response) {                                // из полученного списка uid получаем профили                                var uidsVip = data.response;                                VK.api("getProfiles", {uids:uidsVip,fields:"photo"}, function(data) {                                    // количество полученных профилей                                    var count = data.response.length;                                    var usersListHtml = '';                                    for(var i=0;i<count;i++){                                        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>';                                    }                                    $('#users').html(usersListHtml);                                });                                                                                                                                             }                            $('#loader').fadeOut(1000);                        }, "json");}       function order() {    var params = {      type: 'item',      item: 'item1'    };    VK.callMethod('showOrderBox', params);  }   var callbacksResults = document.getElementById('callbacks');     VK.addCallback('onOrderSuccess', function(order_id) {      $('#loader').show();    $.post('http://вашсайт/add.php', {"viewer_id": viewer_id, "auth_key": auth_key},                    function(data){                        if (data.success) {                            $('.success').html(data.success.msg);                            $('.error').slideUp();                            $('.success').slideDown();                        } else {                            $('.error').html(data.error.msg);                            $('.success').slideUp();                            $('.error').slideDown();                        }                        updateUsers();                    }, "json");                                                                                                                                                      });  VK.addCallback('onOrderFail', function() {    callbacksResults.innerHTML += '<br />onOrderFail';  });  VK.addCallback('onOrderCancel', function() {    callbacksResults.innerHTML += '<br />onOrderCancel';  });  $('#add_btn').click(function() { order(); }); }); 
9. Файл payment.php
В настройках платежей приложения указываем путь к этому файлу.

Код: Выделить всё

 <?php header("Content-Type: application/json; encoding=utf-8");  $secret_key = '    '; // Защищенный ключ приложения  $input = $_POST;  // Проверка подписи $sig = $input['sig']; unset($input['sig']); ksort($input); $str = ''; foreach ($input as $k => $v) {   $str .= $k.'='.$v; }  if ($sig != md5($str.$secret_key)) {   $response['error'] = array(     'error_code' => 10,     'error_msg' => 'Несовпадение вычисленной и переданной подписи запроса.',     'critical' => true   ); } else {   // Подпись правильная   switch ($input['notification_type']) {     case 'get_item':       // Получение информации о товаре       $item = $input['item']; // наименование товара  if ($item == 'item1') {         $response['response'] = array(           'item_id' => 25,           'title' => 'Статус VIP',           'photo_url' => 'ссылка к картинке',           'price' => 1         );       }  else {         $response['error'] = array(           'error_code' => 20,           'error_msg' => 'Товара не существует.',           'critical' => true         );       }       break;  case 'get_item_test':       // Получение информации о товаре в тестовом режиме       $item = $input['item'];       if ($item == 'item1') {         $response['response'] = array(           'item_id' => 125,           'title' => 'Статус VIP',           'photo_url' => 'ссылка к картинке',           'price' => 1         );       } else {         $response['error'] = array(           'error_code' => 20,           'error_msg' => 'Товара не существует.',           'critical' => true         );       }       break;  case 'order_status_change':       // Изменение статуса заказа       if ($input['status'] == 'chargeable') {         $order_id = intval($input['order_id']);  // Код проверки товара, включая его стоимость         $app_order_id = 1; // Получающийся у вас идентификатор заказа. $response['response'] = array(           'order_id' => $order_id,           'app_order_id' => $app_order_id,         );       } else {         $response['error'] = array(           'error_code' => 100,           'error_msg' => 'Передано непонятно что вместо chargeable.',           'critical' => true         );       }       break;  case 'order_status_change_test':       // Изменение статуса заказа в тестовом режиме       if ($input['status'] == 'chargeable') {         $order_id = intval($input['order_id']);  $app_order_id = 1; // Тут фактического заказа может не быть - тестовый режим.  $response['response'] = array(           'order_id' => $order_id,           'app_order_id' => $app_order_id,         );       } else {         $response['error'] = array(           'error_code' => 100,           'error_msg' => 'Передано непонятно что вместо chargeable.',           'critical' => true         );       }       break;   } }  echo json_encode($response); ?> 
Знаю что присутствует лишний код, но главное что работает)
Грачик
Сообщения: 162
Зарегистрирован: 08 фев 2013, 16:04

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

Сообщение Грачик »

не работает. я что то не вижу кода в payment.php который добавлял бы значения в бд. Мне кажется поэтому не работает!
Грачик
Сообщения: 162
Зарегистрирован: 08 фев 2013, 16:04

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

Сообщение Грачик »

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

спасибо
IndieGD
Сообщения: 124
Зарегистрирован: 28 май 2013, 19:20

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

Сообщение IndieGD »

Мда, урок конечно замечательный, стоит мне только вбить в адресной строке

Код: Выделить всё

http://адрес_вашего_приложения/add.php?viewer_id=мой_id&auth_key=мой_auth_key
и я стану VIP-ом бесплатно)
Evegeniy
Сообщения: 51
Зарегистрирован: 21 фев 2013, 16:49

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

Сообщение Evegeniy »

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