<?php
/* Оплата через A1Pay */
class system_of_pay_handler
{
	// Секретный ключ
	var $password = "12345";

	// Идентификатор рублей = 1
	var $currency_id = 1;

	// Ключ, присваеваемый магазину системой A1Pay, при создании кнопки
	var $key = "qwertyuiop";

	// Запускаем обработчик платежной системы
	function Execute()
	{
		// Пришло подтверждение оплаты, обработаем его
		if (isset($_REQUEST['order_id']))
		{
			$this->ProcessResult();
			return true;
		}

		// Иначе оформляем заказ и отображаем стартовую страницу для оплаты через A1Pay
		$this->ShowPurseRequest();
	}

	// Обработка ответа платежной системы
	function ProcessResult()
	{
		// Информация о заказе
		$order_id = to_int($_REQUEST['order_id']);

		if (!$order_id)
		{
			return false;
		}

		$shop = & singleton('shop');

		$order_row = $shop->GetOrder($order_id);

		// Заказ не найден или уже оплачен
		if (!$order_row || $order_row['shop_order_status_of_pay'])
		{
			return false;
		}

		$shop_row = $shop->GetShop($order_row['shop_shops_id']);

		// чтение полученных параметров
		$tid = to_str($_REQUEST["tid"]);
		$name = to_str($_REQUEST["name"]);
		$comment = to_str($_REQUEST["comment"]);
		$partner_id = to_str($_REQUEST["partner_id"]);
		$service_id = to_str($_REQUEST["service_id"]);
		$type = to_str($_REQUEST["type"]);
		$partner_income = to_str($_REQUEST["partner_income"]);
		$system_income = to_str($_REQUEST["system_income"]);

		$a1pay_hash = to_str($_REQUEST["check"]);

		$data = array
		(
			'tid' => $_POST['tid'],
			'name' => $_POST['name'],
			'comment' => $_POST['comment'],
			'partner_id' => $_POST['partner_id'],
			'service_id' => $_POST['service_id'],
			'order_id' => $_POST['order_id'],
			'type' => $_POST['type'],
			'partner_income' => $_POST['partner_income'],
			'system_income' => $_POST['system_income']
		);

		$our_hash = md5(join('', array_values($data)) . $this->password);

		// Устанавливаем параметры, которые не зависят от совпадения хешей
		$param['id'] = $order_row['shop_order_id'];
		$param['shop_shops_id'] = $order_row['shop_shops_id'];


		$shop_row = $shop->GetShop($order_row['shop_shops_id']);
			
		/* Делаем перерасчет суммы в валюту */
		$shop_currency_id = $shop_row['shop_currency_id'];

		/* Определяем коэффициент пересчета */
		$coefficient = $shop->GetCurrencyCoefficientToShopCurrency($shop_currency_id, $this->currency_id);

		$currency_row = $shop->GetCurrency($shop_currency_id);

		$order_sum = $shop->GetOrderSum($order_id);

		// округляем до десятых после запятой
		$sum = round($order_sum * $coefficient, 2);

		// Сравниваем хэши
		if ($a1pay_hash == $our_hash)
		{
			if(to_float($_POST['partner_income']) == floatval($sum))
			{
				// суммы совпали, можно отдавать товар

				$param['system_information'] = "Товар оплачен через A1Pay.\n\n"
				. "Информация:\n\n"
				. "ID транзакции A1Pay: {$_POST['tid']}\n"
				. "Id партнера: {$_POST['partner_id']}\n"
				. "Id сервиса: {$_POST['service_id']}\n"
				. "Id заказа: {$_POST['order_id']}\n"
				. "Тип оплаты: {$_POST['type']}\n"
				. "\n";

				// Обновляем информацию о заказе
				$shop->InsertOrder($param);

				// Изменяем статус оплаты ПОСЛЕ ОБНОВЛЕНИЯ ИНФОРМАЦИ, генерируем ссылки для эл.товаров, списываем товары
				$shop->SetOrderPaymentStatus($order_id);

				$structure = & singleton('Structure');

				$structure_row = $structure->GetStructureItem(to_int($shop_row['structure_id']));

				$lib = & singleton('lib');

				$LA = $lib->LoadLibPropertiesValue(to_int($structure_row['lib_id']), to_int($structure_row['structure_id']));

				$order_row = $shop->GetOrder($order_id);

				// Отправляем письмо администратору о подтверждении платежа
				$shop->SendMailAboutOrder($order_row['shop_shops_id'], $order_id, $order_row['site_users_id'],
				to_str($LA['xsl_letter_to_admin']),
				to_str($LA['xsl_letter_to_user']),
				$order_row['shop_order_users_email'],
				array(
				'admin-content-type' => 'html',
				'user-content-type' => 'html',
				'admin-subject' => sprintf($GLOBALS['MSG_shops']['shop_order_confirm_admin_subject'], $order_id, $shop_row['shop_shops_name'], $order_row['shop_order_date_of_pay']),
				'user-subject' => sprintf($GLOBALS['MSG_shops']['shop_order_confirm_user_subject'], $order_id, $shop_row['shop_shops_name'], $order_row['shop_order_date_of_pay']),
				'email_from_admin' => $order_row['shop_order_users_email']));
			}
			else
			{
				$param['system_information'] = 'Сумма не совпала!';
					
				// Обновляем информацию о заказе
				$shop->InsertOrder($param);
			}
		}
		else
		{
			$param['system_information'] = 'Хэш не совпал!';
				
			// Обновляем информацию о заказе
			$shop->InsertOrder($param);
		}
	}

