Списывание голосов

Темы только для ознакомления. Уроки по использованию старой версии ВКонтакте API и устаревших методов.
Аватара пользователя
ukhov
Модератор
Модератор
Сообщения: 1343
Зарегистрирован: 04 янв 2011, 21:19

Списывание голосов

Сообщение ukhov »

Списывание голосов с баланса пользователя — secure.withdrawVotes

ВНИМАНИЕ! В методах ВКонтакте API произошли изменения.
С 1 ноября 2012 года методы getUserBalance, secure.getBalance и secure.withdrawVotes будут отключены.
Используйте актуальный способ - Payments API.


Данный урок похож на тот, который был представлен в http://flapps.ru/forum/topic1173.html.
Но он использует класс работы с VK API и записывает все данные о списывании в базу MySQL.
Изображение
1.Идём в phpMyAdmin и выполняем SQL-запрос:

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

 ---- Структура таблицы `table_counter`-- CREATE TABLE IF NOT EXISTS `table_counter` (  `user_id` int(11) NOT NULL COMMENT 'ID пользователя ВКонтакте',  `votes` int(11) NOT NULL COMMENT 'Количество голосов, которое было списано с пользователя за всё время') ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Счётчик списываний голосов ВКонтакте'; -- -------------------------------------------------------- ---- Структура таблицы `table_log`-- CREATE TABLE IF NOT EXISTS `table_log` (  `user_id` int(11) NOT NULL COMMENT 'ID пользователя ВКонтакте',  `date` int(11) NOT NULL COMMENT 'Дата списывания голосов',  `user_ip` varchar(15) NOT NULL COMMENT 'IP пользователя',  `votes` int(11) NOT NULL COMMENT 'Количество списанных голосов') ENGINE=MyISAM DEFAULT CHARSET=utf8;
Если слова «phpMyAdmin» и «SQL» Вы слышите впервые, то смотрите ответ в вопросах в конце этой темы.

2. Заливаем файлы и задаём значения переменным
Внимание! Необходимо указать данные для работы скрипта. ВСЕ ДАННЫЕ НАХОДЯТСЯ В НАЧАЛЕ ФАЙЛА INDEX.PHP

Если у Вас нет класса для работы с API ВКонтакте, или он отличается от данного, то подключите его:

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);    }}?> 
index.php

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

<?php /*Разработка 3APPS.RU © 2012*/ $vk_api['cfn'] = "vkapi.class.php"; // имя файла с классами /* Данные о приложении */$vk_api['id'] = 1; // вместо единицы ставим id своего приложения$vk_api['key'] = "qwerty123"; // вместо этого ставим защитный ключ своего приложения/* Данные о приложении */ /* Данные MySQL */$db['hostname'] = "localhost"; // mysql host$db['username'] = ""; // имя пользователя (логин) mysql$db['password'] = ""; // пароль пользователя mysql$db['name'] = ""; // имя базы данных mysql/* Данные MySQL */ /* Данные о пользователе */$vk_api['uid'] = 1; // вместо этого ставим id пользователя вконтакте, с которого надо списать голоса/* Данные о пользователе */ /* Количество голосов */$vk_api['votes'] = 100; // вместо этого ставим сотые доли голоса (если нужно снять 1 голос, то ставим 100, а если 3 - то 300)/* Количество голосов */ /* Статистика */$stat = 1; // если равно 1, то все данные по списывание голосов будут заноситься в базу данных$stat_logs = 1; // если равно 1, то кроме счётчика списываний, будет заноситься дата, время списывания и ip пользователя/* Статистика */ /* Таблицы для логов */$mysql['table_counter'] = "vkapi_votes_counter"; // название таблицы со счётчиком списываний$mysql['table_log'] = "vkapi_votes_log"; // название таблицы с логами списываний/* Таблицы для логов */ /* Действия при успешном списывании голосов */$success['redirect'] = "success.php"; // адрес страницы, на которую система перенаправит пользователя в случае успешного списывания голосов; оставьте поле пустым, если не желаете этого делать/* Действия при успешном списывании голосов */ /* Действия при ошибках */$error['n_votes_u'] = "n_votes.php"; // адрес страницы, на которую система перенаправит пользователя в случае ошибки списывания голосов/* Действия при ошибках */  require ($vk_api['cfn']); // подключаем файл с классами     $timestamp = time()+300;    $rand = rand(); $VK = new vkapi($vk_api['id'], $vk_api['key']);$resp = $VK->api('secure.withdrawVotes', array('timestamp'=>$timestamp,'random'=>$rand,'uid'=>$vk_api['uid'],'votes'=>$vk_api['votes'])); $vk_api['result'] = $resp['response']; if($vk_api['result'] > 0) {if($vk_api['uid']) {if($vk_api['votes']) { if($stat) { MYSQL_CONNECT($db['hostname'],$db['username'],$db['password']) OR DIE("MySQL Error [connection] (error_code: 1)");mysql_select_db($db['name']) or die("MySQL Error [selecting database] (error_code: 2)"); $db_query_check = mysql_query("SELECT * FROM `".$mysql['table_counter']."` WHERE `user_id` = '".$vk_api['uid']."'"); if($db_query_check) {$db_query = mysql_query("UPDATE `".$mysql['table_counter']."` SET `votes` = `votes` + ".$vk_api['votes']." WHERE `user_id` = '".$vk_api['uid']."';");} else {$db_query = mysql_query("INSERT INTO `".$mysql['table_counter']."` VALUES (".$vk_api['uid'].", ".$votes.");");} if(!$db_query) {echo("<b>Внимание! Произошла ошибка DB при создании логов [1] (error_code: 3)</b>");}  if($stat_logs) { $date = date("d.m.Y H:i:s");$date_unix = strtotime($date);$u_ip = $_SERVER['REMOTE_ADDR']; $db_query = mysql_query("INSERT INTO `".$mysql['table_log']."` VALUES (".$vk_api['uid'].", ".$date_unix.", '".$u_ip."', ".$votes.");"); if(!$db_query) {echo("<b>Внимание! Произошла ошибка DB при создании логов [2] (error_code: 4)</b>");} } } if($success['redirect']) {header("Location: ".$success['redirect']);} } else {echo("<b>Внимание! Не указано количество голосов. (error_code: 6)</b>");} } else {echo("<b>Внимание! Не указан ID пользователя ВКонтакте. (error_code: 5)</b>");} } else { if($error['n_votes_u']) {header("Location: ".$error['n_votes_u']);} else {echo("<b>Внимание! Произошла ошибка списывания голосов. (error_code: 7)</b>");} }?>
success.php

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

