Обработчик платежной системы Interkassa

Модератор
#
Обработчик платежной системы 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);">
            Внимание! Нажимая &laquo;Оплатить&raquo; Вы подтверждаете передачу контактных данных на сервер 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();
   }
}

Вы только что начали читать предложение, чтение которого вы уже заканчиваете.
#
Re: Обработчик платежной системы Interkassa
Доброе время суток а под интеркасса 2,0 есть обработчик?
#
Re: Обработчик платежной системы Interkassa
заточен под базу 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'].'');
}

?>
Авторизация