	/**
	 * Отображает стартовую страницу для оплаты через Web Money.
	 *
	 */
	function ShowPurseRequest()
	{
		$shop = & singleton('shop');

		$system_of_pay_id = to_int($_SESSION['system_of_pay_id']);

		$row_system_of_pay = $shop->GetSystemOfPay($system_of_pay_id);

		if ($row_system_of_pay)
		{
			$shop_id = $row_system_of_pay['shop_shops_id'];
		}
		else
		{
			return false;
		}

		/* Получаем id текущего пользователя сайта */
		if (class_exists('SiteUsers'))
		{
			/* Получаем id текущего пользователя сайта */
			$SiteUsers = & singleton('SiteUsers');
				
			$site_users_id = $SiteUsers->GetCurrentSiteUser();
		}
		else
		{
			$site_users_id = false;
		}

		// статус платежа, по умолчанию 0
		$order_row['status_of_pay'] = 0;

		// дата платежа, по умолчанию пустая строка
		$order_row['date_of_pay'] = '';

		$order_row['description'] = to_str($_SESSION['description']);

		// описание и системная информация, по умолчанию пустая строка
		if (to_str($_SESSION['shop_coupon_text']) != '')
		{
			$order_row['description'] .= "Купон на скидку: ".to_str($_SESSION['shop_coupon_text'])."\n";
		}

		if (!isset($_SESSION['last_order_id']))
		{
			$_SESSION['last_order_id'] = 0;
		}

		// Если заказ еще не был оформлен
		if ($_SESSION['last_order_id'] == 0)
		{
			/* Оформляем заказ */
			$order_id = $shop->ProcessOrder($shop_id, $site_users_id, $system_of_pay_id, $order_row);
		}
		else
		{
			$order_id = $_SESSION['last_order_id'];
		}

		// Оформление заказа произошло успешно
		if ($order_id > 0)
		{
			if (!class_exists('SiteUsers'))
			{
				/* Класс пользователей сайта не существует, дописываем информацию о заказчике
				 в поле shop_order_description из текущей сессии */
				if ($order_row)
				{
					/* Описание заказчика */
					$order_row['description'] .= "Информация о заказчике:\n"
					."Имя: ".to_str($_SESSION['site_users_name'])."\n"
					."Фамилия: ".to_str($_SESSION['site_users_surname'])."\n"
					."Отчество: ".to_str($_SESSION['site_users_patronymic'])."\n"
					."E-Mail: ".to_str($_SESSION['site_users_email'])."\n"
					."Телефон: ".to_str($_SESSION['site_users_phone'])."\n"
					."Факс: ".to_str($_SESSION['site_users_fax'])."\n"
					."Адрес: ".to_str($_SESSION['full_address'])."\n";

					/* Дополнительная информация о заказе */
					$order_row['system_information'] = to_str($_SESSION['system_information']);

					/* Обязательно добавляем идентификатор! */
					$order_row['id'] = $order_id;

					$shop->InsertOrder($order_row);
				}
			}
				
			$order_row = $shop->GetOrder($order_id);
				
			if ($order_row)
			{
				$this->PrintOrder($order_id);
			}
				
			$shop_row = $shop->GetShop($shop_id);

			if ($_SESSION['last_order_id'] == 0)
			{
				$structure = & singleton('Structure');
				$structure_row = $structure->GetStructureItem(to_int($shop_row['structure_id']));

				$lib = new lib();
				$LA = $lib->LoadLibPropertiesValue(to_int($structure_row['lib_id']), to_int($structure_row['structure_id']));

				$date_str = date("d.m.Y H:i:s");

				if (trim(to_str($order_row['shop_order_account_number'])) != '')
				{
					$shop_order_account_number = trim(to_str($order_row['shop_order_account_number']));
				}
				else
				{
					$shop_order_account_number = $order_id;
				}

				/* Отправляем письмо заказчику */
				$shop->SendMailAboutOrder($shop_id,
				$order_id,
				$site_users_id,
				to_str($LA['xsl_letter_to_admin']),
				to_str($LA['xsl_letter_to_user']),
				$order_row['shop_order_users_email'],
				array('admin-content-type' => 'html',
				'user-content-type' => 'html',
				'admin-subject' => sprintf($GLOBALS['MSG_shops']['shop_order_admin_subject'], $shop_order_account_number, $shop_row['shop_shops_name'], $date_str),
				'user-subject' => sprintf($GLOBALS['MSG_shops']['shop_order_user_subject'], $shop_order_account_number, $shop_row['shop_shops_name'], $date_str),
				'email_from_admin' => $order_row['shop_order_users_email']));
			}
				
			// Сохраняем ID последнего оформленного заказа ТОЛЬКО ПОСЛЕ ОТПРАВКИ ПИСЬМА
			$_SESSION['last_order_id'] = $order_id;
		}
		else
		{
			switch ($order_id)
			{
				case -1:
					{
						?>
<div id="error">Ошибка вставки заказа в базу данных. Обратитесь к
администратору.</div>
						<?php
						break;
					}
case -2:
	{
		?>
<div id="error">Ошибка - не найден магазин. Обратитесь к администратору.</div>
		<?php
		break;
	}
case -3:
	{
		?>
<div id="error">Ошибка - корзина пуста. Добавьте товар в корзину и
оформите заказ.</div>
		<?php
		break;
	}
			}
		}

		return true;
	}

