Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перл+Вебмани, Ошибки какие-то нереальные. 
V
    Опции темы
Marlik
Дата 22.11.2007, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 25.2.2007
Где: Рязань

Репутация: нет
Всего: нет



Люди, Братья по Перлразуму!!! Помогите. Ситуация такая, генерирую сессию, номер сессии кладу в скрытое поле, отправляю на оплату пользователя, в результате получается что номер сесии почему-то не вынимается скриптом из скрытого поля, и генерируются еще сессии. Далее мерчант, при нормальном платеже должен перенаправить меня на адрес вот так: http://www.домен.ru/cgi-bin/скрипт?pay_is_good а получается в браузере такой урл, а скрипт показывает функцию по умолчанию: payment();. Кто нибудь настраивал оплату, подскажите что не так, а то уже голова кругом.

Вот код для мыслителей

Код


#!/usr/bin/perl -w 
use strict;
use CGI::Carp 'fatalsToBrowser';
use CGI::Session;
use CGI qw(:standard);
my $cgi = new CGI;

sub gen_sid{
my $sess_ID = new CGI::Session("driver:File", undef, {Directory=>'tmp/'}) || die;
$sess_ID -> expire('+20m');
my $id = $sess_ID->id();
$sess_ID -> param("pay","0");
$sess_ID -> close();
return "$id";


sub payment{
my $sid = gen_sid(); 
print<<TT;
<center>
<form id="pay" name="pay" method="post" action="https://merchant.webmoney.ru/lmi/payment.asp" >
<input type="hidden" name="LMI_PAYMENT_AMOUNT" value="1.0">
<input type="hidden" name="LMI_PAYMENT_DESC" value="access">
<input type="hidden" name="LMI_PAYEE_PURSE" value="number_coshelka">
<input type="hidden" name="LMI_SIM_MODE" value="0">
<input type="hidden" name="sid" value="$sid">
<font color="red" size="4"><b>Press a badge for payment 1\$ </b></font>
<input type="image" name="webmoney" value="Payment" src="../m_wm.gif" alt="click it" align="middle">
</center>
</form>
TT
}



sub get_pay{ 
my $sid = $cgi -> param('sid');
if($sid){ 
my $sess_ID = new CGI::Session("driver:File", "$sid", {Directory=>'tmp/'}) || die;
$sess_ID -> param("pay","1");
$sess_ID -> close();
exit(0);
}




print $cgi->header(-charset => 'Windows-1251'); 

if(defined $cgi->param('pay_is_good')){
print "<center>Very good!!!</center>";
}elsif(defined $cgi->param('pay_is_no')){
print print "<center>Very bad!!!</center>";
}elsif(defined $cgi->param('payment')){
get_pay();
}else {
payment();
}






Спасибо если кто ответит...  smile 

PM WWW Skype   Вверх
Marlik
Дата 15.12.2007, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 25.2.2007
Где: Рязань

Репутация: нет
Всего: нет



Вопрос почти решен, проблема оказывается что одним файлом не обработать всю систему платежа(запросы get запрещены: http://www.domen.ru/cgi-bin/test.pl?rezult), то есть необходимо создать несколько скриптов, один главный, на который уже после оплаты надо будет перекинуть пользователя, назовем его one.pl, второй rezult.pl мерчант запросит этот скрипт для передачи параметров платежа, то есть первый раз запросит есть ли этот скрипт через форму предварительного запроса, второй раз запросит через форму оповещения о платеже, далее надо будет написать еще скрипт, третий, назовем его success.pl это для того что-бы мерчант направил юзера на этот адрес при успешном платеже, можно и четвертый накатать при неудачном платеже, но это ни к чему, я весь код для двух скриптов описал в одном success.pl.

Это форма направляющая юзера на сайт мерчанта:

Код

#!/usr/bin/perl -w  
use strict;
use CGI::Carp 'fatalsToBrowser';
use CGI::Session;
use CGI qw(:standard);
my $cgi = new CGI;

sub gen_sid{
my $sess_ID = new CGI::Session("driver:File", undef, {Directory=>'tmp/'}) || die;
$sess_ID -> expire('+20m');
my $id = $sess_ID->id();
$sess_ID -> param("pay","0");
$sess_ID -> close();
 return "$id";
 }  
  
sub payment{
my $sid = gen_sid();  
print<<TT;
<center>
<form method="POST" action="https://merchant.webmoney.ru/lmi/payment.asp">
    <input type="hidden" name="LMI_PAYMENT_AMOUNT" value="1.00">
    <input type="hidden" name="LMI_PAYMENT_DESC" value="access">
    <input type="hidden" name="LMI_PAYMENT_NO" value="">
    <input type="hidden" name="LMI_PAYEE_PURSE" value="номер кошелька">
    <input type="hidden" name="LMI_SIM_MODE" value="0">
    <input type="hidden" name="sid" value="$sid">
    <font color="red" size="4"><b>Press a badge for payment 1\$ </b></font>
<input type="image" name="webmoney" value="Payment" src="../m_wm.gif" alt="click it" align="middle"></a>
</form>
</center>
TT
     }
     
print $cgi->header(-charset => 'Windows-1251');
     
     payment();
     exit();

 

Юзер жмет на кнопку и отправляется на сайт мерчанта, как вы заметили в скрытом поле sid которое должно отличатся от таких названий как LMI_PAYEE_XXX я передаю мерчанту идентификатор сессии. Мерчант авторизует юзера и запрашивает rezult.pl вот его код:

Код

#!/usr/bin/perl -w  
use strict;
use CGI::Carp 'fatalsToBrowser';
use CGI::Session;
use CGI qw(:standard);
my $cgi = new CGI;


   
       
       sub get_pay{
my $LMI_PREREQUEST = $cgi -> param('LMI_PREREQUEST');
my $LMI_PAYEE_PURSE = $cgi -> param('LMI_PAYEE_PURSE');
my $LMI_PAYMENT_AMOUNT = $cgi -> param('LMI_PAYMENT_AMOUNT');
my $LMI_MODE = $cgi -> param('LMI_MODE');
my $LMI_PAYER_WM = $cgi -> param('LMI_PAYER_WM');
my $sid = $cgi -> param('sid'); 
my $sess_ID = new CGI::Session("driver:File", "$sid", {Directory=>'tmp/'}) || die;
$sess_ID -> param("pay","1");
$sess_ID -> param("LMI_PREREQUEST","$LMI_PREREQUEST");
$sess_ID -> param("LMI_PAYEE_PURSE","$LMI_PAYEE_PURSE");
$sess_ID -> param("LMI_PAYMENT_AMOUNT","$LMI_PAYMENT_AMOUNT");
$sess_ID -> param("LMI_MODE","$LMI_MODE");
$sess_ID -> close();
print "YES";
 
  }  



print $cgi->header(-charset => 'Windows-1251'); 

get_pay();
exit();
  

 

Ну, тут понятно что мы вынимаем самое главное sid то-бишь идентификатор юзера, открываем сессию и кладем туды значение pay=1. Теперь очень просто можно идентифицировать юзера платил он или нет если параметр pay=0 значит не платил. Тут еще есть кое-какие параметры и их желательно проверять такие как: номер кошелька, сумму, тестовый режим или рабочий и т. д. Если все о-кей мерчант пересылает юзера на success.pl это уже видно в строке броузера, и соответственно sid тоже передается, вот код success.pl:

Код

#!/usr/bin/perl -w
use strict;
use CGI::Carp 'fatalsToBrowser';
use CGI qw(:standard);
my $cgi = new CGI;

print $cgi->header(-charset => 'Windows-1251');
my $sid = $cgi -> param('sid');

if($sid){

# Тут направляем юзера на one.pl и передаем ему sid, кстати кто знает как это эффективно сделать допишите код,
# а то мой мозг уже отключился.   

}else{

# Тут направляем юзера на форму отправляющего его на сайт мерчанта(первый описанный код). 

}




PM WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0702 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.