<h3>Поздравляем!</h3><b>Спасибо!</b>. Голоса были успешно списаны с Вашего счёта.
n_votes.php

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

<h3>Ошибка!</h3>Ошибка при списывании голосов.
Вопросы и ответы

Пишет ошибку «MySQL Error [connection] (error_code: 1)». Что делать?
 Ответ
Проверьте правильность введённых данных MySQL (имя пользователя (логин), его пароль и host)
Пишет ошибку «MySQL Error [selecting database] (error_code: 2)». Что делать?
 Ответ
Проверьте правильность введённых данных MySQL (имя базы данных)
Пишет ошибку «Внимание! Произошла ошибка DB при создании логов [1] (error_code: 3)». Что делать?
 Ответ
Проверьте переменную $mysql['table_counter']. Возможно, она не имеет значения
Пишет ошибку «Внимание! Произошла ошибка DB при создании логов [2] (error_code: 4)». Что делать?
 Ответ
Проверьте переменную $mysql['table_log']. Возможно, она не имеет значения
Пишет ошибку «Внимание! Не указан ID пользователя ВКонтакте. (error_code: 5)». Что делать?
 Ответ
Проверьте переменную $vk_api['uid']. Возможно, она не имеет значения. В ней Вы должны прописать ID пользователя ВКонтакте.
Пишет ошибку «Внимание! Не указано количество голосов. (error_code: 6)». Что делать?
 Ответ
Проверьте переменную $vk_api['votes']. Возможно, она не имеет значения. В ней Вы должны прописать количество сотых долей голоса для списывания.
Пишет ошибку «Внимание! Произошла ошибка списывания голосов. (error_code: 7)». Что делать?
 Ответ
Проверьте данные приложения (id и защитный ключ). Возможно, у пользователя на счету нет голосов, и/или приложение не одобрено администрацией сайта ВКонтакте.ру
Как выполнить SQL-запрос, что такое «phpMyAdmin»?
 Ответ
Узнайте адрес phpMyAdmin у вашего хостера, перейдите по указанной ссылке, укажите имя пользователя (логин) MySQL и его пароль.
Если Вы не дружите с phpMyAdmin, то делаем следующее:
Создаём файл sql.php и запускаем его:

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

