Помогите с XenForo (Дописать плагин) Единая касса

Chvalov

Гуру форума
Регистрация
31 Окт 2011
Сообщения
265
Реакции
81
Есть код от робокассы, я же переделываю его под Единую кассу, оплата происходит теперь нужно сделать возврат данных о платеже
PHP:
<?php
    class XenForo_UserUpgradeProcessor_RoboKassa
    {
            protected $_request;
            protected $_input;
            protected $_filtered = null;
            protected $_upgrade = false;
            protected $_user = false;
            protected $_upgradeRecordId = null;
            protected $_upgradeRecord = false;
            protected $_upgradeModel = null;
            public function initCallbackHandling(Zend_Controller_Request_Http $request)
            {
                    $this->_request = $request;
                    $this->_input = new XenForo_Input($request);

                    $this->_filtered = $this->_input->filter(array(
                            'InvId' => XenForo_Input::UINT,
                            'OutSum' => XenForo_Input::STRING,
                            'SignatureValue' => XenForo_Input::STRING,
                            'Shp_item' => XenForo_Input::STRING,
                    ));

                    $this->_upgradeModel =  XenForo_Model::create('XenForo_Model_UserUpgrade');
            }

            public function validateRequest(&$errorString)
            {
                    return true;
            }

            public function validatePreConditions(&$errorString)
            {
                    $itemParts = explode(',', $this->_filtered['Shp_item'], 4);
                    if (count($itemParts) != 4)
                    {
                            $errorString = 'Invalid item (Shp_item)';
                            return false;
                    }

                    list($userId, $userUpgradeId, $validationType, $validation) = $itemParts;

                    $user = XenForo_Model::create('XenForo_Model_User')->getFullUserById($userId);
                    if (!$user)
                    {
                            $errorString = 'Invalid user';
                            return false;
                    }
                    $this->_user = $user;

                    $tokenParts = explode(',', $validation);
                    if (count($tokenParts) != 3 || sha1($tokenParts[1] . $user['csrf_token']) != $tokenParts[2])
                    {
                            $errorString = 'Invalid validation';
                            return false;
                    }

                    $upgrade = $this->_upgradeModel->getUserUpgradeById($userUpgradeId);
                    if (!$upgrade)
                    {
                            $errorString = 'Invalid user upgrade';
                            return false;
                    }
                    $this->_upgrade = $upgrade;

                    if (!$this->_filtered['InvId'])
                    {
                            $errorString = 'No InvId';
                            return false;
                    }

                    $transaction = $this->_upgradeModel->getProcessedTransactionLog($this->_filtered['InvId']);
                    if ($transaction)
                    {
                            $errorString = 'Transaction already processed';
                            return false;
                    }

                    $upgradeRecord = $this->_upgradeModel->getActiveUserUpgradeRecord($this->_user['user_id'], $this->_upgrade['user_upgrade_id']);
                    if ($upgradeRecord)
                    {
                            $this->_upgradeRecordId = $upgradeRecord['user_upgrade_record_id'];
                            $this->_upgradeRecord = $upgradeRecord;
                    }

        $out_summ = $this->_filtered["OutSum"];
        $inv_id = $this->_filtered['InvId'];
        $shp_item = $this->_filtered["Shp_item"];
        $crc = $this->_filtered["SignatureValue"];

        $crc = strtoupper($crc);

        $my_crc = strtoupper(md5("$out_summ:$inv_id:$mrh_pass2:Shp_item=$shp_item"));

        // проверка корректности подписи
        // check signature
        if ($my_crc !=$crc)
        {
          $errorString = 'Invalid Signature';
          return false;
        }

        if ($upgradeRecord)
        {
          $extra = unserialize($upgradeRecord['extra']);
          $cost = $extra['cost_amount'];
          $currency = $extra['cost_currency'];
        }
        else
        {
          $cost = $upgrade['cost_amount'];
          $currency = $upgrade['cost_currency'];
        }
        if (round($this->_filtered['OutSum'], 2) != round($cost, 2) )
        {
          $errorString = 'Invalid payment amount';
          return false;
        }

                    return true;
            }

            public function processTransaction()
            {
        $this->_upgradeRecordId = $this->_upgradeModel->upgradeUser($this->_user['user_id'], $this->_upgrade);

        return array('payment', 'Payment received, upgraded/extended');
            }

            public function getLogDetails()
            {
                    $details = $_POST;
                    $details['_callbackIp'] = (isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : false);

                    return $details;
            }

            public function getTransactionId()
            {
                    return $this->_filtered['InvId'];
            }

            public function getProcessorId()
            {
                    return 'RoboKassa';
            }

            public function getUpgradeRecordId()
            {
                    return intval($this->_upgradeRecordId);
            }

            public function log($type, $message, array $extra)
            {
                    $upgradeRecordId = $this->getUpgradeRecordId();
                    $processor = $this->getProcessorId();
                    $transactionId = $this->getTransactionId();
                    $details = $this->getLogDetails() + $extra;

                    $this->_upgradeModel->logProcessorCallback(
                            $upgradeRecordId, $processor, $transactionId, $type, $message, $details
                    );
            }
    }
latteo написал(а):
вызывается initCallbackHandling, посредством $this->_input->filter выдёргивает обведённые красным переменные из $_POST или $_GET запроса.
Потом вызывается validatePreConditions, которая использует эти значения для составления хеша $my_crc = strtoupper(md5("$out_summ:$inv_id:$mrh_pass2:Shp_item=$shp_item")); и сравнивает с тем хешем, который получили в запросе $crc = $this->_filtered["SignatureValue"]; $crc = strtoupper($crc);
Да но теперь вопрос
InvId, OutSum, SignatureValue и Shp_item
встречаются только здесь:
PHP:
<?php
if (isset($_POST['OutSum']) and isset($_POST['_xfTokens']) and isset($_POST['desc_info']))
{
$out_summ = $_POST['OutSum'];
$shp_item = $_POST['_xfTokens'];
$inv_desc = $_POST['desc_info'];
$inv_id = 0;
$mrh_login = "spaxy";
$mrh_pass1 = "password#1";

$in_curr = "";
$crc  = md5("$mrh_login:$out_summ:$inv_id:$mrh_pass1:Shp_item=$shp_item");

print "<form action='https://merchant.roboxchange.com/Index.aspx' method=POST>".
"<input type=hidden name=MrchLogin value=$mrh_login>".
"<input type=hidden name=OutSum value='$out_summ'>".
"<input type=hidden name=InvId value='$inv_id'>".
"<input type=hidden name=Desc value='$inv_desc'>".
"<input type=hidden name=SignatureValue value=$crc>".
"<input type=hidden name=Shp_item value='$shp_item'>".
"<input type=hidden name=IncCurrLabel value=$in_curr>".
"<input type=hidden name=Culture value=$culture>".
"<input type=submit class='button primary' value='Оплатить и перейти'>".
</form>";
}
?>
Разве возможно такое чтобы передавались значения с названий ?
input type=hidden name=XXXXXX

Собственно задание: Мне же нужно подправить так чтобы сортировка массива была по именам ключей в порядке возрастания и формирование сообщения, путем объединения значений формы
PHP:
<?php
   
    // Секретный ключ интернет-магазина (настраивается в кабинете)
    $skey = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
   
    // Функция, которая возвращает результат в Единую кассу
    function print_answer($result, $description)
    {
      print "WMI_RESULT=" . strtoupper($result) . "&";
      print "WMI_DESCRIPTION=" .urlencode($description);
      exit();
    }
   
    // Проверка наличия необходимых параметров в POST-запросе
    if (!isset($_POST["WMI_SIGNATURE"]))
      print_answer("Retry", "Отсутствует параметр WMI_SIGNATURE");
   
    if (!isset($_POST["WMI_PAYMENT_NO"]))
      print_answer("Retry", "Отсутствует параметр WMI_PAYMENT_NO");
   
    if (!isset($_POST["WMI_ORDER_STATE"]))
      print_answer("Retry", "Отсутствует параметр WMI_ORDER_STATE");
   
    // Извлечение всех параметров POST-запроса, кроме WMI_SIGNATURE
   
    foreach($_POST as $name => $value)
    {
      if ($name !== "WMI_SIGNATURE") $params[$name] = $value;
    }
   
    // Сортировка массива по именам ключей в порядке возрастания и формирование сообщения, путем объединения значений формы
   
    uksort($params, "strcasecmp"); $values = "";
   
    foreach($params as $name => $value)
    {
      //Конвертация из текущей кодировки (UTF-8)
      //необходима только если кодировка магазина отлична от Windows-1251
      $value = iconv("utf-8", "windows-1251", $value);
      $values .= $value;
    }
   
    // Формирование подписи для сравнения ее с параметром WMI_SIGNATURE
   
    $signature = base64_encode(pack("H*", md5($values . $skey)));
   
    //Сравнение полученной подписи с подписью W1
   
    if ($signature == $_POST["WMI_SIGNATURE"])
    {
      if (strtoupper($_POST["WMI_ORDER_STATE"]) == "ACCEPTED")
      {
        // TODO: Пометить заказ, как «Оплаченный» в системе учета магазина
   
        print_answer("Ok", "Заказ #" . $_POST["WMI_PAYMENT_NO"] . " оплачен!");
      }
      else
      {
        // Случилось что-то странное, пришло неизвестное состояние заказа
   
        print_answer("Retry", "Неверное состояние ". $_POST["WMI_ORDER_STATE"]);
      }
    }
    else
    {
      // Подпись не совпадает, возможно вы поменяли настройки интернет-магазина
   
      print_answer("Retry", "Неверная подпись " . $_POST["WMI_SIGNATURE"]);
    }
   
    ?>

Как мне правильно подправить код ??
 
Последнее редактирование:
по порядку.
Скрытые поля input нужны для того, чтобы передать значение в форму, но не давать возможность пользователю видеть и редактировать их.

Функция
PHP:
uksort($params, "strcasecmp");
как раз и занимается нужной сортировкой полученных полей. Так что подправлять код не нужно, а нужно просто скопировать его.
 
Назад
Сверху