Модуль оплаты через Сбербанк России для Drupal 5 + ubercart
В этой статье я расскажу о том как я писал модуль оплаты через банк (Сбербанк России) для CMS Drupal 5 с установленным Ubercart.
Для начала погуглив, я нашёл модуль под шестой Друпал, но мне требовался модуль исключительно под пятый Друпал. Взяв напильник, стал обрабатывать, о чём и хочу рассказать. Вот ссылка, по которой можно скачать модуль uc_sberbank для шестого Друпала (кстати, модуль писала дама!).
Для моей задачи были необходимы следующие способы оплаты:
- Наложенным платежом
- Наличными при получении
- Оплата по квитанции Сбербанка России
- Безналичный расчёт
Все эти способы я добавил в модуль Анны (создательницы первоначального модуля). Предоставляю вашему вниманию код с комментариями (это файл uc_sberbank.module):
<?php
// $Id: uc_sberbank.module$
/**
** uc_sberbank for Drupal 5
** @author Anna Lubkova
** @author Konstantin O Zavalny
**/
/**
* Implementation of hook_menu()
*/
function uc_sberbank_menu() {
die('menu');
$items = array();
$items['uc_sberbank_blank'] = array(
'title' => 'Sberbank blank',
'access callback' =>TRUE,
'page callback' => 'uc_sberbank_blank',
'type' => MENU_CALLBACK
);
return $items;
}
//Функция, формирующая бланк квитанции
function uc_sberbank_blank($form) {
if (empty($form['form_order']['#value'])){
//return t("Not valid order number");
}else{
$num = $form['form_order']['#value'];
$order = uc_order_load($num);
// завершаем заказ
//uc_cart_complete_sale($order); //эта функция доступна только для 6-й версии, юзаем эту:
uc_cart_checkout_complete();
uc_order_comment_save($order_id, 0, t('A payment has been accepted.'), 'admin');
// создаем изображение квитанции
$path = base_path() . drupal_get_path('module', 'uc_sberbank');
$path = substr($path,1);
$np = $path."/images/blank.jpg";
$image = @imagecreatefromjpeg($np);
if(!$image){
return t("Error! File blank.jpg not found");
}
$total = $order->order_total;
$rub = floor($order->order_total);
$kop = ($total - $rub)*100;
if (strlen($kop)<2) $kop = '0'.$kop;
$date = date('d.m.Y',$order->modified);
$textcolor = imagecolorallocate($image, 0, 0, 0);
imagettftext($image,12,0,280,20,$textcolor,$path.'/times.ttf',variable_get('uc_sberbank_name',''));
imagettftext($image,12,0,240,44,$textcolor,$path.'/times.ttf',variable_get('uc_sberbank_kpp',''));
imagettftext($image,12,0,380,44,$textcolor,$path.'/times.ttf',variable_get('uc_sberbank_inn',''));
imagettftext($image,12,0,280,68,$textcolor,$path.'/times.ttf',variable_get('uc_sberbank_okato',''));
imagettftext($image,12,0,420,68,$textcolor,$path.'/times.ttf',variable_get('uc_sberbank_account',''));
imagettftext($image,12,0,220,93,$textcolor,$path.'/times.ttf',variable_get('uc_sberbank_bank',''));
imagettftext($image,12,0,240,116,$textcolor,$path.'/times.ttf',variable_get('uc_sberbank_bik',''));
imagettftext($image,12,0,355,116,$textcolor,$path.'/times.ttf',variable_get('uc_sberbank_ca',''));
imagettftext($image,12,0,260,164,$textcolor,$path.'/times.ttf',"Оплата заказа № $num от $date ");
imagettftext($image,12,0,290,187,$textcolor,$path.'/times.ttf',$order->delivery_first_name.' '.$order->delivery_last_name);
imagettftext($image,12,0,330,211,$textcolor,$path.'/times.ttf',$order->delivery_city.', '.$order->delivery_street1);
imagettftext($image,12,0,250,259,$textcolor,$path.'/times.ttf',$rub);
imagettftext($image,12,0,332,259,$textcolor,$path.'/times.ttf',$kop);
imagettftext($image,12,0,280,337,$textcolor,$path.'/times.ttf',variable_get('uc_sberbank_name',''));
imagettftext($image,12,0,240,361,$textcolor,$path.'/times.ttf',variable_get('uc_sberbank_kpp',''));
imagettftext($image,12,0,380,361,$textcolor,$path.'/times.ttf',variable_get('uc_sberbank_inn',''));
imagettftext($image,12,0,280,385,$textcolor,$path.'/times.ttf',variable_get('uc_sberbank_okato',''));
imagettftext($image,12,0,420,385,$textcolor,$path.'/times.ttf',variable_get('uc_sberbank_account',''));
imagettftext($image,12,0,220,410,$textcolor,$path.'/times.ttf',variable_get('uc_sberbank_bank',''));
imagettftext($image,12,0,240,434,$textcolor,$path.'/times.ttf',variable_get('uc_sberbank_bik',''));
imagettftext($image,12,0,360,434,$textcolor,$path.'/times.ttf',variable_get('uc_sberbank_ca',''));
imagettftext($image,12,0,260,481,$textcolor,$path.'/times.ttf',"Оплата заказа № $num от $date ");
imagettftext($image,12,0,290,505,$textcolor,$path.'/times.ttf',$order->delivery_first_name.' '.$order->delivery_last_name);
imagettftext($image,12,0,330,528,$textcolor,$path.'/times.ttf',$order->delivery_city.', '.$order->delivery_street1);
imagettftext($image,12,0,250,577,$textcolor,$path.'/times.ttf',floor($order->order_total));
imagettftext($image,12,0,332,577,$textcolor,$path.'/times.ttf',$order->order_total % 1);
$dir = file_directory_path() .'/sberbank';
if (!is_dir($dir)) {
mkdir($dir,0777);
}
$path = file_directory_path() .'/sberbank/'.$num.'.jpg';
imagejpeg($image, $path, 100);
ImageDestroy($image);
// выводим пояснения для пользователя
$baseurl = url();
$url = url('user/'. $order->uid .'/order/'. $order->order_id);
$text = t('
Ваш заказ подтвержден Пожалуйста, оплатите счёт.<br />
Также, можете <a href="'.$baseurl.'">продолжить покупки</a>, либо <a href="@url">посмотреть статус заказа</a>, а также историю заказов.', array('@url'=>$url));
return '<p>'.$text.'<p>
<p><img src="'. $GLOBALS['base_url'] . '/' .$path.'"></p>';
}
}
//Метод оплаты - наложенный платёж. Ничего не делаем
function uc_payment_method_np($op, &$arg1){
return;
}
//Метод оплаты - безналичный расчёт. Параметр op - операция, которую в данный момент выполняет Друпал
function uc_payment_method_bn($op, &$arg1){
switch ($op){
//Операция "подробнее о кредитной карте" (ну, совсем и не карте, однако) - выводим форму для ввода пользовательских данных
case 'cart-details':
$return = '<table><tr><td>Название организации / ФИО предпринимателя:</td><td><input type="text" name="bn_name" size="40"></td></tr><tr><td>ИНН</td><td><input type="text" name="bn_inn" size="40" /></td></tr>';
$return .= '<tr><td>КПП</td><td><input type="text" name="bn_kpp" size="40" /></td></tr><tr><td>ОГРН</td><td><input type="text" name="bn_ogrn" size="40" /></td></tr>';
$return .= '<tr><td>ОКПО</td><td><input type="text" name="bn_okpo" size="40" /></td></tr><tr><td>р/с</td><td><input type="text" name="bn_rs" size="40" /></td></tr>';
$return .= '<tr><td>Название банка:</td><td><input type="text" name="bn_bankname" size="40" /></td></tr><tr><td>БИК</td><td><input type="text" name="bn_bik" size="40" /></td></tr>';
$return .= '<tr><td>к/с</td><td><input type="text" name="text" name="bn_ks" size="40" /></td></tr><tr><td>Почтовый адрес</td><td><input type="text" name="bn_adres" size="40" /></td></tr>';
$return .= '<tr><td>Телефон</td><td><input type="text" name="bn_telephone" size="40" /></td></tr></table>';
break;
//Операция "настройки" (из админки) - ничего не делаем
case 'settings':
break;
//Операция "Сохранить заказ" - сохраняем (пишем в базу данные)
case 'order-save':
$pbn = array();
foreach($_POST as $key => $val){
if (strpos($key, 'bn_')!==false){
$pbn[$key] = mysql_real_escape_string($val);
}
}
$sql = "INSERT INTO uc_payment_bn (order_id, bn_name, bn_inn, bn_kpp, bn_ogrn, bn_okpo, bn_rs, bn_bankname, bn_bik, bn_ks, bn_adres, bn_telephone) VALUES (".$arg1->order_id.", '".$pbn['bn_name']."', '".$pbn['bn_inn']."', '".$pbn['bn_kpp']."', '".$pbn['bn_ogrn']."', '".$pbn['bn_okpo']."', '".$pbn['bn_rs']."', '".$pbn['bn_bankname']."', '".$pbn['bn_bik']."', '".$pbn['bn_ks']."', '".$pbn['bn_adres']."', '".$pbn['bn_telephone']."')";
$r = db_query($sql);
if ($r===null){
print('Ошибка!');
}
break;
//Опреация "просмотр заказа" (из админки) - выводим данные из базы
case 'order-view':
$sql = "SELECT * FROM uc_payment_bn WHERE order_id = ".$arg1->order_id." LIMIT 1";
$r = db_query($sql);
$data = db_fetch_array($r);
$return = 'Название орг-ции '.$data['bn_name'].'<br />ИНН '.$data['bn_inn']."tКПП ".$data['bn_kpp'].'<br />ОГРН '.$data['bn_ogrn']."tОКПО ".$data['bn_okpo'].'<br />р/с '.$data['bn_rs']."<br />Банк ".$data['bn_bankname'].'<br />БИК '.$data['bn_bik']."tк/с ".$data['bn_ks'].'<br /> Адрес '.$data['bn_adres'].'<br />Телефон '.$data['bn_telephone'];
break;
default:
$return = $op;
}
return $return;
}
//Метод оплаты - Сбербанк. По аналогии, с предыдущей функцией
function uc_payment_method_sberbank($op, &$arg1) {
switch ($op) {
//"Подробнее о карте" - ничего не нужно, пользователь ввёл все свои необходимые данные выше в стандртных уберкартовских полях
case 'cart-details':
return;
//"Настройки в админке" - тут собираем данные от админа о получателе платежа (то, что будет в квитанции)
case 'settings':
// наименование получателя
$form['uc_sberbank_name'] = array(
'#type' => 'textfield',
'#title' => t('Name of recipient'),
'#default_value' => variable_get('uc_sberbank_name',''),
'#description' => t("Please enter name of recipient"),
);
// КПП получателя
$form['uc_sberbank_kpp'] = array(
'#type' => 'textfield',
'#title' => t('KPP'),
'#default_value' => variable_get('uc_sberbank_kpp',''),
'#description' => t("Please enter your KPP"),
);
// ИНН получателя
$form['uc_sberbank_inn'] = array(
'#type' => 'textfield',
'#title' => t('INN'),
'#default_value' => variable_get('uc_sberbank_inn',''),
'#description' => t("Please enter your INN"),
);
// ИНН получателя
$form['uc_sberbank_okato'] = array(
'#type' => 'textfield',
'#title' => t('OKATO'),
'#default_value' => variable_get('uc_sberbank_okato',''),
'#description' => t("Please enter your OKATO"),
);
// расчетный счет получателя
$form['uc_sberbank_account'] = array(
'#type' => 'textfield',
'#title' => t('Settlement account'),
'#default_value' => variable_get('uc_sberbank_account',''),
'#description' => t("Please enter your settlement account"),
);
// банк получателя
$form['uc_sberbank_bank'] = array(
'#type' => 'textfield',
'#title' => t('Bank'),
'#default_value' => variable_get('uc_sberbank_bank',''),
'#description' => t("Please enter name of your bank"),
);
// БИК
$form['uc_sberbank_bik'] = array(
'#type' => 'textfield',
'#title' => t('BIK'),
'#default_value' => variable_get('uc_sberbank_bik',''),
'#description' => t("Please enter BIK"),
);
// кор. счет
$form['uc_sberbank_ca'] = array(
'#type' => 'textfield',
'#title' => t('Correspondent account'),
'#default_value' => variable_get('uc_sberbank_ca',''),
'#description' => t("Please enter correspondent account"),
);
return $form;
case 'cart-process':
return;
}
}
function uc_sberbank_form_alter($form_id, &$form) {
if ($form_id == 'uc_cart_checkout_review_form' && ($order_id = intval($_SESSION['cart_order'])) > 0) {
$order = uc_order_load($order_id);
if ($order->payment_method == 'uc_sberbank') {
$form['#prefix'] = '<table><tr><td>';
$form['#suffix'] = '</td><td>'. drupal_get_form('uc_sberbank_submit_form', $order) .'</td></tr></table>';
}
}elseif (strpos(referer_uri(), 'cart/checkout/review')!==false){
print uc_sberbank_blank($form);
}
}
function uc_sberbank_submit_form(&order, $order2 = null) {
$form['form_order'] = array(
'#type' => 'hidden',
'#value' => $order->order_id,
);
$form['form_sum'] = array(
'#type' => 'hidden',
'#default_value' => $order->order_total,
);
return $form;
}
//а это основная функция
function uc_sberbank_payment_method() {
//путь к модулю
$path = base_path() . drupal_get_path('module', 'uc_sberbank');
//заголовок (имя) модуля
$title = t('Sberbank') . '<br /><img src="'. $path .'/images/sberbank.gif" style="position: relative; left: 2.5em;">';
//массив $methods - это массив методов оплаты, где
//id - уникальный идентификатор метода
//name - имя метода оплаты
//title - отображаемое имя (как видите, можно вставить рисунок... да что там рисунок - любой html)
//desc - описание метода оплаты
//callback - особо важный параметр: имя функции, которая вызовется, когда выберем конкретный способ оплаты
$methods[] = array(
'id' => 'uc_sberbank_np',
'name' => 'Наложенным платежом / наличными при получении',
'title' => 'Наложенным платежом / наличными при получении<!--<br /><img src="'. $path .'/images/sberbank.gif" style="position: relative; left: 2.5em;">-->',
'desc' => 'описалово',
'callback' => 'uc_payment_method_np',
'weight' => 1,
'checkout' => FALSE,
'no_gateway'=> TRUE
);
$methods[] = array(
'id' => 'uc_sberbank',
'name' => 'Оплата по квитанции Сбербанка РФ',
'title' => 'Оплата по квитанции Сбербанка РФ<br /><img src="'. $path .'/images/sberbank.gif" style="position: relative; left: 2.5em;">',
'desc' => t('Sberbank payment'),
'callback' => 'uc_payment_method_sberbank',
'weight' => 3,
'checkout' => TRUE,
'no_gateway' => TRUE,
);
$methods[] = array(
'id' => 'uc_sberbank_bn',
'name' => 'Безналичный расчёт',
'title' => 'Безналичный расчёт',
'desc' => 'описалово 2',
'callback' => 'uc_payment_method_bn',
'weight' => 5,
'checkout' => FALSE,
'no_gateway'=> TRUE
);
return $methods;
}
?>
Для записи данных о безналичном расчёте мы используем БД, поэтому
создадим таблицу:
CREATE TABLE IF NOT EXISTS `uc_payment_bn` ( `bn_id` int(11) NOT NULL AUTO_INCREMENT, `order_id` int(11) NOT NULL, `bn_name` text NOT NULL, `bn_inn` text NOT NULL, `bn_kpp` text NOT NULL, `bn_ogrn` text NOT NULL, `bn_okpo` text NOT NULL, `bn_rs` text NOT NULL, `bn_bankname` text NOT NULL, `bn_bik` text NOT NULL, `bn_ks` text NOT NULL, `bn_adres` text NOT NULL, `bn_telephone` text NOT NULL, PRIMARY KEY (`bn_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Также, необходимо внести изменения в файл uc_sberbank.info, а именно core=5.x, чтобы дать понять Друпалу, что наш модуль для пятой версии, и у dependencies убрать [] - описание зависимостей в пятой и шестой версиях Друпала немного отличаются.
Полную версию модуля можно скачать по ссылке. А в завершении напомню, что Drupal - это торговая марка Дриса Байертата :)
Предыдущая статья: Писать или не писать? Следующая статья: Руль CMS







Комментарии:
|
albee 18.01.2011 12:28
Здравствуйте. Когда закачиваю модуль на 5-ку и включаю его, полностью перестает работать сайт. То есть страница не доступна. Удаляю модуль, все работает... Что может быть?
albee 18.01.2011 12:58
Сейчас посмотрел сервер дает ошибку [Tue Jan 18 13:18:30 2011] [error] [client 93.124.10.158] PHP Parse error: syntax error, unexpected T_STRING, expecting T_VARIABLE in ......./modules/ubercart/sberbank/uc_sberbank.module on line 239
щщщ 26.04.2012 13:58
тык 239 строка ж написано,
Комментарии:
|