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

Модератор
#
Обработчик платежной системы IntellectMoney
Сайт платежной системы: http://www.intellectmoney.ru

1. В код настроек типовой дин. страницы в блок обработок уведомлений от ПС внести обработчик:
// ------------------------------------------------
// Обработка уведомления об оплате от IntellectMoney
// ------------------------------------------------
if (isset($_REQUEST['orderId']))
{
   // Получаем ID заказа
   $order_id = to_int($_REQUEST['orderId']);

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

   if ($order_row)
   {
      // Вызов обработчика платежной системы
      $shop->ExecSystemsOfPayHandler($order_row['shop_system_of_pay_id']);
   }
}

2. Добавить обработчик платежной системы, внести секретный ключ и номер магазина:
<?php
/* Оплата через IntellectMoney */
class system_of_pay_handler
{
   // Идентифкатор магазина, с которым будет работать обработчик
   var $eShopId = 123456;

   // Секретный ключ (заполняется вручную пользователем на странице настроек магазина)
   var $secretKey = "secret_key_string";

   // Валюта платежа RUR для работы или TST для тестирования системы
   var $currencyName = "RUR";
   //var $currencyName = "TST";

   // Код валюты в магазине HostCMS, которая была указана при регистрации магазина
   var $intellectmoney_currency = 1;

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

      /* Пользователь перешел на страницу с уведомлением о статусе заказа */
      /*if (isset($_REQUEST['InvId']) && isset($_REQUEST['Culture']))
      {
         $this->ShowResultMessage();
         return true;
      }*/

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

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

      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']);

      // чтение полученных параметров
      $in_eshopId = to_str($_REQUEST["eshopId"]);
      $in_orderId = to_str($_REQUEST["orderId"]);
      $in_serviceName = to_str($_REQUEST["serviceName"]);
      $in_eshopAccount = to_str($_REQUEST["eshopAccount"]);
      $in_recipientAmount = to_str($_REQUEST["recipientAmount"]);
      $in_recipientCurrency = to_str($_REQUEST["recipientCurrency"]);
      $in_paymentStatus = to_str($_REQUEST["paymentStatus"]);
      $in_userName = to_str($_REQUEST["userName"]);
      $in_userEmail = to_str($_REQUEST["userEmail"]);
      $in_paymentData = to_str($_REQUEST["paymentData"]);
      $in_secretKey = to_str($_REQUEST["secretKey"]);

      // Хеш, рассчитанный IntellectMoney
      $intellectMoney_hash = strtoupper(to_str($_REQUEST["hash"]));

      $for_hash = $this->eShopId."::".
      $in_orderId."::".
      $in_serviceName."::".
      $in_eshopAccount."::".
      $in_recipientAmount."::".
      $in_recipientCurrency."::".
      $in_paymentStatus."::".
      $in_userName."::".
      $in_userEmail."::".
      $in_paymentData."::".
      $this->secretKey;

      // Получаем наш вариант контрольной подписи
      $my_hash = strtoupper(md5($for_hash));

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

