Вопрос почти решен, проблема оказывается что одним файлом не обработать всю систему платежа(запросы 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{
# Тут направляем юзера на форму отправляющего его на сайт мерчанта(первый описанный код).
}
|
|