Название: тимчасовий платіж
Отправлено: Андрій от 10 Ноября 2010, 14:22:13
поставив модуль "Обіцяний платіж" щоб користувач сам міг себе включати з особистого кабінету, на його рахунок вноситься тимчасова сума, ніби все ок, але чомусь він автоматично не включається, навіть після рестарту ядра нодені, а коли вручну йому внести тимчасово гроші, то включається автоматично, в чому може бути проблема ??
Название: Re: тимчасовий платіж
Отправлено: 0xbad0c0d3 от 10 Ноября 2010, 14:28:39
Я так думаю в модуле. Вот как делается при добавлении платежа в нодени: pays.pl 735 # Проверим, отключен ли юзер имея положительный баланс или баланс выше границы отключения. 736 # Если да, то напомним, что неплохо бы включить (или сами включим если настроки указывают) 737 # Не забываем что может быть ситуация когда основная запись включена, а алиасная выключена 738 { 739 $p->{block_if_limit} or last; .... 755 if( $auto_on==2 ) 756 { # разрешим доступ 757 &sql_do($dbh,"UPDATE users SET state='on' WHERE id=$Fmid OR mid=$Fmid"); 758 $pay_made_mess.=$br2.'Доступ в интернет разрешен - баланс выше установленного лимита.'; 759 $state_off=" После осуществления платежа доступ в интернет был открыт"; 760 }else 761 { 762 $pay_made_mess.=$br2.'Не забудьте разрешить доступ в интернет - баланс выше установленного лимита.'; 763 $state_off=" Необходимо включить доступ в интернет"; 764 }
Название: Re: тимчасовий платіж
Отправлено: Андрій от 10 Ноября 2010, 14:38:16
якщо чесно то я в перлі не дуже розбираюся, куда вставляти цей код ? ось сам модуль: #!/usr/bin/perl # ------------------- NoDeny ------------------ # Copyright (с) Volik Stanislav, 2008, 2009 # Copyright (с) smallcms, 2010 # Read license http://nodeny.com.ua/license.txt # --------------------------------------------- $VER=49.32;
sub PROMI_main { $promisepaylivedays = 1; #если 0 - не учитываем параметр, срок действия временного платежа в днях $promisepaymaxinmonth = 2; #если 0 - не учитываем параметр, максимально допустимое количество пользования услогой в месяц (начиная с первого числа) $promisepayforpay = 500; #если 0 - не учитываем параметр, сумма списания за пользование услугой $promisepayminimumpay = 1000 + $promisepayforpay; #минимальная сумма временного платежа + сумма снятия за услугу $promisepaymaximumpay = 20000; #максимальная сумма временного платежа $prmpay=$F{prmpay}; $form=&div('cntr', &form('!'=>1, ($promisepayforpay > 0 ? 'Если Ваш баланс близок к нулю, а пополнить счет возможности нет, воспользуйтесь услугой «Обещанный платеж». По Вашему запросу Вам будет зачислен временный платеж, и Вы сможете продолжать пользоваться нашими услугами. Не забудьте пополнить счет до истечения срока действия «обещанного платежа». Через ' . $promisepaylivedays . ' дней после активации, сумма «обещанного платежа» будет автоматически полностью списана с Вашего счета. ' . $br . &bold('Введите сумму обещанного платежа (минимум ' . $promisepayminimumpay . ' ' . $gr . '): ').&input_t('prmpay',$prmpay,20,18,' autocomplete="off"') .$br2 . 'Дополнительно за использование услуги «Обещанный платеж» с платежа будет списана сумма в размере ' . $promisepayforpay . ' ' . $gr : 'Если Ваш баланс близок к нулю, а пополнить счет возможности нет, воспользуйтесь услугой «Обещанный платеж». По Вашему запросу Вам будет зачислен временный платеж, и Вы сможете продолжать пользоваться нашими услугами. Не забудьте пополнить счет до истечения срока действия «обещанного платежа». Через ' . $promisepaylivedays . ' дней после активации, сумма «обещанного платежа» будет автоматически полностью списана с Вашего счета. ' . $br . &bold('Введите сумму обещанного платежа (минимум ' . $promisepayminimumpay . ' ' . $gr . '): ').&input_t('prmpay',$prmpay,20,18,' autocomplete="off"') ).$br2.&submit_a('Пополнить') ) );
#выборка количества использований услуги за последние promisepaylivedays дней $countprmpaysql1=&sql_select_line($dbh,"SELECT COUNT(*) FROM pays WHERE `mid`=$Mid AND `type` =50 AND `category` =900 AND `time` > UNIX_TIMESTAMP( SUBDATE( NOW( ) , $promisepaylivedays ) )"); &Error('проблема с БД.') unless $countprmpaysql1; #считаем количество использований услуги $countprmpays1=$countprmpaysql1->{'COUNT(*)'}; #выводим сообщение пользователю, который вконец потерял совесть &Error('Вы уже использовали услугу «Обещанный платеж» менее, чем ' . $promisepaylivedays . ' дней назад.') if $countprmpays1 > 0 && $promisepaylivedays != 0;
#выборка количества использований услуги в этом месяце $countprmpaysql2=&sql_select_line($dbh,"SELECT COUNT(*) FROM pays WHERE `mid`=$Mid AND `type` =50 AND `category` =900 AND `time` > UNIX_TIMESTAMP( DATE_FORMAT( NOW( ) , '%Y-%m-01' ) )"); &Error('проблема с БД.') unless $countprmpaysql2; #считаем количество использований услуги $countprmpays2=$countprmpaysql2->{'COUNT(*)'}; #выводим сообщение пользователю, который вконец потерял совесть &Error('Вы уже использовали услугу «Обещанный платеж» в этом месяце максимально допустимое количество раз.') if $countprmpays2 >= $promisepaymaxinmonth && $promisepaymaxinmonth != 0;
#если из браузера клиента не пришла сумма unless (defined $F{prmpay}) { #Показываем форму ввода клиенту $OUT.=&MessX($form,1); return; }
#проверка на длину символов &Error('Вы ввели неправильное количество символов в сумме обещанного платежа.',$EOUT) if length($prmpay)<1 || length($prmpay)>20; #проверка на корректность (работаем только с цифрами) &Error('Использованы недопостимые символы.',$EOUT) if $prmpay!~/^[0-9]+$/; #проверка на минимальный платёж &Error('Сумма обещанного платежа указана меньше минимально допустимой.',$EOUT) if $prmpay<$promisepayminimumpay; #проверка на максимальный платёж &Error('Сумма обещанного платежа указана больше максимально допустимой (' . $promisepaymaximumpay . ').',$EOUT) if $prmpay>$promisepaymaximumpay;
#всё нормально
#если указано списывать сумму за услугу if ($promisepayforpay > 0) { #списываем сумму в размере promisepayforpay за услугу Обещанный платеж $sql="INSERT INTO pays (mid,cash,type,bonus,category,admin_id,admin_ip,reason,coment,time) ". "VALUES($Mid,$promisepayforpay,10,'',600,$Adm{id},INET_ATON('$RealIp'),'','За услугу Обещанный платеж',$t)"; $rows=&sql_do($dbh,$sql); &ToLog("! mid $Mid использовал услугу Обещанный платеж (запись списания) $prmpay $gr, но произошла ошибка внесения платежа в таблицу платежей.") if $rows<1; }
#начинаем формировать временный платёж #создаём переменную времени окончания платежа (текущее время + количество суток из конфига) #если нужно удвоить, утроить срок - цифры ниже. множте, плюсуйте $time=$t+$promisepaylivedays*3600*24; #отнимаем от суммы платежа стоимость услуги, т.к. сняли за услугу ранее $prmpaytmp = $prmpay - $promisepayforpay; $sql="INSERT INTO pays (mid,cash,type,bonus,category,admin_id,admin_ip,reason,coment,time) ". "VALUES($Mid,$prmpaytmp,20,'y',1000,$Adm{id},INET_ATON('$RealIp'),'','Обещанный платеж',$time)"; $rows=&sql_do($dbh,$sql); &ToLog("! mid $Mid использовал услугу Обещанный платеж $prmpay $gr, но произошла ошибка внесения платежа в таблицу платежей.") if $rows<1;
#начинаем формировать собитие 900, которое будет блокировать повторные злоупотребления модулем $sql="INSERT INTO pays (mid,cash,type,bonus,category,admin_id,admin_ip,reason,coment,time) ". "VALUES($Mid,'',50,'',900,$Adm{id},INET_ATON('$RealIp'),'','Обещанный платеж',$t)"; $rows=&sql_do($dbh,$sql); &ToLog("! mid $Mid использовал услугу Обещанный платеж (блокирующая запись) $prmpay $gr, но произошла ошибка внесения платежа в таблицу платежей.") if $rows<1;
#начинаем формировать внесение в таблицу платежей $rows=&sql_do($dbh,"UPDATE users SET balance=balance+($prmpay) WHERE id=$Mid LIMIT 1"); if ($rows<1) { &ToLog("! mid $Mid использовал услугу Обещанный платеж $prmpay $gr, но после внесения платежа в таблицу платежей произошла ошибка изменения баланса клиента"); &Error("Произошла ошибка пополнения счета. Обратитесь к администрации.",$EOUT); }
#сообщаем клиенту, что всё нормально &OkMess(&bold_br($promisepayforpay!=0 ? "Ваш счет пополнен на $prmpay $gr из них $promisepayforpay удержано на оплату услуги «Обещанный платеж»" : "Ваш счет пополнен на $prmpay $gr").'Если текущих средств достаточно для включения доступа в интернет - доступ будет включен в течение нескольких минут.'.$br2);
}
1;
Название: Re: тимчасовий платіж
Отправлено: 0xbad0c0d3 от 10 Ноября 2010, 15:16:34
Я не знаю, что хотелось сказать вот этим: &OkMess(&bold_br($promisepayforpay!=0 ? "Ваш счет пополнен на $prmpay $gr из них $promisepayforpay удержано на оплату услуги «Обещанный платеж»" : "Ваш счет пополнен на $prmpay $gr").'Если текущих средств достаточно для включения доступа в интернет - доступ будет включен в течение нескольких минут.'.$br2); Откуда беруться эти несколько мин. не пойму. в строке 1019 nodeny.pl это при удалении временного платежа. ./web/pays.pl:740: $p=&sql_select_line($dbh,"SELECT * FROM users WHERE (id=$Fmid OR mid=$Fmid) AND state='off' LIMIT 1",'Åñòü ëè õîòÿ áû îäíà çàáëîêèðîâàííàÿ çàïèñü ó êëèåíòà?'); ./web/pays.pl:757: &sql_do($dbh,"UPDATE users SET state='on' WHERE id=$Fmid OR mid=$Fmid"); ./web/Scards.pl:109: &sql_do($dbh,"UPDATE users SET state='on' WHERE id=$Mid OR mid=$Mid"); ./web/listuser.pl:330: '3' => ["$sel_from_users state='off'", 'Êîìó çàïðåùåí äîñòóï'], ./nodeny.pl:90:$now_on_sql="(auth IN ('on','ong','off') OR lstate=1) AND state='on'"; ./nodeny.pl:92:# $Udeny{$id} óñòàíîâëåí, åñëè äîñòóï äëÿ $id çàïðåùåí æåñòêî, ò.å â ÁÄ ïîëå state='off' ./nodeny.pl:684: $rows=&sqldo("UPDATE users SET state='off' WHERE id=$id LIMIT 1"); ./nodeny.pl:1019: $sql=$cash<0? ", state='on'" : ''; ./nodeny.pl:1886: $rows=$dbh->do("UPDATE users SET state='off' WHERE id=$id LIMIT 1"); ./nodeny.orig.pl:89:$now_on_sql="(auth IN ('on','ong','off') OR lstate=1) AND state='on'"; Потому предлагаю сделать так: перед: #сообщаем клиенту, что всё нормально вставить такое: &sql_do($dbh,"UPDATE users SET state='on' WHERE id=$Mid AND blance > limit_balance",'Включаем если баланс больше лимита'); #сообщаем клиенту, что всё нормально
Название: Re: тимчасовий платіж
Отправлено: Андрій от 10 Ноября 2010, 17:20:12
зробив як ви написали але нічого не змінилося - дальше не включає після поповнення
Название: Re: тимчасовий платіж
Отправлено: Aivanzipper от 10 Ноября 2010, 17:53:24
blance в sql-запросе правильно написан?
Название: Re: тимчасовий платіж
Отправлено: Андрій от 10 Ноября 2010, 18:13:20
все запрацювало, дякую!
Название: Re: тимчасовий платіж
Отправлено: 0xbad0c0d3 от 10 Ноября 2010, 18:42:38
Copy-paste -- рулит!
Название: Re: тимчасовий платіж
Отправлено: Андрій от 10 Ноября 2010, 18:51:56
:) тепер буду уважніший при копіюванні
Название: Re: тимчасовий платіж
Отправлено: smallcms от 10 Ноября 2010, 21:00:10
:) тепер буду уважніший при копіюванні
Я так понял вы пользуете очень сырую (одну из первых версий) модуля, который начинал разрабатывать я. попробуйте скачать новую версию: http://code.google.com/p/nodeny49modules/ , т.к. по функционалу последние версии уходят далеко вперёд в отличии от той версии, которую вы сейчас используете...
Название: Re: тимчасовий платіж
Отправлено: Андрій от 11 Ноября 2010, 14:06:03
коли ставлю останню версію то не заходить в статистиці в цей пункт, пише ErrorDocument 500 , коли вертаю стару версію то все ок
Название: Re: тимчасовий платіж
Отправлено: Aivanzipper от 11 Ноября 2010, 14:34:51
Смотрите логи апача.
Название: Re: тимчасовий платіж
Отправлено: 0xbad0c0d3 от 11 Ноября 2010, 14:36:40
Последняя это вот эта: http://code.google.com/p/nodeny49modules/downloads/detail?name=Spromisedpay0.06.zip&can=2&q= (http://code.google.com/p/nodeny49modules/downloads/detail?name=Spromisedpay0.06.zip&can=2&q=)?
Название: Re: тимчасовий платіж
Отправлено: Андрій от 11 Ноября 2010, 14:49:40
ось що в логах апача: [Thu Nov 11 14:46:05 2010] [error] [client 10.1.1.5] Undefined subroutine &main::PROMI_main called at /usr/local/www/apache22/cgi-bin/adm/stat.pl line 413., referer: https://10.1.1.1/cgi-bin/adm/stat.pl?pp=T1-303579853oz9sVMve9kxcrmqxPIoENg&a=101&id=77&a=119 [Thu Nov 11 14:46:05 2010] [error] [client 10.1.1.5] Premature end of script headers: stat.pl, referer: https://10.1.1.1/cgi-bin/adm/stat.pl?pp=T1-303579853oz9sVMve9kxcrmqxPIoENg&a=101&id=77&a=119
що це означає ?
Название: Re: тимчасовий платіж
Отправлено: Aivanzipper от 11 Ноября 2010, 14:52:09
Ругается на субрутину PROMI_main. Посмотрите, как она называется в новой версии скрипта и внесите соответствующие поправки в реестр плагинов.
Название: Re: тимчасовий платіж
Отправлено: Андрій от 11 Ноября 2010, 15:08:38
запрацювало, дякую
Название: Re: тимчасовий платіж
Отправлено: smallcms от 11 Ноября 2010, 16:28:52
Последняя это вот эта: http://code.google.com/p/nodeny49modules/downloads/detail?name=Spromisedpay0.06.zip&can=2&q= (http://code.google.com/p/nodeny49modules/downloads/detail?name=Spromisedpay0.06.zip&can=2&q=)?
Нет, на данный момент последняя лежит в меркуриале. Я там добавил защиту от "антикварных" хитрецов, у которых баланс -3 с лета, а сейчас они якобы неожиданно взяли платёж. Могу архивом выложить... :-\
Название: Re: тимчасовий платіж
Отправлено: ale-x от 31 Января 2011, 23:52:38
Хороший модуль! Автору плюс. Думаю стоит оформить его в соответствующем разделе, как сделано с модулем "Поделиться банасом"
Название: Re: тимчасовий платіж
Отправлено: dimia от 29 Апреля 2011, 09:44:51
а с 49.33 будет работать?
Название: Re: тимчасовий платіж
Отправлено: Dimension от 27 Мая 2011, 12:13:51
поставил его на 50.32 надеюсь боков не должно быть ? функционально вроди бы все пока в норме...
Название: Re: тимчасовий платіж
Отправлено: poxy. от 27 Мая 2011, 13:42:37
Последняя это вот эта: http://code.google.com/p/nodeny49modules/downloads/detail?name=Spromisedpay0.06.zip&can=2&q= (http://code.google.com/p/nodeny49modules/downloads/detail?name=Spromisedpay0.06.zip&can=2&q=)?
Эта: http://code.google.com/p/nodeny49modules/downloads/detail?name=Spromisedpay0.07.zip&can=2&q=
Название: Re: тимчасовий платіж
Отправлено: Dimension от 27 Мая 2011, 13:44:52
поставил его на 50.32 надеюсь боков не должно быть ? функционально вроди бы все пока в норме...
походу на 50.32 не пашет поле - "Если платежей не поступало столько дней"
Название: Re: тимчасовий платіж
Отправлено: smallcms от 27 Мая 2011, 14:44:33
походу на 50.32 не пашет поле - "Если платежей не поступало столько дней"
Уделил Вашему сообщению 30 минут. Прочитывал его вдумчиво не менее 10 минут и пытался вникнуть в сокральность этой немногословности, одновременно поизводя аудит кода. Остальные 20 минут потратил на вариации и фантазии о сбоях или модификациях биллинга, отрабатывая запросы в MySQL ручками. И всё же если отбросить иронию по поводу гозирования лужи, то всё равно выходят две причины описанной Вами проблемы: 1) переменная $PRMP_oldpay не определена вовсе. В таком случае условие не отработает. Где-то моя вина, нужно делать проверки определения переменных и в случае если их всех нет в конфиге посылать пользователя модуля лесом. 2) переменная $PRMP_oldpay равна нулю. Тогда согласно задумке автора модуля действительно это поле не обрабатывается, даже если определено в конфигурационном файле. Впрочем модуль был построен для бесплатной версии 49.32 и на 100% утверждать, что он будет работать в 50.32, не стану...
|