	/**
	 * Метод для отображения формы заказа для печати.
	 *
	 * @param int $order_id идентификатор заказа
	 */
	function PrintOrder($order_id)
	{
		$shop = & singleton('shop');

		$order_row = $shop->GetOrder($order_id);

		if (!$order_row)
		{
			return false;
		}

		if ($order_row)
		{
			$shop_row = $shop->GetShop($order_row['shop_shops_id']);
				
			/* Делаем перерасчет суммы в валюту */
			$shop_currency_id = $shop_row['shop_currency_id'];

			/* Определяем коэффициент пересчета */
			$coefficient = $shop->GetCurrencyCoefficientToShopCurrency($shop_currency_id, $this->currency_id);

			$currency_row = $shop->GetCurrency($shop_currency_id);

			$order_sum = $shop->GetOrderSum($order_id);
				
			// округляем до десятых после запятой
			$sum = round($order_sum * $coefficient, 2);

			/* Информация об алиасе сайта */
			$site = & singleton ('site');
				
			$site_alias = $site->GetCurrentAlias($shop_row['site_id']);

			/* Получаем путь к магазину */
			$Structure = & singleton('Structure');
				
			$shop_path = "/".$Structure->GetStructurePath($shop_row['structure_id'], 0);

			$handler_url = 'http://'.$site_alias.$shop_path;

			// Определяем город
			$row_city = $shop->GetCity($order_row['shop_city_id']);
				
			$city_name = to_str($row_city['shop_city_name']);
				
			?>
<h1>Оплата через систему A1Pay</h1>
<p>Сумма к оплате составляет <strong><?php echo $sum?> <?php echo $currency_row['shop_currency_name']?></strong></p>
<p>Для оплаты нажмите кнопку "Оплатить".</p>
<p style="color: rgb(112, 112, 112);">Внимание! Нажимая
&laquo;Оплатить&raquo; Вы подтверждаете передачу контактных данных на
сервер A1Pay для оплаты.</p>
<form name="form1" action="https://partner.a1pay.ru/a1lite/input"
	method="POST" accept-charset="utf-8"><input type="hidden" name="key"
	value="<?php echo $this->key?>" /> <input type="hidden" name="cost"
	value="<?php echo $sum?>" /> <input type="hidden" name="name"
	value="Заказ №<?php echo $order_id?>" /> <input type="hidden"
	name="default_email" value="" /> <input type="hidden" name="order_id"
	value="<?php echo $order_id?>" /> <input type="hidden" name="comment"
	value="accept_a1pay" /> <input type="submit" name="submit"
	value="Оплатить <?php echo $sum?> <?php echo $currency_row['shop_currency_name']?>">
</form>
			<?php
		}
	}
}
?>