С Новым годом! Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.81/64: Рейтинг темы: голосов - 64, средняя оценка - 4.81
81 / 81 / 50
Регистрация: 26.11.2012
Сообщений: 303

Интеграция DLE и UNITPAY (Отправка формы методом POST)

10.11.2014, 21:57. Показов 12926. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Сижу, кручу-верчу у себя движок DLE и систему оплаты UNITPAY.
И собственно возник вопрос.

Описание:
У меня на движке стоит модуль ADDNEWS, с помощью которого пользователь может сам разместить новость на главной странице. Для размещения новости создана страница с формой. Пользователь заполняет информацию, и отправляет форму методом POST (Обработчик addnews.php), и новость собственно попадает в БД.

Есть система Unitpay
Для тех кто не знаком с системой:
Кликните здесь для просмотра всего текста
Сторонняя система оплаты, которая имеет собственную форму для оплаты и соответственно свой обработчик этой формы unitpay.php.
Обработчик передает запись о совершении платежа на сервер unitpay, а с сервера возвращается ответ: SUCCESS или ERROR.


Так вот.
Мне нужна помощь в объединении форм, или указании "как сделать лучше".
Нужно что бы при нажатии на кнопку ДОБАВИТЬ НОВОСТЬ, статья не уходила сразу в БД, а открывалась форма для оплаты UNITPAY, и если UNITPAY вернет ответ SUCCESS то тогда только статья добавиться в базу, а при ответе ERROR статья не добавлялась в БД, а пользователя переадресовывало на другу страницу(о неудачной оплате).

Конец кода обработчика ADDNEWS.PHP
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
$script = "
<script language=\"javascript\" type=\"text/javascript\">
<!--
function preview(){";
        
        if( $config['allow_site_wysiwyg'] == "1" ) {
            
            $script .= "submit_all_data();";
        
        }
        
        $script .= "if(document.entryform.title.value == ''){ DLEalert('$lang[add_err_7]', dle_info); }
    else{
        dd=window.open('','prv','height=600,width=750,resizable=0,scrollbars=1')
        document.entryform.mod.value='preview';document.entryform.action='{$config['http_home_url']}engine/preview.php';document.entryform.target='prv'
        document.entryform.submit();dd.focus()
        setTimeout(\"document.entryform.mod.value='addnews';document.entryform.action='';document.entryform.target='_self'\",500)
    }
}";
        
        $script .= <<<HTML
 
    function reload () {
    
        var rndval = new Date().getTime(); 
    
        document.getElementById('dle-captcha').innerHTML = '<img src="{$path['path']}engine/modules/antibot/antibot.php?rndval=' + rndval + '" width="160" height="80" alt="" /><br /><a onclick="reload(); return false;" href="#">{$lang['reload_code']}</a>';
    
    };
 
    function find_relates ( )
    {
        var title = document.getElementById('title').value;
 
        ShowLoading('');
 
        $.post('engine/ajax/find_relates.php', { title: title, mode: 1 }, function(data){
    
            HideLoading('');
    
            $('#related_news').html(data);
    
        });
 
        return false;
 
    };
 
    function checkxf ( )
    {
 
        var status = '';
 
        {$save}
 
        $('[uid=\"essential\"]:visible').each(function(indx) {
 
            if($.trim($(this).find('[rel=\"essential\"]').val()).length < 1) {
            
                DLEalert('{$lang['addnews_xf_alert']}', dle_info);
 
                status = 'fail';
            
            }
 
        });
 
        if(document.entryform.title.value == ''){
 
            DLEalert('{$lang['add_err_7']}', dle_info); 
 
            status = 'fail';
 
        }
 
        return status;
 
    };
//-->
</script>
HTML;
 
        if( $config['allow_add_tags'] ) {
            $js_array[] = "engine/skins/autocomplete.js";
            $script .= "
<script language=\"javascript\" type=\"text/javascript\">
<!--
    $(function(){
        function split( val ) {
            return val.split( /,\s*/ );
        }
        function extractLast( term ) {
            return split( term ).pop();
        }
 
        $( '#tags' ).autocomplete({
            source: function( request, response ) {
                $.getJSON( 'engine/ajax/find_tags.php', {
                    term: extractLast( request.term )
                }, response );
            },
            search: function() {
                var term = extractLast( this.value );
                if ( term.length < 3 ) {
                    return false;
                }
            },
            focus: function() {
                return false;
            },
            select: function( event, ui ) {
                var terms = split( this.value );
                terms.pop();
                terms.push( ui.item.value );
                terms.push( '' );
                this.value = terms.join( ', ' );
                return false;
            }
        });
 
    });
//-->
</script>";
        }
        
        $script .= "<form method=\"post\" name=\"entryform\" id=\"entryform\" onsubmit=\"if(checkxf()=='fail') return false;\" action=\"\">";
        
        $tpl->copy_template = $categoryfilter . $script . $tpl->copy_template . "<input type=\"hidden\" name=\"mod\" value=\"addnews\" /></form>";
        
        $tpl->compile( 'content' );
        $tpl->clear();
Всем кто поможет + к карме, а если кто поможет основательно, то и плюс в $$$

P\S: Если еще надо какая информация, задавайте вопросы.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.11.2014, 21:57
Ответы с готовыми решениями:

Отправка формы методом post
est obichni form u klienta(page1.asp), kotori submititsa na etu zhe page1.asp. mne nuzhno proverit pravilnost i esli da, to peresubmitit...

Отправка формы методом $.post
Нужно отправить форму методом пост, так собрать все значения не получается: var serialize_arr = form.serializeArray(); ...

Отправка формы методом POST в новое окно
Необходимо отправить форму методом POST в новое окно. Делаю так &lt;FORM id='frm1' name='frm1' method='post' action='page.php'...

39
(ノಠ益ಠ)ノ彡┻━┻
 Аватар для N3stY
152 / 152 / 78
Регистрация: 05.06.2014
Сообщений: 710
Записей в блоге: 2
11.11.2014, 07:22
temkasky, хм, если использовать метод API, то необходимо сделать для пользователя баланс, и перед тем как показать ему кнопку "Добавить новость", он должен его пополнить. Хотя та же история и через форму.

Не по теме:

Я думал API PayPal странный, оказывается это еще цветочки...



Не ясен смысл того зачем им обращаться на прямую к сайту, если достаточно будет отдать GET запрос с сгенерированным ключем(при передаче запроса на unitpa.ru).

Единственный выход что я вижу, это баланс пользователя.
0
81 / 81 / 50
Регистрация: 26.11.2012
Сообщений: 303
11.11.2014, 15:07  [ТС]
N3stY, Все было бы хорошо, и я переписал бы готовые решения под себя. Если бы у меня была регистрация в принципе(

Мой сайт не предусматривает регистрации, все пользователи, это гости. По другому быть не должно, ибо регистрация это лишний гемор.

Есть сайты примеры, на которых сделано это без регистрации.

Добавлено через 19 минут
Есть еще такой вариант,
Сделать так
PHP
1
$script .= "<form method=\"post\" name=\"entryform\" id=\"entryform\" onsubmit=\"if(checkxf()=='fail') return false;\" action=\"unitpay.php\">";
Так как unitpay передает данные на сервер в формате json, то назревает вопрос.

Можно ли передать на сервер unitpay, отдельные строки из формы Addnews
0
(ノಠ益ಠ)ノ彡┻━┻
 Аватар для N3stY
152 / 152 / 78
Регистрация: 05.06.2014
Сообщений: 710
Записей в блоге: 2
11.11.2014, 20:24
temkasky, насколько я понял из доков, то кроме того что есть не передашь. В таком случае нужно смотреть в сторону других платежек. Или же хранить все данные в сессии.
0
81 / 81 / 50
Регистрация: 26.11.2012
Сообщений: 303
11.11.2014, 21:18  [ТС]
N3stY,
В смысле, нельзя передать отдельные данные формы?

Например:
HTML5
1
2
3
4
5
6
7
<form action="handler.php">
   <input type="radio" name="answer" value="a1">
   <input type="radio" name="answer" value="a2">
   <input type="radio" name="answer" value="a3">
   <input type="radio" name="answer" value="a4">
   <input type="submit">
</form>
передать обработчику только данные а2 и а4
0
(ノಠ益ಠ)ノ彡┻━┻
 Аватар для N3stY
152 / 152 / 78
Регистрация: 05.06.2014
Сообщений: 710
Записей в блоге: 2
11.11.2014, 21:38
Можно сделать следующим образом, добавить таблицу например dle_post_topay, заносить в нее новость, а unitpay передавать ключь этой новости, после того как к обработчику поступят данные о том что счет оплачен, новость переносить в таблицу dle_post.
0
81 / 81 / 50
Регистрация: 26.11.2012
Сообщений: 303
11.11.2014, 23:00  [ТС]
Цитата Сообщение от temkasky Посмотреть сообщение
Всем кто поможет + к карме, а если кто поможет основательно, то и плюс в $$$

P\S: Если еще надо какая информация, задавайте вопросы.
N3stY, хмм, очень интересный вариант, не приходило такого в голову. Поможете?

Добавлено через 1 час 17 минут
N3stY, нашел интересную статейку

Слежение за изменениями данных в MySQL при помощи PHP

Кликните здесь для просмотра всего текста

А что если к такой замечательной возможности MySQL как создание триггеров, способных записывать старые и новые значения данных при вставке, изменении и удалении записей добавить информацию, которой обладает php скрипт?

Триггеры MySQL знают:
  • момент в который происходит изменение
  • старое и новое значение

PHP знает:
  • кто в данный момент залогинен
  • какая страница открыта, с какой перешли
  • бравзер
  • IP адрес
  • POST, GET
  • Cookie

Каким же способом можно умудриться записать всю необходимую информацию?

Воспользуемся особенностями PHP и MySQL!

MySQL умеет создавать временные таблицы, которые живут только пока коннект к бд не закроется, а PHP как раз при открытии каждой страницы — создаёт новый коннект (в абсолютном большинстве конфигураций вебсервера и php).

Таким образом, если триггер будет писать ещё и во временную таблицу — мы сможем узнать кто или что в ответе за конкретные изменения.

Чуть подробнее — мы можем вначале страницы создавать временную таблицу, если триггер срабатывает, он записывает информацию в таблицу предназначенную для слежения за данными, а айдишники, которые возвращает last_insert_id() записывать во временную таблицу. При завершении работы обращаемся к временной таблице, и если она не пуста — записываем в таблицу изменений всё что хотим из того что знает загруженная PHP страница.

Далее — вариант реализации.

1) Начнём с временной таблицы — мы можем её создавать, когда триггер выполняется на странице в первый раз! Для этого нужно всего лишь написать CREATE TEMPORARY TABLE temp_watch_changes IF NOT EXISTS. Есть только небольшая проблема — в текущих версиях MySQL невозможно узнать существует ли временная таблица каким-либо запросом. Поэтому, она обязательно должна быть создана, чтобы не было ошибки, когда через php мы будем выбирать значения.

Мы может потрюкачить, а можем всё сделать прямолинейно.

В качестве небольшого трюка — в MySQL может одновременно существовать таблица обычная и временная с одинаковым именем. Если есть временная — то будет использоваться именно она. И каждый раз из пхп проверяя есть ли записи внутри таблицы temp_watch_changes там будет либо пусто, либо айдишники записанные триггером и никаких ошибок.

Более прямолинейный метод — просто создавать временную таблицу каждый раз при загрузке страницы. На нашем сервере это занимает 0.0008 секунд, что впринципе приемлемо

MySQL
1
CREATE TEMPORARY TABLE temp_watch_changes ( id_change INTEGER NOT NULL )
2) Создаём таблицу, содержащую сами изменения
MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE TABLE `watch_changes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `table_name` varchar(255) DEFAULT NULL,
  `column_name` varchar(255) DEFAULT '',
  `key_name` varchar(255) DEFAULT NULL,
  `key_value` varchar(1000) DEFAULT NULL,
  `old_value` text,
  `new_value` text,
  `type` enum('insert','update','delete') DEFAULT 'update',
  `date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `ip` varchar(255) DEFAULT NULL,
  `id_user` int(11) DEFAULT '0',
  `user_email` varchar(255) DEFAULT '',
  `post` text,
  `get` text,
  `session` text,
  `server` text,
  `user_agent` varchar(1000) DEFAULT '',
  `url` text,
  `referer` text,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
3) Создаём триггер. Выяснить, можно ли динамически использовать названия колонок в триггерах — не удалось. Наверное, просто нельзя, но нам это не сильно и нужно. Ведь есть PHP.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
function createWatchTrigger($table,$columns,$primaryKey){
        if(!is_array($primaryKey)){
            $primaryKey=array($primaryKey);
        }
        $types=array('update','insert','delete');
        foreach($types as $type){
            db::$used->internalQuery("drop trigger IF EXISTS {$table}_t_$type");
 
            $triggerContent="CREATE TRIGGER {$table}_t_$type
                AFTER $type ON {$table}
                FOR EACH ROW
                BEGIN
                    CREATE TEMPORARY TABLE IF NOT EXISTS temp_watch_changes (
                        id_change           INTEGER NOT  NULL
                    );
                ";
            foreach($columns as $columnTitle){
                if($type=='update'){
                    $triggerContent.="
                    IF NEW.{$columnTitle} != OLD.$columnTitle
                    THEN ";
                }
                $triggerContent.="INSERT INTO watch_changes (table_name,column_name,old_value,new_value,type,key_name,key_value) ";
                if($type=='insert'){
                    $triggerContent.="VALUES('{$table}','$columnTitle','', NEW.$columnTitle,'$type','".implode(',',$primaryKey)."',CONCAT('',NEW.".implode(",',',NEW.",$primaryKey)."));";
                }else if($type=='update'){
                    $triggerContent.="VALUES('{$table}','$columnTitle',OLD.$columnTitle, NEW.$columnTitle,'$type','".implode(',',$primaryKey)."',CONCAT('',NEW.".implode(",',',NEW.",$primaryKey)."));";
                }else if($type=='delete'){
                    $triggerContent.="VALUES('{$table}','$columnTitle',OLD.$columnTitle,'','$type','".implode(',',$primaryKey)."',CONCAT('',OLD.".implode(",',',OLD.",$primaryKey)."));";
                }
                $triggerContent.="
                set @last_id=last_insert_id();
                INSERT INTO temp_watch_changes (id_change) values (@last_id);";
 
                if($type=='update'){
                    $triggerContent.="END IF;";
                }
            }
            $triggerContent.="\nEND;";
            db::$used->internalQuery($triggerContent);
        }
    }
Сама функция создания могла быть по-лучше в плане читаемости. Она создаёт 3 триггера — на update, insert, delete. Принимает название таблицы, колонок за которыми следить и ключ по которому можно найти эту запись (может быть и несколько ключей).
Вызываться может так:
PHP
1
createWatchTrigger('employees',array('salary','job_title'),'id');
4) Теперь сделаем так, чтобы после того, как PHP страница отработает обработались данные из временной таблицы.

Воспользуемся register_shutdown_function, которая позволяет выполнить любую функцию по завершении скрипта. На любом проекте есть файл, который инклюдится всегда — туда её и разместим.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function shutdown(){
    $affectedRows=db::$used->fetchRows("select * from temp_watch_changes");
    if($affectedRows){
        if(User::isLogged()){
            $userId=User::getCurrent()->getId();
            $email=User::getCurrent()->getEmail();
        }else{
            $userId=0;
            $email='';
        }
        $updateData=array(
            'ip'=>$_SERVER['REMOTE_ADDR'],
            'id_user'=>$userId,
            'user_email'=>$email,
            'post'=>serialize($_POST),
            'get'=>serialize($_GET),
            'session'=>serialize($_SESSION),
            'server'=>serialize($_SERVER),
            'user_agent'=>$_SERVER['HTTP_USER_AGENT'],
            'url'=>serialize($_SERVER['REQUEST_URI']),
            'referer'=>$_SERVER['HTTP_REFERER']
        );
        foreach($affectedRows as $row){
            db::$used->update('watch_changes',$updateData,array('id'=>$row['id_change']));
        }
    }
}
 
register_shutdown_function('shutdown');
Вот и всё.

0
(ノಠ益ಠ)ノ彡┻━┻
 Аватар для N3stY
