Обработчик платежной системы Interkassa
1. В разделе «Справочники» -> «Платежные системы»(в центре администрирования внутри вашего магазина) создайте новую платежную систему «Interkassa» и в поле «Обработчик» вставьте код:
<?php
/*
* Платёжная система Interkassa
*/
class Shop_Payment_System_Handler19 extends Shop_Payment_System_Handler
{
// Идентификатор магазина в системе Interkassa
protected $_ik_shop_id = "XXX";
//Секретный ключ (Secret Key) в системе Interkassa
protected $_ik_secret_key = "YYY";
// Код валюты в магазине HostCMS для валюты платежа в личном кабинете Интеркассы
protected $_interkassa_currency = 3;
/*
* Метод, запускающий выполнение обработчика
*/
public function execute()
{
parent::execute();
$this->printNotification();
return $this;
}
protected function _processOrder()
{
parent::_processOrder();
// Установка XSL-шаблонов в соответствии с настройками в узле структуры
$this->setXSLs();
// Отправка писем клиенту и пользователю
$this->send();
return $this;
}
public function paymentProcessing()
{
// Пришло подтверждение оплаты, обработаем его
if (isset($_REQUEST['ik_payment_id']))
{
$this->ProcessResult();
return TRUE;
}
}
/*
* Обработка статуса оплаты
*/
function ProcessResult()
{
$eshopId = Core_Array::getRequest('ik_shop_id');
if ($eshopId != $this->_ik_shop_id
|| $this->_shopOrder->paid
|| is_null($paymentStatus = Core_Array::getRequest('ik_payment_state'))
|| $paymentStatus != 'success')
{
return FALSE;
}
// Проверяем контрольную подпись
$ik_shop_id = Core_Array::getRequest('ik_shop_id');
$ik_payment_amount = Core_Array::getRequest('ik_payment_amount');
$ik_payment_id = Core_Array::getRequest('ik_payment_id');
$ik_payment_desc = Core_Array::getRequest('ik_payment_desc');
$ik_paysystem_alias = Core_Array::getRequest('ik_paysystem_alias');
$ik_baggage_fields = Core_Array::getRequest('ik_baggage_fields');
$ik_payment_state = Core_Array::getRequest('ik_payment_state');
$ik_trans_id = Core_Array::getRequest('ik_trans_id');
$ik_currency_exch = Core_Array::getRequest('ik_currency_exch');
$ik_fees_payer = Core_Array::getRequest('ik_fees_payer');
$str_md5 = md5($ik_shop_id.':'.$ik_payment_amount.':'.$ik_payment_id.':'.$ik_paysystem_alias.':'.$ik_baggage_fields.':'.$ik_payment_state.':'.$ik_trans_id.':'.$ik_currency_exch.':'.$ik_fees_payer.':'.$this->_ik_secret_key);
if (strtoupper($str_md5) == Core_Array::getRequest('ik_sign_hash', ''))
{
$this->_shopOrder->system_information = sprintf("Товар оплачен через Interkassa.\nАтрибуты:\nНомер сайта продавца: %s\nВнутренний номер покупки продавца: %s\nСумма платежа: %s\nВалюта платежа: %s\nНомер счета в системе RBK Mone: %s\nДата и время выполнения платежа: %s\nСтатус платежа: 5 - Платеж зачислен\n",
$ik_shop_id, $this->_shopOrder->id, $ik_payment_amount,
$ik_currency_exch, $ik_payment_id, $ik_payment_state);
$this->_shopOrder->paid();
$this->setXSLs();
$this->send();
}
}
public function getSumWithCoeff()
{
return Shop_Controller::instance()->round(($this->_interkassa_currency > 0
&& $this->_shopOrder->shop_currency_id > 0
? Shop_Controller::instance()->getCurrencyCoefficientInShopCurrency(
$this->_shopOrder->Shop_Currency,
Core_Entity::factory('Shop_Currency', $this->_interkassa_currency)
)
: 0) * $this->_shopOrder->getAmount());
}
public function getNotification()
{
$sum = $this->getSumWithCoeff();
$oSite_Alias = $this->_shopOrder->Shop->Site->getCurrentAlias();
$site_alias = !is_null($oSite_Alias) ? $oSite_Alias->name : '';
$shop_path = $this->_shopOrder->Shop->Structure->getPath();
$handler_url = 'http://'.$site_alias.$shop_path . "cart/?orderId={$this->_shopOrder->id}";
$successUrl = $handler_url . "&payment=success";
$failUrl = $handler_url . "&payment=fail";
$oShop_Currency = Core_Entity::factory('Shop_Currency')->find($this->_interkassa_currency);
if(!is_null($oShop_Currency->id))
{
$serviceName = 'Оплата счета N ' . $this->_shopOrder->id;
?>
<h1>Оплата через систему Interkassa</h1>
<p>
<a href="http://www.interkassa.com/" target="_blank">
<img src="http://www.interkassa.com/img/ik/interkassa_logo.gif" border="0" alt="Система электронных платежей">
</a>
</p>
<p>Сумма к оплате составляет <strong><?php echo $this->_shopOrder->sum()?></strong></p>
<p>Для оплаты нажмите кнопку "Оплатить".</p>
<p style="color: rgb(112, 112, 112);">
Внимание! Нажимая «Оплатить» Вы подтверждаете передачу контактных данных на сервер Interkassa для оплаты.
</p>
<form action="http://www.interkassa.com/lib/payment.php" method="POST">
<input type="hidden" name="ik_shop_id" value="<?php echo $this->_ik_shop_id?>">
<input type="hidden" name="ik_payment_amount" value="<?php echo $sum?>">
<input type="hidden" name="ik_payment_id" value="<?php echo $this->_shopOrder->id?>">
<input type="hidden" name="ik_payment_desc" value="<?php echo $serviceName?>">
<input type="hidden" name="ik_paysystem_alias" value="">
<input type="hidden" name="ik_success_url" value="<?php echo $successUrl?>">
<input type="hidden" name="ik_fail_url" value="<?php echo $failUrl?>">
<input type="hidden" name="ik_baggage_fields" value="<?php echo $_SESSION['hostcmsOrder']['description']?>">
<input type="submit" value="Оплатить">
</form>
<?php
}
}
public function getInvoice()
{
return $this->getNotification();
}
}
После вставки в этом коде в качестве значения переменной $_ik_shop_id вместо xxx введите идентификатор вашего магазина, а в качестве значения переменной $_ik_secret_key вместо yyy введите секретный ключ вашего магазина(эти данные можно посмотреть в настройках магазина в Interkassa).
2. В коде настроек типовой динамической страницы корзины после строки:
добавляете блок:
// ------------------------------------------------
// Обработка уведомления об оплате от Interkassa
// ------------------------------------------------
if (isset($_REQUEST['ik_shop_id']))
{
// Получаем ID заказа
$order_id = intval(Core_Array::getRequest('ik_payment_id'));
$oShop_Order = Core_Entity::factory('Shop_Order')->find($order_id);
if (!is_null($oShop_Order->id))
{
// Вызов обработчика платежной системы
Shop_Payment_System_Handler::factory($oShop_Order->Shop_Payment_System)
->shopOrder($oShop_Order)
->paymentProcessing();
}
}
<?php
/*
* Платёжная система Interkassa
*/
class Shop_Payment_System_Handler19 extends Shop_Payment_System_Handler
{
// Идентификатор магазина в системе Interkassa
protected $_ik_shop_id = "XXX";
//Секретный ключ (Secret Key) в системе Interkassa
protected $_ik_secret_key = "YYY";
// Код валюты в магазине HostCMS для валюты платежа в личном кабинете Интеркассы
protected $_interkassa_currency = 3;
/*
* Метод, запускающий выполнение обработчика
*/
public function execute()
{
parent::execute();
$this->printNotification();
return $this;
}
protected function _processOrder()
{
parent::_processOrder();
// Установка XSL-шаблонов в соответствии с настройками в узле структуры
$this->setXSLs();
// Отправка писем клиенту и пользователю
$this->send();
return $this;
}
public function paymentProcessing()
{
// Пришло подтверждение оплаты, обработаем его
if (isset($_REQUEST['ik_payment_id']))
{
$this->ProcessResult();
return TRUE;
}
}
/*
* Обработка статуса оплаты
*/
function ProcessResult()
{
$eshopId = Core_Array::getRequest('ik_shop_id');
if ($eshopId != $this->_ik_shop_id
|| $this->_shopOrder->paid
|| is_null($paymentStatus = Core_Array::getRequest('ik_payment_state'))
|| $paymentStatus != 'success')
{
return FALSE;
}
// Проверяем контрольную подпись
$ik_shop_id = Core_Array::getRequest('ik_shop_id');
$ik_payment_amount = Core_Array::getRequest('ik_payment_amount');
$ik_payment_id = Core_Array::getRequest('ik_payment_id');
$ik_payment_desc = Core_Array::getRequest('ik_payment_desc');
$ik_paysystem_alias = Core_Array::getRequest('ik_paysystem_alias');
$ik_baggage_fields = Core_Array::getRequest('ik_baggage_fields');
$ik_payment_state = Core_Array::getRequest('ik_payment_state');
$ik_trans_id = Core_Array::getRequest('ik_trans_id');
$ik_currency_exch = Core_Array::getRequest('ik_currency_exch');
$ik_fees_payer = Core_Array::getRequest('ik_fees_payer');
$str_md5 = md5($ik_shop_id.':'.$ik_payment_amount.':'.$ik_payment_id.':'.$ik_paysystem_alias.':'.$ik_baggage_fields.':'.$ik_payment_state.':'.$ik_trans_id.':'.$ik_currency_exch.':'.$ik_fees_payer.':'.$this->_ik_secret_key);
if (strtoupper($str_md5) == Core_Array::getRequest('ik_sign_hash', ''))
{
$this->_shopOrder->system_information = sprintf("Товар оплачен через Interkassa.\nАтрибуты:\nНомер сайта продавца: %s\nВнутренний номер покупки продавца: %s\nСумма платежа: %s\nВалюта платежа: %s\nНомер счета в системе RBK Mone: %s\nДата и время выполнения платежа: %s\nСтатус платежа: 5 - Платеж зачислен\n",
$ik_shop_id, $this->_shopOrder->id, $ik_payment_amount,
$ik_currency_exch, $ik_payment_id, $ik_payment_state);
$this->_shopOrder->paid();
$this->setXSLs();
$this->send();
}
}
public function getSumWithCoeff()
{
return Shop_Controller::instance()->round(($this->_interkassa_currency > 0
&& $this->_shopOrder->shop_currency_id > 0
? Shop_Controller::instance()->getCurrencyCoefficientInShopCurrency(
$this->_shopOrder->Shop_Currency,
Core_Entity::factory('Shop_Currency', $this->_interkassa_currency)
)
: 0) * $this->_shopOrder->getAmount());
}
public function getNotification()
{
$sum = $this->getSumWithCoeff();
$oSite_Alias = $this->_shopOrder->Shop->Site->getCurrentAlias();
$site_alias = !is_null($oSite_Alias) ? $oSite_Alias->name : '';
$shop_path = $this->_shopOrder->Shop->Structure->getPath();
$handler_url = 'http://'.$site_alias.$shop_path . "cart/?orderId={$this->_shopOrder->id}";
$successUrl = $handler_url . "&payment=success";
$failUrl = $handler_url . "&payment=fail";
$oShop_Currency = Core_Entity::factory('Shop_Currency')->find($this->_interkassa_currency);
if(!is_null($oShop_Currency->id))
{
$serviceName = 'Оплата счета N ' . $this->_shopOrder->id;
?>
<h1>Оплата через систему Interkassa</h1>
<p>
<a href="http://www.interkassa.com/" target="_blank">
<img src="http://www.interkassa.com/img/ik/interkassa_logo.gif" border="0" alt="Система электронных платежей">
</a>
</p>
<p>Сумма к оплате составляет <strong><?php echo $this->_shopOrder->sum()?></strong></p>
<p>Для оплаты нажмите кнопку "Оплатить".</p>
<p style="color: rgb(112, 112, 112);">
Внимание! Нажимая «Оплатить» Вы подтверждаете передачу контактных данных на сервер Interkassa для оплаты.
</p>
<form action="http://www.interkassa.com/lib/payment.php" method="POST">
<input type="hidden" name="ik_shop_id" value="<?php echo $this->_ik_shop_id?>">
<input type="hidden" name="ik_payment_amount" value="<?php echo $sum?>">
<input type="hidden" name="ik_payment_id" value="<?php echo $this->_shopOrder->id?>">
<input type="hidden" name="ik_payment_desc" value="<?php echo $serviceName?>">
<input type="hidden" name="ik_paysystem_alias" value="">
<input type="hidden" name="ik_success_url" value="<?php echo $successUrl?>">
<input type="hidden" name="ik_fail_url" value="<?php echo $failUrl?>">
<input type="hidden" name="ik_baggage_fields" value="<?php echo $_SESSION['hostcmsOrder']['description']?>">
<input type="submit" value="Оплатить">
</form>
<?php
}
}
public function getInvoice()
{
return $this->getNotification();
}
}
После вставки в этом коде в качестве значения переменной $_ik_shop_id вместо xxx введите идентификатор вашего магазина, а в качестве значения переменной $_ik_secret_key вместо yyy введите секретный ключ вашего магазина(эти данные можно посмотреть в настройках магазина в Interkassa).
2. В коде настроек типовой динамической страницы корзины после строки:
$oShop = Core_Entity::factory('Shop', Core_Array::get(Core_Page::instance()->libParams, 'shopId'));
добавляете блок:
// ------------------------------------------------
// Обработка уведомления об оплате от Interkassa
// ------------------------------------------------
if (isset($_REQUEST['ik_shop_id']))
{
// Получаем ID заказа
$order_id = intval(Core_Array::getRequest('ik_payment_id'));
$oShop_Order = Core_Entity::factory('Shop_Order')->find($order_id);
if (!is_null($oShop_Order->id))
{
// Вызов обработчика платежной системы
Shop_Payment_System_Handler::factory($oShop_Order->Shop_Payment_System)
->shopOrder($oShop_Order)
->paymentProcessing();
}
}
Вы только что начали читать предложение, чтение которого вы уже заканчиваете.
заточен под базу MSSQL
<?
// Интеркасса (Приёмник)
// Автор: NexT
ob_start();
if(!defined('EXEngine')) {
Exit;
}
// Так надо))
include_once 'core/warehouse.php';
// Проверка кода
if ($_GET['code'] == 'interkassa' && isset($_GET['server'])) {
// Сервер
switch($_GET['server']) {
case 0:
$DataBase = $Sql['database'];
$SelectedServer = $Sql['name'];
break;
case 1:
$DataBase = $Sql['database2'];
$SelectedServer = $Sql['name2'];
break;
case 2:
$DataBase = $Sql['database3'];
$SelectedServer = $Sql['name3'];
break;
case 3:
$DataBase = $Sql['database4'];
$SelectedServer = $Sql['name4'];
break;
default:
$DataBase = $Sql['database'];
$SelectedServer = $Sql['name'];
break;
}
// Data
if (isset($_POST['ik_co_id'])) {
// Получаем данные
$IStatus = strtolower($_POST['ik_inv_st']);
$IOrderID = $_POST['ik_pm_no'];
// Проверим статус
if ($IStatus != "success") {
// Сообщение
echo $Engine->Message('error', $Lang['PAYMENT_FAIL']);
}
else {
$Result = $DB->FetchRow($DB->Query("SELECT memb___id, amount, credits FROM $DataBase.dbo.Web_Interkassa WHERE payment_id = '$IOrderID'"));
$Login = $Result[0];
$Amount = $Result[1];
$Credits = $Result[2];
$BuyTime = date('d.m.Y H:i', $Time);
// Выдаём награду
if (!empty($Login)) {
// Запрос
$Query = "UPDATE $DataBase.dbo.MEMB_CREDITS SET credits = credits + $Credits WHERE memb___id = '$Login';
INSERT INTO [Web_CreditsLog]([memb___id],[money],[credits],[time]) VALUES ('$Login','$Amount','$Credits','$BuyTime')";
if (!$DB->Query($Query)) {
// Сообщение
echo $Engine->Message('error', $Lang['MSG_QUERY']);
// Пишем лог
$Engine->WriteLog('[Payment]['.$SelectedServer.']['.$Login.']['.$Date.'] Произошла ошибка при выполнении запроса! (Interkassa)', 'payment');
}
else {
// Сообщение
echo $Engine->Message('ok', $Lang['PAYMENT_SUCCESS'].$Credits.$Lang['PAYMENT_SUCCESS2']);
// Пишем лог
$Engine->WriteLog('[Payment]['.$SelectedServer.']['.$Login.']['.$Date.'] Вы успешно купили '. $Credits.' кредитов! (Interkassa)', 'payment');
}
}
}
}
else {
header('Location: http://'.$_SERVER['SERVER_NAME'].'');
}
}
else {
header('Location: http://'.$_SERVER['SERVER_NAME'].'');
}
?>
<?
// Интеркасса (Приёмник)
// Автор: NexT
ob_start();
if(!defined('EXEngine')) {
Exit;
}
// Так надо))
include_once 'core/warehouse.php';
// Проверка кода
if ($_GET['code'] == 'interkassa' && isset($_GET['server'])) {
// Сервер
switch($_GET['server']) {
case 0:
$DataBase = $Sql['database'];
$SelectedServer = $Sql['name'];
break;
case 1:
$DataBase = $Sql['database2'];
$SelectedServer = $Sql['name2'];
break;
case 2:
$DataBase = $Sql['database3'];
$SelectedServer = $Sql['name3'];
break;
case 3:
$DataBase = $Sql['database4'];
$SelectedServer = $Sql['name4'];
break;
default:
$DataBase = $Sql['database'];
$SelectedServer = $Sql['name'];
break;
}
// Data
if (isset($_POST['ik_co_id'])) {
// Получаем данные
$IStatus = strtolower($_POST['ik_inv_st']);
$IOrderID = $_POST['ik_pm_no'];
// Проверим статус
if ($IStatus != "success") {
// Сообщение
echo $Engine->Message('error', $Lang['PAYMENT_FAIL']);
}
else {
$Result = $DB->FetchRow($DB->Query("SELECT memb___id, amount, credits FROM $DataBase.dbo.Web_Interkassa WHERE payment_id = '$IOrderID'"));
$Login = $Result[0];
$Amount = $Result[1];
$Credits = $Result[2];
$BuyTime = date('d.m.Y H:i', $Time);
// Выдаём награду
if (!empty($Login)) {
// Запрос
$Query = "UPDATE $DataBase.dbo.MEMB_CREDITS SET credits = credits + $Credits WHERE memb___id = '$Login';
INSERT INTO [Web_CreditsLog]([memb___id],[money],[credits],[time]) VALUES ('$Login','$Amount','$Credits','$BuyTime')";
if (!$DB->Query($Query)) {
// Сообщение
echo $Engine->Message('error', $Lang['MSG_QUERY']);
// Пишем лог
$Engine->WriteLog('[Payment]['.$SelectedServer.']['.$Login.']['.$Date.'] Произошла ошибка при выполнении запроса! (Interkassa)', 'payment');
}
else {
// Сообщение
echo $Engine->Message('ok', $Lang['PAYMENT_SUCCESS'].$Credits.$Lang['PAYMENT_SUCCESS2']);
// Пишем лог
$Engine->WriteLog('[Payment]['.$SelectedServer.']['.$Login.']['.$Date.'] Вы успешно купили '. $Credits.' кредитов! (Interkassa)', 'payment');
}
}
}
}
else {
header('Location: http://'.$_SERVER['SERVER_NAME'].'');
}
}
else {
header('Location: http://'.$_SERVER['SERVER_NAME'].'');
}
?>
Авторизация