      // Сравниваем хэши
      if (mb_strtoupper($intellectMoney_hash) == $my_hash)
      {
         if ($in_paymentStatus == 5)
         {
            $param['system_information'] = "Товар оплачен через IntellectMoney.\n\n"
            . "Информация:\n\n"
            . "ID магазина: {$_REQUEST['eshopId']}\n"
            . "Номер покупки (СКО): {$_REQUEST['paymentId']}\n"
            . "Номер счета магазина: {$_REQUEST['eshopAccount']}\n"
            . "Назначение платежа: {$_REQUEST['serviceName']}\n"
            . "Сумма платежа: {$_REQUEST['recipientAmount']}\n"
            . "Валюта платежа: {$_REQUEST['recipientCurrency']}\n"
            . "Имя пользователя: {$_REQUEST['userName']}\n"
            . "E-mail пользователя: {$_REQUEST['userEmail']}\n"
            . "Время выполнения платежа: {$_REQUEST['paymentData']}\n"
            . "\n";

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

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

            $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']));

            $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']));
            
            echo "OK";
            exit();
         }
         elseif ($in_paymentStatus == 3)
         {
            echo "OK";
            exit();
         }
      }
      else
      {
         $param['system_information'] = 'Хэш не совпал!';

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

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

      // ID платежной системы берем из сессии
      $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;
         }
      }
   }

   /**
    * Метод для отображения формы заказа для печати.
    *
    * @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']);

         $order_id = $order_row['shop_order_id'];

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

         // Делаем перерасчет суммы в валюту IntellectMoney
         $shop_currency_id = $shop_row['shop_currency_id'];

         // Получаем название валюты
         $currency_row = $shop->GetCurrency($shop_currency_id);

         $currency_name = $currency_row['shop_currency_name'];

         $coefficient = $shop->GetCurrencyCoefficientToShopCurrency($shop_currency_id, $this->intellectmoney_currency);

         $im_sum = round($order_sum * $coefficient, 2);

         // Получаем имя/фамилию/отчество заказчика
         $fio = implode(" ", array($order_row['shop_order_users_surname'], $order_row['shop_order_users_name'], $order_row['shop_order_users_patronymic']));

         // Получаем email заказчика
         $email = $order_row['shop_order_users_email'];

         // Информация об алиасе сайта
         $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.'cart/';

         ?>
         <h1>Оплата через систему IntellectMoney</h1>
         <!-- Форма для оплаты через IntellectMoney -->
         <p>К оплате <strong><?php echo $im_sum . " " . $currency_name?></strong></p>
         <form id="pay" name="pay" method="post" action="https://merchant.intellectmoney.ru/ru/">
            <input id="orderId" type="hidden" name="orderId" value="<?php echo htmlspecialchars($order_id)?>">
            <input id="eshopId" type="hidden" name="eshopId" value="<?php echo htmlspecialchars($this->eShopId)?>">
            <input id="serviceName" type="hidden" name="serviceName" value="Оплата заказа № <?php echo $order_id?>">
            <input id="recipientAmount" type="hidden" name="recipientAmount" value="<?php echo htmlspecialchars($im_sum)?>">
            <input id="recipientCurrency" type="hidden" name="recipientCurrency" value="<?php echo $this->currencyName?>">
            <input id="successUrl" type="hidden" name="successUrl" value="<?php echo htmlspecialchars($handler_url."?order_id={$order_row['shop_order_account_number']}&payment=success")?>">
            <input id="failUrl" type="hidden" name="failUrl" value="<?php echo htmlspecialchars($handler_url."?order_id={$order_row['shop_order_account_number']}&payment=fail")?>">
            <input id="userName" type="hidden" name="userName" value="<?php echo htmlspecialchars($fio)?>">
            <input id="userEmail" type="hidden" name="userEmail" value="<?php echo htmlspecialchars($email)?>">
            <input name="submit" value="Перейти к оплате" type="submit"/>
         </form>
         <?php
      }
   }

   /**
    * Изменение статуса заказа. Позволяет пользователю внедрять собственные
    * обработчики при изменении статуса.
    *
    * @param array $param массив атрибутов
    * - $param['shop_order_id'] идентификатор заказа
    * - $param['prev_order_row'] информация о предыдущем состоянии заказа (доступно не всегда)
    * - $param['action'] выполняемое действие над заказом, может принимать значения:
    * edit (редактирование заказа), cancel (отмена заказа),
    * status (изменение статуса заказа), delete (удаление заказа),
    * edit_item (редактирование товара в заказе), delete_item (удаление товара в заказе)
    */
   function ChangeStatus($param = array())
   {
      // Если произошло изменение статуса
      if (isset($param['action']) && in_array($param['action'], array('status', 'edit')))
      {
         $shop_order_id = to_int($param['shop_order_id']);

         $shop = & singleton('shop');

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

         // Получаем информацию о магазине
         $shop_id = to_int($order_row['shop_shops_id']);

         $shop_row = $shop->GetShop($shop_id);

         $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']));

         if ($order_row)
         {
            $DateClass = new DateClass();
            $date_str = $DateClass->datetime_format($order_row['shop_order_date_time']);
         }
         else
         {
            $date_str = '';
         }

         // Если предыдущий статус заказа был 1, то меняем тему на подтверждение
         if (to_int($order_row['shop_order_status_of_pay']) == 1)
         {
            $admin_subject = $GLOBALS['MSG_shops']['shop_order_confirm_admin_subject'];
            $user_subject = $GLOBALS['MSG_shops']['shop_order_confirm_user_subject'];
         }
         else
         {
            $admin_subject = $GLOBALS['MSG_shops']['shop_order_admin_subject'];
            $user_subject = $GLOBALS['MSG_shops']['shop_order_user_subject'];
         }

         $not_paid = isset($param['prev_order_row']) && $param['prev_order_row']['shop_order_status_of_pay'] == 0;

         // Письмо отправляем только при установке статуса активности для заказа
         if (to_int($order_row['shop_order_status_of_pay']) == 1 && $not_paid)
         {
            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 = $shop_order_id;
            }

            /* Отправляем письмо заказчику */
            $shop->SendMailAboutOrder($shop_id,
            $shop_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($admin_subject, $shop_order_account_number, $shop_row['shop_shops_name'], $date_str),
            'user-subject' => sprintf($user_subject, $shop_order_account_number, $shop_row['shop_shops_name'], $date_str),
            'email_from_admin' => $order_row['shop_order_users_email']));
         }
      }
   }
}
#
Re: Обработчик платежной системы IntellectMoney
Добрый день! Подскажите, по какому протоколу осуществляется подключение в данном случае? Протокол Web Money или Протокол IntellectMoney?
Модератор
#
Re: Обработчик платежной системы IntellectMoney
marinok,
думаю IntellectMoney
#
Re: Обработчик платежной системы IntellectMoney
HostCMS, спасибо!
Еще вопрос.
Для настройки необходимо заменить номер магазина и секретный ключ на свои. Техподдержка ПС говорит, что еще необходимо знать URL страницы, где размещен код:
// ------------------------------------------------
// Обработка уведомления об оплате от IntellectMoney
// ------------------------------------------------
if (isset($_REQUEST['orderId']))
{
   // Получаем ID заказа
   $order_id = to_int($_POST['orderId']);

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

   if ($order_row)
   {
      // Вызов обработчика платежной системы
      $shop->ExecSystemsOfPayHandler($order_row['shop_system_of_pay_id']);
   }
}