152 / 152 / 78
Регистрация: 05.06.2014
Сообщений: 710
Записей в блоге: 2
12.11.2014, 01:07
temkasky, для начала создадим таблицу для временных записей через phpmyadmin
Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE TABLE IF NOT EXISTS `dle_post_temp` (
`id` int(11) NOT NULL,
  `autor` VARCHAR(40) NOT NULL DEFAULT '',
  `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `short_story` text NOT NULL,
  `full_story` text NOT NULL,
  `xfields` text NOT NULL,
  `title` VARCHAR(255) NOT NULL DEFAULT '',
  `descr` VARCHAR(200) NOT NULL DEFAULT '',
  `keywords` text NOT NULL,
  `category` VARCHAR(200) NOT NULL DEFAULT '0',
  `alt_name` VARCHAR(200) NOT NULL DEFAULT '',
  `comm_num` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `allow_comm` tinyint(1) NOT NULL DEFAULT '1',
  `allow_main` tinyint(1) unsigned NOT NULL DEFAULT '1',
  `approve` tinyint(1) NOT NULL DEFAULT '0',
  `fixed` tinyint(1) NOT NULL DEFAULT '0',
  `allow_br` tinyint(1) NOT NULL DEFAULT '1',
  `symbol` VARCHAR(3) NOT NULL DEFAULT '',
  `tags` VARCHAR(255) NOT NULL DEFAULT '',
  `metatitle` VARCHAR(255) NOT NULL DEFAULT ''
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=cp1251;
далее нам нужно в addnews.php заменить
PHP
1
$db->query( "INSERT INTO " . PREFIX . "_post (date, autor, short_story, full_story, xfields, title, keywords, category, alt_name, allow_comm, approve, allow_main, fixed, allow_br, symbol, tags) values ('$thistime', '{$member_id['name']}', '$short_story', '$full_story', '$filecontents', '$title', '', '$category_list', '$alt_name', '$allow_comm', '$approve', '$allow_main', '$news_fixed', '$allow_br', '$catalog_url', '" . $_POST['tags'] . "')" );
на
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
                //Параметры ключа и сам ключ
    include ENGINE_DIR . '/classes/random.php';//Класс генератора
    $length = 80;//Длина
    $chartypes = "lower,numbers,upper"; //Верхний, нижний регистр и цифры
    $transcode = random_string($length, $chartypes); //Генерация ключа
        $site = '';//Адресс сайта можно так же указать и $_SERVER['SERVER_NAME']. Указывать без "http://" и финального слеша "/"
    $sum = 10.00; //Сумма к оплате
    $acc = ''; //Идентификатор абонента в системе партнера (например логин или email абонента), тут так же можно указать наш ключик
    $project = ''; //ID вашего проекта
    $pay_method = ''; //Метод для инициализации оплаты для электронных платежных систем, формируется как billing.система_оплаты.initPayment, где «система_оплаты» буквенный код платежной системы (например, billing.yandex.initPayment).
 
$response =
json_decode(file_get_contents('https://unitpay.ru/api?method=billing.'.$pay_method.'.initPayment&params[resultUrl]=http%3A%2F%2F'.$site.'/'.$transcode.'&params[sum]='.$sum.'&params[account]='.$acc.'&params[projectId]='.$project.''));
 //Код взял с сайта unitpay.ru
if (isset($response->result)) {
    
    $db->query( "INSERT INTO " . PREFIX . "_post_temp (date, autor, short_story, full_story, xfields, title, keywords, category, alt_name, allow_comm, approve, allow_main, fixed, allow_br, symbol, tags) values ('$thistime', '".$transcode."', '$short_story', '$full_story', '$filecontents', '$title', '', '$category_list', '$alt_name', '$allow_comm', '$approve', '$allow_main', '$news_fixed', '$allow_br', '$catalog_url', '" . $_POST['tags'] . "')" );
    
    header("Location: ".$response->result->redirectUrl);
    
} else if (!empty($response->error->message)) {
    msgbox( 'Ошибка UnitPay:', $response->error->message );
} else {
    msgbox( 'Ошибка соединения', 'Попробуйте повторить позже' );
}
Сам класс random.class.ZIP кинуть в папку /engine/classes/
1
(ノಠ益ಠ)ノ彡┻━┻
 Аватар для N3stY
152 / 152 / 78
Регистрация: 05.06.2014
Сообщений: 710
Записей в блоге: 2
12.11.2014, 01:27
Дальше выбрать по ключику данные из бд. Ключ пишется в столбец autor.

Так же в .htaccess в корне сайта добавить нужно

RewriteRule ^тут_имя_обработчика/([0-9]+)(/?)$ путь_к обработчику.php?sec_code=$1 [L]

Добавлено через 5 минут
Исправил ошибку в коде:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
                //Параметры ключа и сам ключ
                include ENGINE_DIR . '/classes/random.php';//Класс генератора
                $length = 80;//Длина
                $chartypes = "lower,numbers,upper"; //Верхний, нижний регистр и цыфры
                $transcode = random_string($length, $chartypes); //Функция ключа
                $site = '';//Адресс сайта можно так же указать и $_SERVER['SERVER_NAME']. Указывать без "http://" и финального слеша "/"
                $sum = 10.00; //Сумма к оплате
                $acc = ''; //Идентификатор абонента в системе партнера (например логин или email абонента), тут так же можно указать наш ключик
                $project = ''; //ID вашего проекта
                $pay_method = ''; //Метод для инициализации оплаты для электронных платежных систем, формируется как billing.система_оплаты.initPayment, где «система_оплаты» буквенный код платежной системы (например, billing.yandex.initPayment).
        $module_name = ''; //Имя модуля обработчика
 
$response =
json_decode(file_get_contents('https://unitpay.ru/api?method=billing.'.$pay_method.'.initPayment&params[resultUrl]=http%3A%2F%2F'.$site.'/'.$module_name.'/'.$transcode.'&params[sum]='.$sum.'&params[account]='.$acc.'&params[projectId]='.$project.''));
 //Код взял с сайта unitpay.ru
if (isset($response->result)) {
    
    $db->query( "INSERT INTO " . PREFIX . "_post_temp (date, autor, short_story, full_story, xfields, title, keywords, category, alt_name, allow_comm, approve, allow_main, fixed, allow_br, symbol, tags) values ('$thistime', '".$transcode."', '$short_story', '$full_story', '$filecontents', '$title', '', '$category_list', '$alt_name', '$allow_comm', '$approve', '$allow_main', '$news_fixed', '$allow_br', '$catalog_url', '" . $_POST['tags'] . "')" );
    
    header("Location: ".$response->result->redirectUrl);
    
} else if (!empty($response->error->message)) {
    msgbox( 'Ошибка UnitPay:', $response->error->message );
} else {
    msgbox( 'Ошибка соединения', 'Попробуйте повторить позже' );
}
Добавлено через 7 минут
Извиняюсь, в .htaccess в корне сайта добавить нужно

RewriteRule ^тут_имя_обработчика/([^/]*)(/?)$ путь_к обработчику.php?sec_code=$1 [L]
0
81 / 81 / 50
Регистрация: 26.11.2012
Сообщений: 303
12.11.2014, 11:05  [ТС]
N3stY,
Воу воу, спасибо спасибо)))))
Вот кое-что не понятно
1.
PHP
1
$transcode = random_string($length, $chartypes); //Функция ключа
Это рандомный ключ для unitpay? ибо они мне выдали постоянный секретный ключ(может надо ввести его?)
2.
PHP
1
 $module_name = ''; //Имя модуля обработчика
в смысле имя? путь к обработчику? в виде mysite.com/unit/index.php? или что?

RewriteRule ^тут_имя_обработчика/([^/]*)(/?)$ путь_к обработчику.php?sec_code=$1 [L]
может лучше так?
RewriteRule ^путь_к обработчику/([^/]*)(/?)$ тут_имя_обработчика.php?sec_code=$1 [L]

Добавлено через 2 часа 17 минут
а вот еще беда, после нажатия на "отправить"
Method not found

Добавлено через 41 минуту
в тестовой форме инитпея успешный ответ идет вот по такой ссылке

Code
1
http://sw-studio.in/unit/index.php?method=check&params%5Baccount%5D=onpulse&params%5Bdate%5D=2014-11-12+08%3A17%3A00&params%5Boperator%5D=mts&params%5BorderCurrency%5D=RUB&params%5BorderSum%5D=10&params%5BpaymentType%5D=webmoney&params%5Bprofit%5D=9.5&params%5BprojectId%5D=12549&params%5Bpurse%5D=R123456789123&params%5Bsign%5D=15b6ed74e1b21991ee29f3ab39923d34&params%5Bsum%5D=10&params%5BunitpayId%5D=41145
Добавлено через 14 минут
Универсальная форма оплаты

Итак, как же дать пользователю возможность оплатить Ваш товар или услугу? Самый простой способ — воспользоваться нашей универсальной формой оплаты:

https://unitpay.ru/pay/12549-7... ого+заказа
Обратите внимание на передаваемые параметры, без них работа формы невозможна!

Code
1
2
3
4
5
Параметр      Значение            Описание
sum             текст           Сумма платежа (например, 10.00)
account         текст       Идентификатор абонента в системе партнера (например email абонента или номер заказа)
desc            текст            Описание заказа
12549-7ac15     текст     Публичный ключ проекта
Code
1
https://unitpay.ru/pay/12549-7ac15?sum=10&account=yourClientId&desc=Оплата+тестового+заказа
Добавлено через 27 минут
в общем нашел я свой затуп.
Разобрался во всем, но осталось самое последнее.

вот что пишет:
Error UnitPay:
Получатель отклонил платеж: Character not found

Новость добавлена
Ваша статья была успешно добавлена в базу данных. После проверки администратором она будет опубликована на сайте. Добавить еще или Вернуться назад


Только вот новость не добавляется, ни в post, ни в post_temp.

Соответственно Unitpay и не может найти ID куда платить.

надеюсь я все правильно заполнил
PHP
1
2
3
4
5
6
7
8
9
10
11
//Параметры ключа и сам ключ
                include ENGINE_DIR . '/classes/random.php';//Класс генератора
                $length = 80;//Длина
                $chartypes = "lower,numbers,upper"; //Верхний, нижний регистр и цыфры
                $transcode = random_string($length, $chartypes); //Функция ключа
                $site = 'sw-studio.in';//Адресс сайта можно так же указать и $_SERVER['SERVER_NAME']. Указывать без "http://" и финального слеша "/"
                $sum = 10.00; //Сумма к оплате
                $acc = '$title'; //Идентификатор абонента в системе партнера (например логин или email абонента), тут так же можно указать наш ключик
                $project = '12449'; //ID вашего проекта
                $pay_method = 'yandex'; //Метод для инициализации оплаты для электронных платежных систем, формируется как billing.система_оплаты.initPayment, где «система_оплаты» буквенный код платежной системы (например, billing.yandex.initPayment).
                $module_name = 'unit/index.php'; //Имя модуля обработчика
Добавлено через 7 минут
Кажись я понял,
Дело в том что UnitPay ищет статью которой нету (так как в коде сказано: При ответе от сервера SUCCESS > Добавить статью в post_temp)
Кажись наоборот надо)
Сначала добавить в темп, потом проверить на succes. А потом закинуть в POST, или удалить из TEMP при ERROR ответе.


P/S: Ох и понастрачивал я поэм за ночь)

Добавлено через 1 час 33 минуты
Сделал добавление статьи, до запроса на сервер unitpay, все-равно не находит $title

Создаю статью с именем "Dark" > вижу сообщение Получатель отклонил платеж: Character not found
Если делать запрос ко мне в бд из сервера unitpay > {"jsonrpc":"2.0","result":{"message":"PA Y is successful"},"id":1}

не пойму в чем беда(

Добавлено через 18 минут
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//Параметры ключа и сам ключ
                include ENGINE_DIR . '/classes/random.php';//Класс генератора
                $length = 80;//Длина
                $chartypes = "lower,numbers,upper"; //Верхний, нижний регистр и цыфры
                $transcode = random_string($length, $chartypes); //Функция ключа
                $site = 'sw-studio.in';//Адресс сайта можно так же указать и $_SERVER['SERVER_NAME']. Указывать без "http://" и финального слеша "/"
                $sum = 10.00; //Сумма к оплате
                $acc = '$title'; //Идентификатор абонента в системе партнера (например логин или email абонента), тут так же можно указать наш ключик
                $project = '12449'; //ID вашего проекта
                $pay_method = 'yandex'; //Метод для инициализации оплаты для электронных платежных систем, формируется как billing.система_оплаты.initPayment, где «система_оплаты» буквенный код платежной системы (например, billing.yandex.initPayment).
                $module_name = 'unit/index.php'; //Имя модуля обработчика
//Добавляем статью в _POST_TEMP
$db->query( "INSERT INTO " . PREFIX . "_post_temp (date, autor, short_story, full_story, xfields, title, keywords, category, alt_name, allow_comm, approve, allow_main, fixed, allow_br, symbol, tags) values ('$thistime', '".$transcode."', '$short_story', '$full_story', '$filecontents', '$title', '', '$category_list', '$alt_name', '$allow_comm', '$approve', '$allow_main', '$news_fixed', '$allow_br', '$catalog_url', '" . $_POST['tags'] . "')" );
 
$response =
json_decode(file_get_contents('https://unitpay.ru/api?method=billing.'.$pay_method.'.initPayment&params[resultUrl]=http%3A%2F%2F'.$site.'/'.$module_name.'/'.$transcode.'&params[sum]='.$sum.'&params[account]='.$acc.'&params[projectId]='.$project.''));
 //Код взял с сайта unitpay.ru
 
 if (isset($response->result)) {
//Если ответ успешен, перемещаем в _POST
    $db->query( "INSERT INTO " . PREFIX . "_post (date, autor, short_story, full_story, xfields, title, keywords, category, alt_name, allow_comm, approve, allow_main, fixed, allow_br, symbol, tags) values ('$thistime', '".$transcode."', '$short_story', '$full_story', '$filecontents', '$title', '', '$category_list', '$alt_name', '$allow_comm', '$approve', '$allow_main', '$news_fixed', '$allow_br', '$catalog_url', '" . $_POST['tags'] . "')" );   
    $db->query( "DELETE FROM " . PREFIX . "_post_temp WHERE title = '$title' LIMIT 1");
   header("Location: ".$response->result->redirectUrl);
    
} else if (!empty($response->error->message)) {
//Удаляем статью из ТЕМП-а
$db->query( "DELETE FROM " . PREFIX . "_post_temp WHERE title = '$title' LIMIT 1" );
msgbox( 'Error UnitPay:', $response->error->message );
} else {
    msgbox( 'Ошибка соединения', 'Попробуйте повторить позже' );
}
как то так теперь выглядит.
0
(ノಠ益ಠ)ノ彡┻━┻
 Аватар для N3stY
152 / 152 / 78
Регистрация: 05.06.2014
Сообщений: 710
Записей в блоге: 2
13.11.2014, 00:11
Модуль нужно зарегистрировать, но сначала положить его в папку modules,
Далее в engine.php в папке engine нужно найти:

PHP
1
switch ( $do ) {
И ниже вставить:

PHP
1
2
3
    case "unit" :
        include ENGINE_DIR . '/modules/unit/index.php';
        break;
После чего
Цитата Сообщение от temkasky Посмотреть сообщение
$module_name = 'unit/index.php'; //Имя модуля обработчика
Имя модуля будет unit то есть
PHP
1
 $module_name = 'unit'; //Имя модуля обработчика
Добавлено через 2 минуты
И .htaccess
Code
1
RewriteRule ^тут_имя_обработчика/([^/]*)(/?)$ путь_к обработчику.php?sec_code=$1 [L]
Будет
Code
1
RewriteRule ^unit/([^/]*)(/?)$ index.php?do=unit&sec_code=$1 [L]
Ваш обработчик должен получать $_GET['sec_code'] и по нему делать запрос в бд dle_post_temp

Добавлено через 3 минуты
Цитата Сообщение от temkasky Посмотреть сообщение
Это рандомный ключ для unitpay? ибо они мне выдали постоянный секретный ключ(может надо ввести его?)
Это не для unitpay это для вашей системы, так как класс генерирует каждый раз новый набор букв/цифр, это будет уникальным ключом для транзакции, он поможет распознать статью за которую платить пользователь.

Добавлено через 4 минуты
И в наше случае ответ должен быть таким:
Code
1
http://sw-studio.in/unit/тут_ключ_сгенерированный_классом/?method=check&params[account]=onpulse&params[date]=2014-11-12+08%3A17%3A00&params[operator]=mts&params[orderCurrency]=RUB&params[orderSum]=10&params[paymentType]=webmoney&params[profit]=9.5&params[projectId]=12549&params[purse]=R123456789123&params[sign]=15b6ed74e1b21991ee29f3ab39923d34&params[sum]=10&params[unitpayId]=41145
Добавлено через 4 минуты
Цитата Сообщение от temkasky Посмотреть сообщение
//Удаляем статью из ТЕМП-а
$db->query( "DELETE FROM " . PREFIX . "_post_temp WHERE title = '$title' LIMIT 1" );
Ее нельзя удалить, так как она там еще не существует, и выборка статей должна быть
SQL
1
WHERE autor = '$transcode'
Добавлено через 8 минут
Этот код должен быть исключительно а addnews.php в папке modules и должен быть таким как я привел выше.
Это не правильно:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//Параметры ключа и сам ключ
include ENGINE_DIR . '/classes/random.php';//Класс генератора
 $length = 80;//Длина
 $chartypes = "lower,numbers,upper"; //Верхний, нижний регистр и цыфры
 $transcode = random_string($length, $chartypes); //Функция ключа
 $site = 'sw-studio.in';//Адресс сайта можно так же указать и $_SERVER['SERVER_NAME']. Указывать без "http://" и финального слеша "/"
 $sum = 10.00; //Сумма к оплате
 $acc = '$title'; //Идентификатор абонента в системе партнера (например логин или email абонента), тут так же можно указать наш ключик
 $project = '12449'; //ID вашего проекта
 $pay_method = 'yandex'; //Метод для инициализации оплаты для электронных платежных систем, формируется как billing.система_оплаты.initPayment, где «система_оплаты» буквенный код платежной системы (например, billing.yandex.initPayment).
 $module_name = 'unit/index.php'; //Имя модуля обработчика
//Добавляем статью в _POST_TEMP
$db->query( "INSERT INTO " . PREFIX . "_post_temp (date, autor, short_story, full_story, xfields, title, keywords, category, alt_name, allow_comm, approve, allow_main, fixed, allow_br, symbol, tags) values ('$thistime', '".$transcode."', '$short_story', '$full_story', '$filecontents', '$title', '', '$category_list', '$alt_name', '$allow_comm', '$approve', '$allow_main', '$news_fixed', '$allow_br', '$catalog_url', '" . $_POST['tags'] . "')" );
$response =
json_decode(file_get_contents('https://unitpay.ru/api?method=billing.'.$pay_method.'.initPayment&params[resultUrl]=http%3A%2F%2F'.$site.'/'.$module_name.'/'.$transcode.'&params[sum]='.$sum.'&params[account]='.$acc.'&params[projectId]='.$project.''));
*//Код взял с сайта unitpay.ru
if (isset($response->result)) {
//Если ответ успешен, перемещаем в _POST
* * $db->query( "INSERT INTO " . PREFIX . "_post (date, autor, short_story, full_story, xfields, title, keywords, category, alt_name, allow_comm, approve, allow_main, fixed, allow_br, symbol, tags) values ('$thistime', '".$transcode."', '$short_story', '$full_story', '$filecontents', '$title', '', '$category_list', '$alt_name', '$allow_comm', '$approve', '$allow_main', '$news_fixed', '$allow_br', '$catalog_url', '" . $_POST['tags'] . "')" ); * 
* * $db->query( "DELETE FROM " . PREFIX . "_post_temp WHERE title = '$title' LIMIT 1");
* *header("Location: ".$response->result->redirectUrl);
} else if (!empty($response->error->message)) {
//Удаляем статью из ТЕМП-а
$db->query( "DELETE FROM " . PREFIX . "_post_temp WHERE title = '$title' LIMIT 1" );
msgbox( 'Error UnitPay:', $response->error->message );
} else {
* * msgbox( 'Ошибка соединения', 'Попробуйте повторить позже' );
}
В файле к которому обращается unitpay "unit/index.php" или в качестве модуля "/unit/" должен быть и обработчик: взять новость -> положить новость -> удалить из временной таблицы.
То есть вот этот код:
PHP
1
2
3
4
5
6
$temp = $db->query("SELECT * FROM " . PREFIX . "_post_temp WHERE = autor = '".$_GET['sec_code']."'");
$temp = $db->get_row($temp);
 
$db->query( "INSERT INTO " . PREFIX . "_post (date, autor, short_story, full_story, xfields, title, keywords, category, alt_name, allow_comm, approve, allow_main, fixed, allow_br, symbol, tags) values ('{$temp['date']}', 'user', '{$temp['short_story']}', '{$temp['full_story']}', '{$temp['xfields']}', '{$temp['title']}', '', '{$temp['category']}', '{$temp['alt_name']}', '{$temp['allow_comm']}', '{$temp['approve']}', '{$temp['allow_main']}', '{$temp['fixed']}', '{$temp['allow_br']}', '{$temp['symbol']}', '{$temp['tags']}')" );   
 
    $db->query( "DELETE FROM " . PREFIX . "_post_temp WHERE autor = '".$_GET['sec_code']."'");
Добавлено через 2 минуты
Приведите пожалуйста код /unit/index.php

Добавлено через 2 минуты
Этот код не формы, а API

Добавлено через 2 часа 33 минуты
Нужно соблюдать последовательность работы скриптов, иначе ничего не выйдет.
1. Код в addnews.php - Срабатывает когда пользователь пытается запостить статью, он его перекидывает на сайт unitpay если все ок, если нет то выведет ошибку.
2. Это скрипт обработчик, на сколько я понял у вас это /unit/index.php, его запускает система unitpay, передав ему данные о счете.

Если:
  • Счет оплачен - SUCC, должен выполнится код добавление и удаления новости.
  • Если ошибка - ERR - Новость должна перейти в режим ожидания (Стоит написать модуль для повтора оплаты счета, прикрепив новость к IP пользователя).
1
81 / 81 / 50
Регистрация: 26.11.2012
Сообщений: 303
13.11.2014, 00:17  [ТС]
Спасибо огромное что вникаете в мою проблему.
Сейчас сделаю все так как вы сказали!
unitpay.zip Вот собственно модуль unitpay
0
(ノಠ益ಠ)ノ彡┻━┻
 Аватар для N3stY
152 / 152 / 78
Регистрация: 05.06.2014
Сообщений: 710
Записей в блоге: 2
13.11.2014, 00:24
Цитата Сообщение от N3stY Посмотреть сообщение
$length = 80;//Длина
Вот этот параметр можно еще защитить от подбора,заменив на:
PHP
1
$length = mt_rand(20,80);//Длина
В таком случае длина ключа будет варьироваться от 20 до 80 всегда предоставляя разный результат.

Добавлено через 3 минуты
Примеры работы скрипта:
1.
Ключ: giPoZcZxEWbqRdMwGgCOKM4K81TjpEwYHWLHBAXW bOXG4k7pjle4xCH7
Длина: 56
2.
Ключ: A0fT0qozozGVE4faMRE18r1GvLTiqSk2alWpevYp c6MvbjdFLTAl34MxBv8GxtrLsF6grjV869h
Длина: 75
3.
Ключ: Pul1lfFr9riqbFZiW3WVn8SDZ21gHl4a2afbT7
Длина: 38

И так далее...
1
81 / 81 / 50
Регистрация: 26.11.2012
Сообщений: 303
13.11.2014, 00:46  [ТС]
N3stY,
transcode я пересунул из AUTOR в TAGS (поле автор использую для своих целей)
PHP
1
 $db->query( "INSERT INTO " . PREFIX . "_post (date, autor, short_story, full_story, xfields, title, keywords, category, alt_name, allow_comm, approve, allow_main, fixed, allow_br, symbol, tags) values ('$thistime', '{$member_id['name']}', '$short_story', '$full_story', '$filecontents', '$title', '', '$category_list', '$alt_name', '$allow_comm', '$approve', '$allow_main', '$news_fixed', '$allow_br', '$catalog_url', '".$transcode."')" );
И переделал запросы в модуле unitpay.
Так как я нуждаюсь в том, что бы при оплате unitpay изменял некоторые опции в новости, а именно autor, approve, fixed.

Вот измененный код unit.rar
0
81 / 81 / 50
Регистрация: 26.11.2012
Сообщений: 303
13.11.2014, 00:49  [ТС]
То есть Unitpay должен найти новсть в TEMP, изменить в ней данные, а потом уже разместить в POST

Это код который меняет данные(по крайней мере должен)
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  function donateForAccount($account, $fixed, $approve, $author)
    {
        $query = "
            UPDATE
                ".Config::TABLE_ACCOUNT."
            SET
                ".Config::TABLE_ACCOUNT_DONATE1." = ".$this->mysqli->real_escape_string($fixed).",
                ".Config::TABLE_ACCOUNT_DONATE2." = ".$this->mysqli->real_escape_string($approve).",
                ".Config::TABLE_ACCOUNT_DONATE3." = ".$this->mysqli->real_escape_string($author)."
            WHERE
                ".Config::TABLE_ACCOUNT_NAME." = '".$this->mysqli->real_escape_string($account)."'
        ";
        
        return $this->mysqli->query($query);
    }
не совсем знаком с MSQL запросами(
0
(ノಠ益ಠ)ノ彡┻━┻
 Аватар для N3stY
152 / 152 / 78
Регистрация: 05.06.2014
Сообщений: 710
Записей в блоге: 2
13.11.2014, 01:36
temkasky, более менее разобрался с их API, сейчас напишу обработчик.
0
81 / 81 / 50
Регистрация: 26.11.2012
Сообщений: 303
13.11.2014, 02:12  [ТС]
Code
1
RewriteRule ^unit/([^/]*)(/?)$ index.php?do=unit&sec_code=$1 [L]
Это нельзя писать, иначе Unitpay не видит обработчика и выдает меседж - Hacking attempt
Без этой записи все хорошо, но после оплаты, другая беда из за этого - транскод вернуло "http://sw-studio.in/unit/qEXmQtKC2F5yv4uicr5G4o" но...
Code
1
2
Внимание, обнаружена ошибка
По данному адресу ничего на сайте не найдено, либо у вас нет доступа для просмотра информации по данному адресу
Добавлено через 1 минуту
может вам дать пароль от личного кабинета UP? и доступ к FTP сайта, легче будет понять что тут у меня что-ли)

Добавлено через 8 минут
А когда включил ModRewrite и попробовал ввести ссылку ответа, то UNIT выдал вот такое
Code
1
{"jsonrpc":"2.0","error":{"code":-32000,"message":"Invalid request"},"id":1}
видимо эму не понравился код ответа.
судя по тестам, код который приходит при успехе такой.

Сначала идет CHECK
Code
1
http://sw-studio.in/unit/index.php?method=check&params[account]=23s&params[date]=2014-11-12 17:52:44&params[operator]=liqpay&params[orderCurrency]=RUB&params[orderSum]=1.00&params[paymentType]=liqpay&params[profit]=0.97&params[projectId]=12449&params[sign]=a39da6e594e550efba00e22361f6e6f1&params[sum]=1&params[unitpayId]=9494527
ответ сервера
Code
1
{"jsonrpc":"2.0","result":{"message":"CHECK is successful"},"id":1}
Потом PAY
Code
1
http://sw-studio.in/unit/index.php?method=pay&params[account]=23s&params[date]=2014-11-12 17:52:44&params[operator]=liqpay&params[orderCurrency]=RUB&params[orderSum]=1.00&params[paymentType]=liqpay&params[profit]=0.97&params[projectId]=12449&params[sign]=a39da6e594e550efba00e22361f6e6f1&params[sum]=1&params[unitpayId]=9494527
ответ сервера
Code
1
{"jsonrpc":"2.0","result":{"message":"PAY is successful"},"id":1}
0
(ノಠ益ಠ)ノ彡┻━┻
 Аватар для N3stY
152 / 152 / 78
Регистрация: 05.06.2014
Сообщений: 710
Записей в блоге: 2
13.11.2014, 03:07
temkasky,
Давайте объясню по порядку все пункты.
1. Установка обработчика:

В engine.php после:
PHP
1
switch ( $do ) {
вставить:
PHP
1
2
3
case "unit" :
        include ENGINE_DIR . '/modules/unitpay.php';
        break;
2. в модуле addnew.php
PHP
1
$db->query( "INSERT INTO " . PREFIX . "_post (date, autor, short_story, full_story, xfields, title, keywords, category, alt_name, allow_comm, approve, allow_main, fixed, allow_br, symbol, tags) values ('$thistime', '{$member_id['name']}', '$short_story', '$full_story', '$filecontents', '$title', '', '$category_list', '$alt_name', '$allow_comm', '$approve', '$allow_main', '$news_fixed', '$allow_br', '$catalog_url', '" . $_POST['tags'] . "')" );
Заменить на:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
             //Параметры ключа и сам ключ
    include ENGINE_DIR . '/classes/random.php';//Класс генератора
    $length = mt_rand(20,80);//Длина
    $chartypes = "lower,numbers,upper"; //Верхний, нижний регистр и цифры
    $transcode = random_string($length, $chartypes); //Генерация ключа
        $site = '';//Адресс сайта можно так же указать и $_SERVER['SERVER_NAME']. Указывать без "http://" и финального слеша "/"
    $sum = 10.00; //Сумма к оплате
    $acc = ''; //Идентификатор абонента в системе партнера (например логин или email абонента), тут так же можно указать наш ключик
    $project = ''; //ID вашего проекта
    $pay_method = ''; //Метод для инициализации оплаты для электронных платежных систем, формируется как billing.система_оплаты.initPayment, где «система_оплаты» буквенный код платежной системы (например, billing.yandex.initPayment).
    $module_name = 'unit'; //Имя модуля обработчика
 
$response =
json_decode(file_get_contents('https://unitpay.ru/api?method=billing.'.$pay_method.'.initPayment&params[resultUrl]=http%3A%2F%2F'.$site.'/'.$transcode.'&params[sum]='.$sum.'&params[account]='.$acc.'&params[projectId]='.$project.''));
 //Код взял с сайта unitpay.ru
if (isset($response->result)) {
    
    $db->query( "INSERT INTO " . PREFIX . "_post_temp (date, autor, short_story, full_story, xfields, title, keywords, category, alt_name, allow_comm, approve, allow_main, fixed, allow_br, symbol, tags) values ('$thistime', '".$transcode."', '$short_story', '$full_story', '$filecontents', '$title', '', '$category_list', '$alt_name', '$allow_comm', '$approve', '$allow_main', '$news_fixed', '$allow_br', '$catalog_url', '" . $_POST['tags'] . "')" );
    
    header("Location: ".$response->result->redirectUrl);
    
} else if (!empty($response->error->message)) {
    msgbox( 'Ошибка UnitPay:', $response->error->message );
} else {
    msgbox( 'Ошибка соединения', 'Попробуйте повторить позже' );
}
3.
Открыть .htaccess и добавить строку:
Code
1
RewriteRule ^unit/([^/]*)/([^/]*)$ /index.php?do=unit&sec_code=$1&$2 [L]
4.
Создать файл unitpay.php и поместить его в modules
В файл вставить этот код:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
if($_GET['method'] == 'check'){
 $db->query("SELECT tags FROM ".PREFIX."_post_temp WHERE tags = '".$_GET['sec_code']."'");
 
 
 if($db->num_rows > 0){
        $arr = array(
        'result' => array(
        'message' => 'Request processed successfully',
                        )
                );
      $log = $db->query("INSERT INTO `dle_post_log`(`news_id`, `expires`, `action`) VALUES ('".$_GET['sec_code']."','Проверка существования статьи','Успешно')"); //Логи
      echo json_encode($arr);     
      }else{
           $log = $db->query("INSERT INTO `dle_post_log`(`news_id`, `expires`, `action`) VALUES ('".$_GET['sec_code']."','Проверка существования статьи','Неудача, статья отсутсвует')"); //Логи
           $arr = array(
        'error' => array(
        'code' => '-32000', 
        'message' => 'Post not found',
                        )
                );
 
    echo json_encode($arr);
      }
      
}elseif($_GET['method'] == 'pay'){
    $temp = $db->query("SELECT * FROM " . PREFIX . "_post_temp WHERE tags = '".$_GET['sec_code']."'");
    $temp = $db->get_row($temp);
 
$add = $db->query( "INSERT INTO " . PREFIX . "_post (date, autor, short_story, full_story, xfields, title, keywords, category, alt_name, allow_comm, approve, allow_main, fixed, allow_br, symbol, tags) values ('{$temp['date']}', 'user', '{$temp['short_story']}', '{$temp['full_story']}', '{$temp['xfields']}', '{$temp['title']}', '', '{$temp['category']}', '{$temp['alt_name']}', '{$temp['allow_comm']}', '{$temp['approve']}', '{$temp['allow_main']}', '{$temp['fixed']}', '{$temp['allow_br']}', '{$temp['symbol']}', '')" );  
 
 $log = $db->query("INSERT INTO `dle_post_log`(`news_id`, `expires`, `action`) VALUES ('{$temp['id']}','Оплата статьи','Успешно')"); //Логи
 
    $del = $db->query( "DELETE FROM " . PREFIX . "_post_temp WHERE tags = '".$_GET['sec_code']."'");
}elseif($_GET['method'] == 'error'){
    $errmess = iconv('UTF-8','windows-1251',$_GET['params']['errorMessage']);
    $del = $db->query( "DELETE FROM " . PREFIX . "_post_temp WHERE tags = '".$_GET['sec_code']."'");
    $log = $db->query("INSERT INTO `dle_post_log`(`news_id`, `expires`, `action`) VALUES ('".$_GET['sec_code']."','Ошибка', '{$errmess}')"); //Логи
}
5.
Проверить.

Добавлено через 7 минут
Так же в коде в addnews.php лучше заменить:
PHP
1
json_decode(file_get_contents('https://unitpay.ru/api?method=billing.'.$pay_method.'.initPayment&params[resultUrl]=http%3A%2F%2F'.$site.'/'.$transcode.'&params[sum]='.$sum.'&params[account]='.$acc.'&params[projectId]='.$project.''));
на:
PHP
1
json_decode(file_get_contents('https://unitpay.ru/api?method=billing.'.$pay_method.'.initPayment&params[resultUrl]=http%3A%2F%2F'.$site.'/'.$transcode.'/&params[sum]='.$sum.'&params[account]='.$acc.'&params[projectId]='.$project.''));
Дабы избежать некоторых ошибок с чтением sec_code

Добавлено через 7 минут
4. Пункт код:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
if($_GET['method'] == 'check'){
 $db->query("SELECT tags FROM ".PREFIX."_post_temp WHERE tags = '".$_GET['sec_code']."'");
 
 
 if($db->num_rows > 0){
        $arr = array(
        'result' => array(
        'message' => 'Request processed successfully',
                        )
                );
      $log = $db->query("INSERT INTO `dle_post_log`(`news_id`, `expires`, `action`) VALUES ('".$_GET['sec_code']."','Проверка существования статьи','Успешно')"); //Логи
      echo json_encode($arr);     
      }else{
           $log = $db->query("INSERT INTO `dle_post_log`(`news_id`, `expires`, `action`) VALUES ('".$_GET['sec_code']."','Проверка существования статьи','Неудача, статья отсутсвует')"); //Логи
           $arr = array(
        'error' => array(
        'code' => '-32000', 
        'message' => 'Post not found',
                        )
                );
 
    echo json_encode($arr);
      }
      
}elseif($_GET['method'] == 'pay'){
    $temp = $db->query("SELECT * FROM " . PREFIX . "_post_temp WHERE tags = '".$_GET['sec_code']."'");
    $temp = $db->get_row($temp);
 
$add = $db->query( "INSERT INTO " . PREFIX . "_post (date, autor, short_story, full_story, xfields, title, keywords, category, alt_name, allow_comm, approve, allow_main, fixed, allow_br, symbol, tags) values ('{$temp['date']}', 'user', '{$temp['short_story']}', '{$temp['full_story']}', '{$temp['xfields']}', '{$temp['title']}', '', '{$temp['category']}', '{$temp['alt_name']}', '{$temp['allow_comm']}', '{$temp['approve']}', '{$temp['allow_main']}', '{$temp['fixed']}', '{$temp['allow_br']}', '{$temp['symbol']}', '')" );  
 
 $log = $db->query("INSERT INTO `dle_post_log`(`news_id`, `expires`, `action`) VALUES ('{$temp['id']}','Оплата статьи','Успешно')"); //Логи
 
    $del = $db->query( "DELETE FROM " . PREFIX . "_post_temp WHERE tags = '".$_GET['sec_code']."'");
    $arr = array(
        'result' => array(
        'message' => 'Request processed successfully',
                        )
                );
                
      echo json_encode($arr);
}elseif($_GET['method'] == 'error'){
    $errmess = iconv('UTF-8','windows-1251',$_GET['params']['errorMessage']);
    $del = $db->query( "DELETE FROM " . PREFIX . "_post_temp WHERE tags = '".$_GET['sec_code']."'");
    $log = $db->query("INSERT INTO `dle_post_log`(`news_id`, `expires`, `action`) VALUES ('".$_GET['sec_code']."','Ошибка', '{$errmess}')"); 
//Логи
$arr = array(
        'result' => array(
        'message' => 'Request processed successfully',
                        )
                );
                
      echo json_encode($arr);
}

Добавлено через 19 секунд
Проверял get запросами в виде
Кликните здесь для просмотра всего текста
localhost/unit/254654654fddfssf/&method=check&params[account]=user12&params[date]=2012-10-0112:32:00&params[operator]=beeline&params[paymentType]=mc&params[projectId]=1&params[phone]=9XXXXXXXXX&params[sum]=10.00&params[sign]=9bdf52a4830779a1383ac24f1b3ed054&params[orderSum]=10.00&params[orderCurrency]=rub&params[unitpayId]=1234567


Добавлено через 4 минуты
Этот код просто вбивает в свою таблицу логи транзакции
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 function donateForAccount($account, $fixed, $approve, $author)
    {
        $query = "
            UPDATE
                ".Config::TABLE_ACCOUNT."
            SET
                ".Config::TABLE_ACCOUNT_DONATE1." = ".$this->mysqli->real_escape_string($fixed).",
                ".Config::TABLE_ACCOUNT_DONATE2." = ".$this->mysqli->real_escape_string($approve).",
                ".Config::TABLE_ACCOUNT_DONATE3." = ".$this->mysqli->real_escape_string($author)."
            WHERE
                ".Config::TABLE_ACCOUNT_NAME." = '".$this->mysqli->real_escape_string($account)."'
        ";
        
        return $this->mysqli->query($query);
    }
0
81 / 81 / 50
Регистрация: 26.11.2012
Сообщений: 303
13.11.2014, 03:14  [ТС]
N3stY, ага, ясно, спасибо, пробую
0
(ノಠ益ಠ)ノ彡┻━┻
 Аватар для N3stY
152 / 152 / 78
Регистрация: 05.06.2014
Сообщений: 710
Записей в блоге: 2
13.11.2014, 03:16
Хотя, можно воспользоватся и таким методом:
В addnews.php вместо
PHP
1
2
$response =
json_decode(file_get_contents('https://unitpay.ru/api?method=billing.'.$pay_method.'.initPayment&params[resultUrl]=http%3A%2F%2F'.$site.'/'.$module_name.'/'.$transcode.'&params[sum]='.$sum.'&params[account]='.$acc.'&params[projectId]='.$project.''));
втавить:
$response =
PHP
1
2
$response =
json_decode(file_get_contents('https://unitpay.ru/api?method=billing.'.$pay_method.'.initPayment&params[resultUrl]=http%3A%2F%2F'.$site.'/ajax/unitpay.php&params[sum]='.$sum.'&params[account]='.$transcode.'&params[projectId]='.$project.''));
Тогда код обработчика заменить на этот (пункт 4) и сам обработчик поместить в папку AJAX (/engine/ajax/)
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<?php
 
@error_reporting ( E_ALL ^ E_WARNING ^ E_NOTICE );
@ini_set ( 'display_errors', true );
@ini_set ( 'html_errors', false );
@ini_set ( 'error_reporting', E_ALL ^ E_WARNING ^ E_NOTICE );
 
define( 'DATALIFEENGINE', true );
define( 'ROOT_DIR', substr( dirname(  __FILE__ ), 0, -12 ) );
define( 'ENGINE_DIR', ROOT_DIR . '/engine' );
 
include ENGINE_DIR . '/data/config.php';
 
if( $config['http_home_url'] == "" ) {
    
    $config['http_home_url'] = explode( "engine/ajax/addcomments.php", $_SERVER['PHP_SELF'] );
    $config['http_home_url'] = reset( $config['http_home_url'] );
    $config['http_home_url'] = "http://" . $_SERVER['HTTP_HOST'] . $config['http_home_url'];
 
}
 
require_once ENGINE_DIR . '/classes/mysql.php';
require_once ENGINE_DIR . '/data/dbconfig.php';
require_once ENGINE_DIR . '/modules/functions.php';
require_once ENGINE_DIR . '/classes/templates.class.php';
 
dle_session();
if($_GET['method'] == 'check'){
 $db->query("SELECT tags FROM ".PREFIX."_post_temp WHERE tags = '".$_GET['params']['account']."'");
 
 
 if($db->num_rows > 0){
        $arr = array(
        'result' => array(
        'message' => 'Request processed successfully',
                        )
                );
      $log = $db->query("INSERT INTO `dle_post_log`(`news_id`, `expires`, `action`) VALUES ('".$_GET['params']['account']."','Проверка существования статьи','Успешно')"); //Логи
      echo json_encode($arr);     
      }else{
           $log = $db->query("INSERT INTO `dle_post_log`(`news_id`, `expires`, `action`) VALUES ('".$_GET['params']['account']."','Проверка существования статьи','Неудача, статья отсутсвует')"); //Логи
           $arr = array(
        'error' => array(
        'code' => '-32000', 
        'message' => 'Post not found',
                        )
                );
 
    echo json_encode($arr);
      }
      
}elseif($_GET['method'] == 'pay'){
    $temp = $db->query("SELECT * FROM " . PREFIX . "_post_temp WHERE tags = '".$_GET['params']['account']."'");
    $temp = $db->get_row($temp);
 
$add = $db->query( "INSERT INTO " . PREFIX . "_post (date, autor, short_story, full_story, xfields, title, keywords, category, alt_name, allow_comm, approve, allow_main, fixed, allow_br, symbol, tags) values ('{$temp['date']}', 'user', '{$temp['short_story']}', '{$temp['full_story']}', '{$temp['xfields']}', '{$temp['title']}', '', '{$temp['category']}', '{$temp['alt_name']}', '{$temp['allow_comm']}', '{$temp['approve']}', '{$temp['allow_main']}', '{$temp['fixed']}', '{$temp['allow_br']}', '{$temp['symbol']}', '')" );  
 
 $log = $db->query("INSERT INTO `dle_post_log`(`news_id`, `expires`, `action`) VALUES ('{$temp['id']}','Оплата статьи','Успешно')"); //Логи
 
    $del = $db->query( "DELETE FROM " . PREFIX . "_post_temp WHERE tags = '".$_GET['params']['account']."'");
    $arr = array(
        'result' => array(
        'message' => 'Request processed successfully',
                        )
                );
                
      echo json_encode($arr);
}elseif($_GET['method'] == 'error'){
    $errmess = iconv('UTF-8','windows-1251',$_GET['params']['errorMessage']);
    $del = $db->query( "DELETE FROM " . PREFIX . "_post_temp WHERE tags = '".$_GET['params']['account']."'");
    $log = $db->query("INSERT INTO `dle_post_log`(`news_id`, `expires`, `action`) VALUES ('".$_GET['params']['account']."','Ошибка', '{$errmess}')"); 
//Логи
$arr = array(
        'result' => array(
        'message' => 'Request processed successfully',
                        )
                );
                
      echo json_encode($arr);
}
В .htaccess ничего добавлять не нужно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.11.2014, 03:16
Помогаю со студенческими работами здесь

Отправка данных из формы методом POST на другую страницу
Возникла проблема. Не обрабатывается данные методом post из checkbox'ов на другую страницу сайта. Вот пример код формы из index.html: ...

Отправка методом POST
Я в ступоре и ещё никогда так не тупил.... есть форма ...я знаю что у многих инпутов одинаковое имя но они мне ненужны... сейчас мне...

Отправка методом post
Доброго времени суток! Подскажите пожалуйста как отправить то что в javascript методом post в php? Дело в том что появляются несколько...

Отправка данных методом POST
Добрый день. Подскажите пожалуйста,имеется следующий код: &lt;form action=&quot;/experts/test.php&quot; method=&quot;POST&quot;&gt; ...

Отправка JSON Методом POST
function saveEmployee() { var json = { &quot;email&quot;: $(&quot;#txt_email&quot;).val(), &quot;password&quot;:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru