Добро пожаловать,
Гость
|
Всевозможные подсказки и напоминания по настройке Операционны систем и программ. Чтобы не забыть.
ТЕМА:
Приват24 + Virtuemart 5 года 8 мес. назад #80
|
Вот метод переделки стандартного модуля оплаты под Приват24. Привожу полностью. Совместными усилиями можно сделать нормальный модуль
Для начала необходимо сходить по адресу e.privatbank.ua/title_acquiring.htm и скачать пакет документов по подключению магазина к платежной системе Приватбанка SENTRY Создавать плагин будем для платформы Joomla 2.5.6 и Virtuemart 2.0.10 Что должен делать этот плагин - создать метод оплаты за товар «Кредитной картой» который будет перенаправлять покупателя на сайт платежной системы банка для ввода номера карты, CVV- кода, срока окончания карты и естественно суммы платежа (сумму клиент вводить не будет так как она передается в post-массиве от магазина в банк)
ВНИМАНИЕ: Спойлер!
[ Нажмите, чтобы развернуть ]
[ Нажмите, чтобы скрыть ]
Итак начнем. Чтобы облегчить себе жизнь мы не будем делать все с нуля , а попытаемся приспособить для этой цели плагин который входит в комплект установочного пакета Virtuemart – это VM - Payment, Standard из файлов которого мы путем небольшой переделки получим установочные файлы для нашего плагина который назовем privat24. 1 Скопируем в сторонку файлы плагина Standard root/plugins/vmpayment/standard/standard.php root/plugins/vmpayment/standard/standard.xml где root — это корень Вашего сайта переименуем эти файлы в privat24.php privat24.xml соответственно 2 Создадим еще два файла которые нам понадобятся для ведения лога работы нашего плагина – мы будем заносить в таблицу базы данных значения параметров обмена магазина с банком и банка с магазином – install.sql и uninstall.sql Файл install.sql создает в БД магазина дополнительную таблицу #_privat_log где # - префикс вашей БД Вот его код: CREATE TABLE IF NOT EXISTS `#__privat_log` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `direction` varchar(55) NOT NULL, `postnamevalue` longtext , `recorddatetime` datetime, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8; файл uninstall.sql — нужен для удаления этой таблицы из БД в случае если захочется деинсталлировать плагин 3 Теперь начнем курочить файлы privat24.xml и privat24.php Берем privat24.xml — удаляем в нем все строки и вставляем свои : <?xml version="1.0" encoding="utf-8"?> <install version="2.5" type="plugin" metod="upgrade" group="vmpayment"> <name>privat24</name> <author>Boot Alexander</author> <creationDate>Oct 23, 2012</creationDate> <authorEmail>Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. <authorUrl>www.spk.in.ua/ <version>1.001</version> <licence>GNU/GPL www.gnu.org/licenses/gpl.html <description> <![CDATA[<p>Plugin for Privat24 payment <br /> (c) 2012 Boot Alexander<br /> После установки значения параметров соответствуют тестовому режиму. <br /> Подробности по подключению к банку смотри на e.privatbank.ua/title_privat24.htm]]> </description> <files> <filename plugin="privat24">privat24.php</filename> <filename>install.sql</filename> <filename>uninstall.sql</filename> </files> <!-- SQL query files to execute on installation --> <install> <sql> <file driver="mysql" charset="utf8">install.sql</file> <file driver="mysql">install.sql</file> <file driver="mysqli" charset="utf8">install.sql</file> <file driver="mysqli">install.sql</file> </sql> </install> <!-- SQL query files to execute on uninstallation --> <uninstall> <sql> <file driver="mysql" charset="utf8">uninstall.sql</file> <file driver="mysql">uninstall.sql</file> <file driver="mysqli" charset="utf8">uninstall.sql</file> <file driver="mysqli">uninstall.sql</file> </sql> </uninstall> <params> <param name="Version" type="text" size="32" default="1.0.0" label="Version" description="Версия Sentry" /> <param name="MerID" type="text" size="32" default="100000000918471" label="MerID" description="Номер Вашего предприяти выданый ПриватБанком при регистрации" /> <param name="MerPsw" type="password" default="j8O5Eek7" label="MerPsw" description="Пароль выданый ПриватБанком при регистрации" /> <param name="BankURL" type="text" size="254" default="https://www.verification.privatbank...Application/CheckoutPage_ru/CheckoutPage.aspx" label="BankURL" description="адрес сервера Sentry, на который должен отсылаться запрос по оплате" /> <param name="merRespURL" type="text" size="254" default="www.verification.privatbank.ua/SENTRY/Pa...on/wfrmresponse.aspx" label="merRespURL" description="URL, на который система должна перенаправлять клиента с результатом платежа " /> <param name="merRespURL2" type="text" size="254" default="" label="merRespURL2" description="URL, на который система должна отправлять ответ с результатом платежа напрямую, параллельно отправке через браузер клиента" /> <param name="AcqID" type="text" size="32" default="414963" label="AcqID" description="AcqID" /> <param name="PurchaseCurrency" type="text" size="3" default="980" label="PurchaseCurrency" description="980-гривна" /> <param name="PurchaseCurrencyExponent" type="text" size="2" default="2" label="PurchaseCurrencyExponent" description="экспонента суммы покупки (количество знаков выделяемое под дробную часть)" /> <param name="SignatureMetod" type="radio" default="SHA1" label="Signature Metod" description="Метод шифрования подписи (SHA1 или MD5), SHA1 по умолчанию"> <option value="SHA1">SHA1</option> <option value="MD5">MD5</option> </param> <param name="CaptureFlag" type="radio" default="A" label="Signature Metod" description="A или M – флаг указывает на автоматическое(A) или ручное(M) подтверждение транзакции . 'А' - по умолчанию"> <option value="A">A</option> <option value="M">M</option> </param> </params> </install> 4 Редактируем файл privat24.php Для отключения отправки писем админу магазина о факте совершения заказа и покупателю с реквизитами этого заказа ищем код типа $order = 1; и меняем 1 на 0 $order = 0; Этого можно не делать если Вы хотите чтобы и письма тоже приходили В начало файла примерно после кода /** * Create the table for this plugin if it does not yet exist. * @author Val?rie Isaksen */ public function getVmPluginCreateTableSQL() { return $this->createTableSQL('Payment privat24 Table'); } вставляем две своих функции типа /* Функция получения массива параметров плагина из поля таблицы БД #__virtuemart_paymentmethods */ function getParamsArray($strvar){ $arr=explode('|',$strvar); // разбиваем строку на отдельне части разделенные символом "|" и запоминаем в массив $arr $len = count($arr)-1; // получаем количество параметров for ($i=0; $i<$len; $i++) { $pos = strpos($arr[$i],'=')+1; // находми позицию с которой начинается значение параметра $name[$i] = substr($arr[$i],0,$pos-1); $value[$i] = substr($arr[$i],$pos); // В значении параметра убираем сомволы '"' и '\' $sm = array(); $sm[0] ='"'; $sm[1]=chr(92); $value[$i]= str_replace($sm,"",$value[$i]); // } $res = array_combine($name, $value); return $res; } /* Эта функция приведена в "РУКОВОДСТВО по интеграции интернет-магазина с модулем проведения платежей SENTRY " */ function hexbin($temp) { $data=""; $len = strlen($temp); for ($i=0;$i<$len;$i+=2) $data.=chr(hexdec(substr($temp,$i,2))); return $data; } далее после кода $html .= $this->getHtmlRow('STANDARD_AMOUNT', $currency->priceDisplay($order->order_total), "vmorder-done-amount"); $html .= '</table>' . "\n"; вставляем свой код который определяет кнопку «Перейти к оплате картой ?» В данном случае это html форма , обеспечивающая отображени пресловутой кнопки и передачу параметров в банк методом post (см. документацию скачанную с сайта приватбанка) // Получение значений параметров плагина $qparams = 'SELECT `payment_params` FROM `#__virtuemart_paymentmethods` WHERE `virtuemart_paymentmethod_id`="' .$order->virtuemart_paymentmethod_id.'" '; $dbparams = JFactory::getDBO(); $dbparams->setQuery($qparams); $params = $dbparams->loadResult(); $p=$this->getParamsArray($params); /* Параметры передаваемые на сервер Приват банка методом post 1 Version обязательное 2 MerID обязательное 3 MerRespURL обязательное 4 MerRespURL2 опциональное 5 AcqID обязательное 6 PurchaseAmt обязательное 7 PurchaseCurrency обязательное 8 PurchaseAmt2 опциональное 9 PurchaseCurrency2 опциональное 10 AdditionalData опциональное 11 Reversal опциональное 12 OrderID обязательное 13 PurchaseCurrencyExponent обязательное 14 SignatureMethod опциональное 15 Signature обязательное 16 CaptureFlag опциональное */ $Version = $p; $MerID = $p ; $MerRespURL = $p; $MerRespURL2 = ""; $AcqID = $p; // $PurchaseAmt = round($order->order_total,2)*100; //сумма в копейках грн. в боевом режиме раскоментировать $PurchaseAmt = 100; // для теста 1 грн в боевом режиме закоментировать while( strlen($PurchaseAmt)<12) {$PurchaseAmt="0".$PurchaseAmt;} $PurchaseCurrency = $p; $PurchaseAmt2 = ""; $PurchaseCurrency2 = ""; $AdditionalData = ""; $Reversal = ""; $OrderID = 'TEST_SPKSHOPTESTMERCHANT_'.date("d/m/y")."_".date("H:i:s")."_".$order->virtuemart_order_id;//Для теста $PurchaseCurrencyExponent = $p; $SignatureMethod =$p; $str = $p.$MerID.$AcqID.$OrderID.$PurchaseAmt.$PurchaseCurrency.$PurchaseAmt2.$PurchaseCurrency2.$AdditionalData.$Reversal; // var_dump($str); $s1 = sha1($str); $s1 = $this->hexbin($s1); $Signature = base64_encode($s1); $CaptureFlag = $p; /* Форма передачи данных в банк */ $html.= '<form id="checkout" name="checkout" method="post" target="_blank"' ; $html.= 'action="'.$p.'"'; $html.='>'; $html.= '<input id="Version" type="hidden" name="Version" value="'.$Version.'"/>'; $html.= '<input id="MerID" type="hidden" name="MerID" value="'.$MerID.'"/>'; $html.= '<input id="MerRespURL" type="hidden" name="MerRespURL" value="'.$MerRespURL.'"/>'; $html.= '<input id="MerRespURL2" type="hidden" name="MerRespURL2" value="'.$MerRespURL2.'"/>'; $html.= '<input id="AcqID" type="hidden" name="AcqID" value="'.$AcqID.'"/>'; $html.= '<input id="PurchaseAmt" type="hidden" name="PurchaseAmt" value="'.$PurchaseAmt.'"/>'; $html.= '<input id="PurchaseCurrency" type="hidden" name="PurchaseCurrency" value="'.$PurchaseCurrency.'"/>'; $html.= '<input id="PurchaseAmt2" type="hidden" name="PurchaseAmt2" value="'.$PurchaseAmt2.'"/>'; $html.= '<input id="PurchaseCurrency2" type="hidden" name="PurchaseCurrency2" value="'.$PurchaseCurrency2.'"/>'; $html.= '<input id="AdditionalData" type="hidden" name="AdditionalData" value="'.$AdditionalData.'"/>'; $html.= '<input id="Reversal" type="hidden" name="Reversal" value="'.$Reversal.'"/>'; $html.= '<input id="OrderID" type="hidden" name="OrderID" value="'.$OrderID.'"/>'; $html.= '<input id="PurchaseCurrencyExponent" type="hidden" name="PurchaseCurrencyExponent" value="'.$PurchaseCurrencyExponent.'"/>'; $html.= '<input id="SignatureMethod" type="hidden" name="SignatureMethod" value="'.$SignatureMethod.'"/>'; $html.= '<input id="Signature" type="hidden" name="Signature" value="'.$Signature.'"/>'; $html.= '<input id="CaptureFlag" type="hidden" name="CaptureFlag" value="'.$CaptureFlag.'"/>'; $html.= '<input type="submit" style="background: #FF8040; color: #000000;" value="Перейти к оплате картой ?" />'; $html.= '</form>'; // Записываем в базу данных лог переданных в банк post-параметров $datetime = date("y/m/d")."_".date("H:i:s"); $log=''; $log.='Version='.$Version.'|'.'MerID='.$MerID.'|'; $log.='MerRespURL='.$MerRespURL.'|'.'MerRespURL2='.$MerRespURL2.'|'; $log.='AcqID='.$AcqID.'|'.'PurchaseAmt='.$PurchaseAmt.'|'.'PurchaseCurrency='.$PurchaseCurrency.'|'; $log.='PurchaseAmt2='.$PurchaseAmt2.'|'.'PurchaseCurrency2='.$PurchaseCurrency2.'|'; $log.='AdditionalData='.$AdditionalData.'|'.'Reversal='.$Reversal.'|'.'OrderID='.$OrderID.'|'; $log.='PurchaseCurrencyExponent='.$PurchaseCurrencyExponent.'|'; $log.='$SignatureMethod='.$SignatureMethod.'|'.'Signature='.$Signature.'|'.'CaptureFlag='.$CaptureFlag; $qpost = "INSERT INTO `#__privat_log` (`direction`,`postnamevalue`,`recorddatetime`) VALUES('Передача в банк','$log','$datetime')"; $dbpost = JFactory::getDBO(); $dbpost->setQuery($qpost); $dbpost->query(); Ну вот собственно и весь процесс создания. Обратите внимания на следующее в последнем куске нашего кода а) // $PurchaseAmt = round($order->order_total,2)*100; //сумма в копейках грн. в боевом режиме раскоментировать $PurchaseAmt = 100; // для теста 1 грн в боевом режиме закоментировать б) $OrderID = 'TEST_SPKSHOPTESTMERCHANT_'.date("d/m/y")."_".date("H:i:s")."_".$order->virtuemart_order_id;//Для теста в боевом режиме закоментировать // $OrderID = 'SPKSHOP_MERCHANT_'.date("d/m/y")."_".date("H:i:s")."_".$order->virtuemart_order_id;// в боевом режиме раскоментировать Попробуем установить плагин ОБЯЗАТЕЛЬНО ДЕЛАЕМ ПОЛНЫЙ БЭКАП САЙТА заливаем по ftp файлы privat24.php, privat24.xml, install.sql, unistall.sql в папка root/tmp/ затем в админке магазина «Расширения»=>«Менеджер расширений»=>«Установить из каталога» устанавливаем плагин в менеджере плагинов публикуем его в «Компоненты» => «Virtuemart» => «Способы оплаты» создаем способ оплаты «Кредитной картой» и выбираем в поле «способ оплаты » из выпадающего списка наш плагин privat24 . Публикуем Все это хорошо скажите Вы , но в этом случае покупатель после проведения платежа на сайте банка не возвращается на страничку в магазине, а перенаправляется банком куда-то в недра их сайта на страницу (причем англоязычную) где ему сообщают о результате проведенной транзакции (проще говоря — прошло списание с карты или нет). Да это так. Ведь у Вас на магазинном сайте не поднят SSL и нет SSL-сертификата для основных браузеров типа IE, Firefox,Chrome, Opera, Netscape и т. д Ну что же связывайтесь с провайдером по этому вопросу платите денег за статик ip и сертификат (мне это обошлось 88 у.е в год). Ну короче не бесплатный гемморой. Так вот если вы все таки решите что необходимо обрабатывать ответы банка по транзакциям на сайте магазина то предлагаю следующую схему Идем на сайт www.nonumber.nl и скачиваем бесплатную версию на мой взгляд очень полезного модуля Modules Anywhere который позволяет вставить вызов произвольного модуля в статью. Устанавливаем его — в результате в редакторе статьи должна появиться кнопка «Вставить модуль» Теперь создаем свой модуль обработки ответов банка который состоит из двух файлов mod_privat_answer_processing.php и mod_privat_answer_processing.xml Модуль этот не имеет параметров , а просто тупо выводит покупателю результат банковской транзакции Вот код mod_privat_answer_processing.xml : <?xml version="1.0" encoding="utf-8"?> <extension type="module" version="2.5" method="upgrade"> <name>mod_privat_answer_processing</name> <creationDate>30.10.2012</creationDate> <author>Boot Alexander</author> <authorEmail>Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. <license>License free</license> <version>0.0.1</version> <description> <![CDATA[<p>Module PrivatBank answer processing <br /> (c) 2012 Boot Alexander<br /> Модуль обрабатывает ответ системы проведения платежей SENTRY (Приватбанк) <br /> который она возвращает методом post на адрес мерчанта указанный в параметре MerRespURL (см. "Плагин оплаты через Приватбанк") <br /> Модуль не имеет параметров <br /> Подробности по подключению к банку смотри на e.privatbank.ua/title_privat24.htm]]> </description> <files> <filename module="mod_privat_answer_processing">mod_privat_answer_processing.php</filename> <filename>mod_privat_answer_processing.xml</filename> </files> </extension> А это mod_privat_answer_processing.php <?php // no direct access defined('_JEXEC') or die; echo 'Счет номер: '.$_POST["OrderID"].'<br/>'.'<br/>'; switch($_POST) { case 1: if ($_POST == 1) { echo 'Ваш платеж успешно завершен';} else break; break; default: if($_POST == 4 or $_POST == 3){ echo 'Платеж отклонен. Пожалуйста, обратитесь в Ваш банк-эмитент.';break; } if($_POST == 2){ echo 'Платеж отклонен. Пожалуйста, обратитесь в Ваш банк-эмитент.'."<br/>". 'Проверьте возможные причины: '."<br/>". '- неверный ввод реквизитов Вашей карты'."<br/>". '- недостаточно средств на счете'."<br/>". '- по Вашей карте не разрешены расчеты в Интернет';break;} if($_POST == 13){ echo 'Извините, Ваш платеж отклонен.'."<br/>". 'В данном Интернет-магазине не возможна оплата по картам'."<br/>". 'данной платежной системы ';break;} if($_POST == 14){ echo 'При проведении транзакции неверно указана валюта платежа'."<br/>". 'Валюта платежа отличная от разрешенной для мерчанта.';break;} if($_POST == 15){ echo 'Извините.'."<br/>". 'Проведение платежей временно недоступно,'."<br/>". 'попробуйте позже.';break;} if($_POST == 18){ echo 'Ваш платеж отклонен.'."<br/>". 'Пожалуйста, проверьте правильность ввода'."<br/>". 'реквизитов Вашей карты.';break;} if($_POST == 23){ echo 'Ваш платеж отклонен.'."<br/>". 'Пожалуйста, проверьте правильность'."<br/>". 'ввода реквизитов Вашей карты.';break;} if($_POST == 32){ echo 'Извините.'."<br/>". 'Проведение платежей временно недоступно,'."<br/>". 'попробуйте позже.';break;} if($_POST == 34){ echo 'Аутентификация по стандарту 3-D Secure прошла с ошибкой.'."<br/>". 'Пожалуйста, обратитесь в Ваш банк эмитент.';break;} if($_POST == 38){ echo 'Проведение платежа по Вашей карте в данный момент невозможно.'."<br/>". 'Возможная причина – по Вашей карте не разрешены расчеты в Интернет.'."<br/>". 'Пожалуйста, обратитесь в Ваш Банк-Эмитент.';break;} if($_POST == 39 or $_POST == 52){ echo 'Извините.'."<br/>". 'Проведение платежей временно недоступно,'."<br/>". 'попробуйте позже.';break;} if($_POST == 36){ echo 'Извините.'."<br/>". 'Транзакция отменена клиентом';break;} if($_POST == 35 or $_POST == 50){ echo 'Извините.'."<br/>". 'Платеж отклонен.'."<br/>". 'Обратитесь к администратору Вашего Интернет-магазина.';break;} if($_POST == 40 or $_POST == 53){ echo 'Извините.'."<br/>". 'Платеж отклонен.'."<br/>". 'Обратитесь к администратору Вашего Интернет-магазина.';break;} if($_POST == 401 or $_POST == 4501 or $_POST == 1821){ echo 'Пожалуйста, закройте окно браузера'."<br/>". 'и повторите платеж заново.'."<br/>". 'Предыдущий платеж не был завершен.';break;} if($_POST == 90){ echo 'Извините.'."<br/>". 'Проведение платежей временно недоступно,'."<br/>". 'попробуйте позже.';break;} } // Записываем в базу данных лог принятых от банка post-параметров $log=''; foreach($_POST as $key=>$value){$log.="$key=$value"."|";} $qpost = "INSERT INTO `#__privat_log` (`direction`,`postnamevalue`,`recorddatetime`) VALUES('Прием из банка','$log','$datetime')"; $dbpost = JFactory::getDBO(); $dbpost->setQuery($qpost); $dbpost->query(); // no closing tag Как вы видите код не дюже замысловатый и нет проверки signature (подписи банка ) как требует «Руководство по подключению..» (вдруг ответ от банка на самом деле не от банка а от Саддама Хусейна с того света) — ну да ладно для начала и так сойдет. Не забываем про бэкап. Устанавливаем наш модуль по процедуре описанной выше для плагина испольуя файлы mod_privat_answer_processing.php и mod_privat_answer_processing.xml После установки и публикации нашего модуля (позицию в настройка модуля не задаем) создаем пустую статью с названием например «Банк сообщает» и нажав кнопку «Вставить модуль» выбираем наш mod_privat_answer_processing Публикуем статью без какой либо привязки к меню. Запоминаем id этой статьи у меня это 84 Идем в Virtuemart – способы оплаты и в настройках нашего плагина в поле merRespURL вводим следующий URL https://ваш сайт/index.php?option=com_content&view=article&id=84 The END ИСТОЧНИК - herch, 11 апр 2013
Вложения:
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от Олег Коровяков.
|
Модераторы: Дмитрий