Он у нас размещен в типовой динамеческой странице "Интернет-магазин   Корзина". Значит URL будет http://мой домен.ru/shop/cart/   ?
#
Re: Обработчик платежной системы IntellectMoney
Здравствуйте, я установила на сайте IntellectMoney, платежи проходят нормально, деньги на счете, уведомления о заказе и оплате получаю. Все в порядке, но приходит от IntellectMoney ошибка:
Ваша система не приняла уведомление о создании или оплате СКО (3270113240)

Перешлите, пожалуйста Вашему техническому специалисту следующую информацию:

Система ИнтеллектМани не смогла доставить http запрос
Страница: http://floraperm.ru/shop/cart/
Данные зпароса: eshopId=434550&paymentId=3270113240&orderId=90&eshopAccount=4724684956&serviceName=%ce%ef%eb%e0%f2%e0+%e7%e0%ea%e0%e7%e0+%b9+90&recipientAmount=2800.00&recipientCurrency=RUB&paymentStatus=3&userName=%f1%f2%e0%f0%ea%ee%e2+%e8%e2%e0%ed+%e5%e2%e3%e5%ed%fc%e5%e2%e8%f7&userEmail=ivanstarkov%40yandex.ru&paymentData=2012-02-12+18%3a40%3a27&secretKey=&hash=2874d12f919774440b81b284a692616d

Текст ошибки:
== Начало ошибки ==
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
        <title>Корзина</title>
        <meta name="description" content="Корзина"></meta>
        <meta name="keywords" content="Корзина"></meta>
        <meta content="text/html; charset=UTF-8" http-equiv="Content-Type"></meta>
        <link rel="stylesheet" type="text/css" href="/templates/template1/style.css?1328881221" />   <link rel="stylesheet" type="text/css" href="/hostcmsfiles/style.css" />
        <link rel="alternate" type="application/rss+xml" title="RSS Feed" href="/news/rss/" />

        <!-- jQuery -->
        <script type="text/javascript" src="/hostcmsfiles/jquery/jquery.js"></script>
        <!-- validate -->
        <script type="text/javascript" src="/hostcmsfiles/jquery/jquery.validate.js"></script>
        <!-- LightBox -->
        <script type="text/javascript" src="/hostcmsfiles/jquery/lightbox/js/jquery.lightbox.js"></script>
        <link rel="stylesheet" type="text/css" href=
== Конец ошибки ==

После исправления ошибки выполните запрос
== Начало запроса ==
http://intellectmoney.ru/ru/resend_notification/?id=1598124
== конец запроса ==

Подскажите, пожалуйста, что исправить. Спасибо.
Модератор
#
Re: Обработчик платежной системы IntellectMoney
Адрес технической поддержки: http://www.hostcms.ru/support/
#
Re: Обработчик платежной системы IntellectMoney
А ведь я писал вам об идентичной проблеме!
И вы послали меня в поддержку IntellektMoney
#
Re: Обработчик платежной системы IntellectMoney
xshock писал(а):
А ведь я писал вам об идентичной проблеме!

А вы решили проблему?
У меня версия Халява - думаю техподдержка мне не ответит.
Модератор
#
Re: Обработчик платежной системы IntellectMoney
xshock писал(а):
А ведь я писал вам об идентичной проблеме!
И вы послали меня в поддержку IntellektMoney

На сколько я понимаю Вы упорно не хотите обратиться в поддержку этой ПС?
#
Re: Обработчик платежной системы IntellectMoney
Техподдержка hostcms послала в IntellektMoney.
IntellektMoney - не отвечают.
Авторизация