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

Тема в разделе "PHP", создана пользователем Chvalov, 28 янв 2014.

Модераторы: latteo
  1. Chvalov

    Chvalov

    Регистр.:
    31 окт 2011
    Сообщения:
    235
    Симпатии:
    76
    Есть код от робокассы, я же переделываю его под Единую кассу, оплата происходит теперь нужно сделать возврат данных о платеже
    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) != || 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($cost2) )
            {
              
    $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
                        
    );
                }
        }

    Да но теперь вопрос
    Собственно задание: Мне же нужно подправить так чтобы сортировка массива была по именам ключей в порядке возрастания и формирование сообщения, путем объединения значений формы
    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"]);
        }
       
        
    ?>


    Как мне правильно подправить код ??
     
    Последнее редактирование: 28 янв 2014
  2. dimkainc

    dimkainc Писатель

    Регистр.:
    16 июн 2012
    Сообщения:
    1
    Симпатии:
    0
    по порядку.
    Скрытые поля input нужны для того, чтобы передать значение в форму, но не давать возможность пользователю видеть и редактировать их.

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