herch
Создатель
- Регистрация
- 17 Ноя 2012
- Сообщения
- 11
- Реакции
- 0
Вот метод переделки стандартного модуля оплаты под Приват24. Привожу полностью. Совместными усилиями можно сделать нормальный модуль
Для начала необходимо сходить по адресу Для просмотра ссылки Войди или Зарегистрируйся и скачать пакет документов по подключению магазина к платежной системе Приватбанка 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>alexboot@spk.in.ua</authorEmail>
<authorUrl>Для просмотра ссылки Войдиили Зарегистрируйся
<version>1.001</version>
<licence>GNU/GPL Для просмотра ссылки Войдиили Зарегистрируйся</licence>
<description>
<![CDATA[<p>Plugin for Privat24 payment <br />
(c) 2012 Boot Alexander<br />
После установки значения параметров соответствуют тестовому режиму. <br />
Подробности по подключению к банку смотри на Для просмотра ссылки Войдиили Зарегистрируйся]]>
</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="Для просмотра ссылки Войдиили Зарегистрируйся" label="BankURL" description="адрес сервера Sentry, на который должен отсылаться запрос по оплате" />
<param name="merRespURL" type="text" size="254" default="Для просмотра ссылки Войдиили Зарегистрируйся" 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['customer_notified'] = 1;
и меняем 1 на 0
$order['customer_notified'] = 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['details']['BT']->order_total), "vmorder-done-amount");
$html .= '</table>' . "\n";
вставляем свой код который определяет кнопку «Перейти к оплате картой ?»
В данном случае это html форма , обеспечивающая отображени пресловутой кнопки и передачу параметров в банк методом post (см. документацию скачанную с сайта приватбанка)
// Получение значений параметров плагина
$qparams = 'SELECT `payment_params` FROM `#__virtuemart_paymentmethods` WHERE `virtuemart_paymentmethod_id`="' .$order['details']['BT']->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['Version'];
$MerID = $p['MerID'] ;
$MerRespURL = $p['merRespURL'];
$MerRespURL2 = "";
$AcqID = $p['AcqID'];
// $PurchaseAmt = round($order['details']['BT']->order_total,2)*100; //сумма в копейках грн. в боевом режиме раскоментировать
$PurchaseAmt = 100; // для теста 1 грн в боевом режиме закоментировать
while( strlen($PurchaseAmt)<12) {$PurchaseAmt="0".$PurchaseAmt;}
$PurchaseCurrency = $p['PurchaseCurrency'];
$PurchaseAmt2 = "";
$PurchaseCurrency2 = "";
$AdditionalData = "";
$Reversal = "";
$OrderID = 'TEST_SPKSHOPTESTMERCHANT_'.date("d/m/y")."_".date("H:i:s")."_".$order['details']['BT']->virtuemart_order_id;//Для теста
$PurchaseCurrencyExponent = $p['PurchaseCurrencyExponent'];
$SignatureMethod =$p['SignatureMetod'];
$str = $p['MerPsw'].$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['CaptureFlag'];
/* Форма передачи данных в банк */
$html.= '<form id="checkout" name="checkout" method="post" target="_blank"' ;
$html.= 'action="'.$p['BankURL'].'"';
$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['details']['BT']->order_total,2)*100; //сумма в копейках грн. в боевом режиме раскоментировать
$PurchaseAmt = 100; // для теста 1 грн в боевом режиме закоментировать
б)
$OrderID = 'TEST_SPKSHOPTESTMERCHANT_'.date("d/m/y")."_".date("H:i:s")."_".$order['details']['BT']->virtuemart_order_id;//Для теста в боевом режиме закоментировать
// $OrderID = 'SPKSHOP_MERCHANT_'.date("d/m/y")."_".date("H:i:s")."_".$order['details']['BT']->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 у.е в год). Ну короче не бесплатный гемморой.
Так вот если вы все таки решите что необходимо обрабатывать ответы банка по транзакциям на сайте магазина то предлагаю следующую схему
Идем на сайт Для просмотра ссылки Войдиили Зарегистрируйся и скачиваем бесплатную версию на мой взгляд очень полезного модуля 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>alexboot@spk.in.ua</authorEmail>
<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 />
Подробности по подключению к банку смотри на Для просмотра ссылки Войдиили Зарегистрируйся]]>
</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['ReasonCode']) {
case 1:
if ($_POST['ReasonCode'] == 1) {
echo 'Ваш платеж успешно завершен';}
else break;
break;
default:
if($_POST['ReasonCode'] == 4 or $_POST['ReasonCode'] == 3){
echo 'Платеж отклонен. Пожалуйста, обратитесь в Ваш банк-эмитент.';break; }
if($_POST['ReasonCode'] == 2){
echo 'Платеж отклонен. Пожалуйста, обратитесь в Ваш банк-эмитент.'."<br/>".
'Проверьте возможные причины: '."<br/>".
'- неверный ввод реквизитов Вашей карты'."<br/>".
'- недостаточно средств на счете'."<br/>".
'- по Вашей карте не разрешены расчеты в Интернет';break;}
if($_POST['ReasonCode'] == 13){
echo 'Извините, Ваш платеж отклонен.'."<br/>".
'В данном Интернет-магазине не возможна оплата по картам'."<br/>".
'данной платежной системы ';break;}
if($_POST['ReasonCode'] == 14){
echo 'При проведении транзакции неверно указана валюта платежа'."<br/>".
'Валюта платежа отличная от разрешенной для мерчанта.';break;}
if($_POST['ReasonCode'] == 15){
echo 'Извините.'."<br/>".
'Проведение платежей временно недоступно,'."<br/>".
'попробуйте позже.';break;}
if($_POST['ReasonCode'] == 18){
echo 'Ваш платеж отклонен.'."<br/>".
'Пожалуйста, проверьте правильность ввода'."<br/>".
'реквизитов Вашей карты.';break;}
if($_POST['ReasonCode'] == 23){
echo 'Ваш платеж отклонен.'."<br/>".
'Пожалуйста, проверьте правильность'."<br/>".
'ввода реквизитов Вашей карты.';break;}
if($_POST['ReasonCode'] == 32){
echo 'Извините.'."<br/>".
'Проведение платежей временно недоступно,'."<br/>".
'попробуйте позже.';break;}
if($_POST['ReasonCode'] == 34){
echo 'Аутентификация по стандарту 3-D Secure прошла с ошибкой.'."<br/>".
'Пожалуйста, обратитесь в Ваш банк эмитент.';break;}
if($_POST['ReasonCode'] == 38){
echo 'Проведение платежа по Вашей карте в данный момент невозможно.'."<br/>".
'Возможная причина – по Вашей карте не разрешены расчеты в Интернет.'."<br/>".
'Пожалуйста, обратитесь в Ваш Банк-Эмитент.';break;}
if($_POST['ReasonCode'] == 39 or $_POST['ReasonCode'] == 52){
echo 'Извините.'."<br/>".
'Проведение платежей временно недоступно,'."<br/>".
'попробуйте позже.';break;}
if($_POST['ReasonCode'] == 36){
echo 'Извините.'."<br/>".
'Транзакция отменена клиентом';break;}
if($_POST['ReasonCode'] == 35 or $_POST['ReasonCode'] == 50){
echo 'Извините.'."<br/>".
'Платеж отклонен.'."<br/>".
'Обратитесь к администратору Вашего Интернет-магазина.';break;}
if($_POST['ReasonCode'] == 40 or $_POST['ReasonCode'] == 53){
echo 'Извините.'."<br/>".
'Платеж отклонен.'."<br/>".
'Обратитесь к администратору Вашего Интернет-магазина.';break;}
if($_POST['ReasonCode'] == 401 or $_POST['ReasonCode'] == 4501 or $_POST['ReasonCode'] == 1821){
echo 'Пожалуйста, закройте окно браузера'."<br/>".
'и повторите платеж заново.'."<br/>".
'Предыдущий платеж не был завершен.';break;}
if($_POST['ReasonCode'] == 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
Для просмотра ссылки Войдиили Зарегистрируйся сайт/index.php?option=com_content&view=article&id=84
The END
Создавать плагин будем для платформы 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>alexboot@spk.in.ua</authorEmail>
<authorUrl>Для просмотра ссылки Войди
<version>1.001</version>
<licence>GNU/GPL Для просмотра ссылки Войди
<description>
<![CDATA[<p>Plugin for Privat24 payment <br />
(c) 2012 Boot Alexander<br />
После установки значения параметров соответствуют тестовому режиму. <br />
Подробности по подключению к банку смотри на Для просмотра ссылки Войди
</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="Для просмотра ссылки Войди
<param name="merRespURL" type="text" size="254" default="Для просмотра ссылки Войди
<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['customer_notified'] = 1;
и меняем 1 на 0
$order['customer_notified'] = 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['details']['BT']->order_total), "vmorder-done-amount");
$html .= '</table>' . "\n";
вставляем свой код который определяет кнопку «Перейти к оплате картой ?»
В данном случае это html форма , обеспечивающая отображени пресловутой кнопки и передачу параметров в банк методом post (см. документацию скачанную с сайта приватбанка)
// Получение значений параметров плагина
$qparams = 'SELECT `payment_params` FROM `#__virtuemart_paymentmethods` WHERE `virtuemart_paymentmethod_id`="' .$order['details']['BT']->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['Version'];
$MerID = $p['MerID'] ;
$MerRespURL = $p['merRespURL'];
$MerRespURL2 = "";
$AcqID = $p['AcqID'];
// $PurchaseAmt = round($order['details']['BT']->order_total,2)*100; //сумма в копейках грн. в боевом режиме раскоментировать
$PurchaseAmt = 100; // для теста 1 грн в боевом режиме закоментировать
while( strlen($PurchaseAmt)<12) {$PurchaseAmt="0".$PurchaseAmt;}
$PurchaseCurrency = $p['PurchaseCurrency'];
$PurchaseAmt2 = "";
$PurchaseCurrency2 = "";
$AdditionalData = "";
$Reversal = "";
$OrderID = 'TEST_SPKSHOPTESTMERCHANT_'.date("d/m/y")."_".date("H:i:s")."_".$order['details']['BT']->virtuemart_order_id;//Для теста
$PurchaseCurrencyExponent = $p['PurchaseCurrencyExponent'];
$SignatureMethod =$p['SignatureMetod'];
$str = $p['MerPsw'].$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['CaptureFlag'];
/* Форма передачи данных в банк */
$html.= '<form id="checkout" name="checkout" method="post" target="_blank"' ;
$html.= 'action="'.$p['BankURL'].'"';
$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['details']['BT']->order_total,2)*100; //сумма в копейках грн. в боевом режиме раскоментировать
$PurchaseAmt = 100; // для теста 1 грн в боевом режиме закоментировать
б)
$OrderID = 'TEST_SPKSHOPTESTMERCHANT_'.date("d/m/y")."_".date("H:i:s")."_".$order['details']['BT']->virtuemart_order_id;//Для теста в боевом режиме закоментировать
// $OrderID = 'SPKSHOP_MERCHANT_'.date("d/m/y")."_".date("H:i:s")."_".$order['details']['BT']->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 у.е в год). Ну короче не бесплатный гемморой.
Так вот если вы все таки решите что необходимо обрабатывать ответы банка по транзакциям на сайте магазина то предлагаю следующую схему
Идем на сайт Для просмотра ссылки Войди
Теперь создаем свой модуль обработки ответов банка который состоит из двух файлов
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>alexboot@spk.in.ua</authorEmail>
<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 />
Подробности по подключению к банку смотри на Для просмотра ссылки Войди
</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['ReasonCode']) {
case 1:
if ($_POST['ReasonCode'] == 1) {
echo 'Ваш платеж успешно завершен';}
else break;
break;
default:
if($_POST['ReasonCode'] == 4 or $_POST['ReasonCode'] == 3){
echo 'Платеж отклонен. Пожалуйста, обратитесь в Ваш банк-эмитент.';break; }
if($_POST['ReasonCode'] == 2){
echo 'Платеж отклонен. Пожалуйста, обратитесь в Ваш банк-эмитент.'."<br/>".
'Проверьте возможные причины: '."<br/>".
'- неверный ввод реквизитов Вашей карты'."<br/>".
'- недостаточно средств на счете'."<br/>".
'- по Вашей карте не разрешены расчеты в Интернет';break;}
if($_POST['ReasonCode'] == 13){
echo 'Извините, Ваш платеж отклонен.'."<br/>".
'В данном Интернет-магазине не возможна оплата по картам'."<br/>".
'данной платежной системы ';break;}
if($_POST['ReasonCode'] == 14){
echo 'При проведении транзакции неверно указана валюта платежа'."<br/>".
'Валюта платежа отличная от разрешенной для мерчанта.';break;}
if($_POST['ReasonCode'] == 15){
echo 'Извините.'."<br/>".
'Проведение платежей временно недоступно,'."<br/>".
'попробуйте позже.';break;}
if($_POST['ReasonCode'] == 18){
echo 'Ваш платеж отклонен.'."<br/>".
'Пожалуйста, проверьте правильность ввода'."<br/>".
'реквизитов Вашей карты.';break;}
if($_POST['ReasonCode'] == 23){
echo 'Ваш платеж отклонен.'."<br/>".
'Пожалуйста, проверьте правильность'."<br/>".
'ввода реквизитов Вашей карты.';break;}
if($_POST['ReasonCode'] == 32){
echo 'Извините.'."<br/>".
'Проведение платежей временно недоступно,'."<br/>".
'попробуйте позже.';break;}
if($_POST['ReasonCode'] == 34){
echo 'Аутентификация по стандарту 3-D Secure прошла с ошибкой.'."<br/>".
'Пожалуйста, обратитесь в Ваш банк эмитент.';break;}
if($_POST['ReasonCode'] == 38){
echo 'Проведение платежа по Вашей карте в данный момент невозможно.'."<br/>".
'Возможная причина – по Вашей карте не разрешены расчеты в Интернет.'."<br/>".
'Пожалуйста, обратитесь в Ваш Банк-Эмитент.';break;}
if($_POST['ReasonCode'] == 39 or $_POST['ReasonCode'] == 52){
echo 'Извините.'."<br/>".
'Проведение платежей временно недоступно,'."<br/>".
'попробуйте позже.';break;}
if($_POST['ReasonCode'] == 36){
echo 'Извините.'."<br/>".
'Транзакция отменена клиентом';break;}
if($_POST['ReasonCode'] == 35 or $_POST['ReasonCode'] == 50){
echo 'Извините.'."<br/>".
'Платеж отклонен.'."<br/>".
'Обратитесь к администратору Вашего Интернет-магазина.';break;}
if($_POST['ReasonCode'] == 40 or $_POST['ReasonCode'] == 53){
echo 'Извините.'."<br/>".
'Платеж отклонен.'."<br/>".
'Обратитесь к администратору Вашего Интернет-магазина.';break;}
if($_POST['ReasonCode'] == 401 or $_POST['ReasonCode'] == 4501 or $_POST['ReasonCode'] == 1821){
echo 'Пожалуйста, закройте окно браузера'."<br/>".
'и повторите платеж заново.'."<br/>".
'Предыдущий платеж не был завершен.';break;}
if($_POST['ReasonCode'] == 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
Для просмотра ссылки Войди
The END