<?php /* Данные MySQL */$db['hostname'] = "localhost"; // mysql host$db['username'] = ""; // имя пользователя (логин) mysql$db['password'] = ""; // пароль пользователя mysql$db['name'] = ""; // имя базы данных mysql/* Данные MySQL */ MYSQL_CONNECT($db['hostname'],$db['username'],$db['password']) OR DIE("MySQL Error [connection] (error_code: 1)");mysql_select_db($db['name']) or die("MySQL Error [selecting database] (error_code: 2)"); $query = " ---- Структура таблицы `table_counter`-- CREATE TABLE IF NOT EXISTS `table_counter` (  `user_id` int(11) NOT NULL COMMENT 'ID пользователя ВКонтакте',  `votes` int(11) NOT NULL COMMENT 'Количество голосов, которое было списано с пользователя за всё время') ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Счётчик списываний голосов ВКонтакте'; -- -------------------------------------------------------- ---- Структура таблицы `table_log`-- CREATE TABLE IF NOT EXISTS `table_log` (  `user_id` int(11) NOT NULL COMMENT 'ID пользователя ВКонтакте',  `date` int(11) NOT NULL COMMENT 'Дата списывания голосов',  `user_ip` varchar(15) NOT NULL COMMENT 'IP пользователя',  `votes` int(11) NOT NULL COMMENT 'Количество списанных голосов') ENGINE=MyISAM DEFAULT CHARSET=utf8;";if(mysql_query($query)) {echo("Всё прошло успешно!");} else {echo("Ошибка SQL!");}?>
Что такое «ID и защитный ключ приложения»?
 Ответ
В панели управления приложением перейдите во вкладку «Настройки».
Изображение
Изображение
hahaha
Сообщения: 86
Зарегистрирован: 04 янв 2012, 14:52

Re: Списывание голосов

Сообщение hahaha »

А что обозначает ошибка?
Parse error: syntax error, unexpected '=' in /var/www/stylepickup/data/www/блаблабла.ru/index.php on line 7
Аватара пользователя
ukhov
Модератор
Модератор
Сообщения: 1343
Зарегистрирован: 04 янв 2011, 21:19

Re: Списывание голосов

Сообщение ukhov »

hahaha писал(а):А что обозначает ошибка?
Parse error: syntax error, unexpected '=' in /var/www/stylepickup/data/www/блаблабла.ru/index.php on line 7
исправил
hahaha
Сообщения: 86
Зарегистрирован: 04 янв 2012, 14:52

Re: Списывание голосов

Сообщение hahaha »

ukhov писал(а):
hahaha писал(а):А что обозначает ошибка?
Parse error: syntax error, unexpected '=' in /var/www/stylepickup/data/www/блаблабла.ru/index.php on line 7
исправил
А в чём была шибка?
Alazaur
Разработчик
Разработчик
Сообщения: 1001
Зарегистрирован: 16 окт 2011, 20:25

Re: Списывание голосов

Сообщение Alazaur »

Дак там же написано :) Синтаксическая ошибка, неожиданный знак = на строчке 7. Обычно такие ошибки возникают, когда забыл поставить какой-нить символ или наоборот лишний поставил. Бывает когда часто отвлекают от работы, торопишься или мысли левые в голову лезут и сосредоточиться не дают :D
Аватара пользователя
ukhov
Модератор
Модератор
Сообщения: 1343
Зарегистрирован: 04 янв 2011, 21:19

Re: Списывание голосов

Сообщение ukhov »

hahaha писал(а):
ukhov писал(а):
hahaha писал(а):А что обозначает ошибка?
Parse error: syntax error, unexpected '=' in /var/www/stylepickup/data/www/блаблабла.ru/index.php on line 7
исправил
А в чём была шибка?
ошибка была такая:

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

$vk_api['cfn']; = "vkapi.class.php"; // имя файла с классами
а должно быть

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

$vk_api['cfn'] = "vkapi.class.php"; // имя файла с классами
Alazaur
Разработчик
Разработчик
Сообщения: 1001
Зарегистрирован: 16 окт 2011, 20:25

Re: Списывание голосов

Сообщение Alazaur »

ukhov, я угадал :D Возьму с полки пирожок
Аватара пользователя
ukhov
Модератор
Модератор
Сообщения: 1343
Зарегистрирован: 04 янв 2011, 21:19

Re: Списывание голосов

Сообщение ukhov »

Alazaur писал(а):ukhov, я угадал :D Возьму с полки пирожок
Что угадал? Я тоже умею читать предупреждения об ошибках)
Alazaur
Разработчик
Разработчик
Сообщения: 1001
Зарегистрирован: 16 окт 2011, 20:25

Re: Списывание голосов

Сообщение Alazaur »

ukhov, я про лишнюю точку с запятой. :D Загляните пожалуйста в личку
Garch
Сообщения: 186
Зарегистрирован: 27 ноя 2011, 20:49

Re: Списывание голосов

Сообщение Garch »

А почему если даже у меня 0 голосов пишет что успешно списано?
Ответить