Модуль оплаты через Сбербанк России для 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 строка ж написано,

Комментарии:
 | 

Оставить комментарий
Никнейм:
Комментарий:
Ваш комментарий: