Dmitry P.

Dmitry P.

Был в сети 31 июля 2024, 09:52
Заказы не принимаю
У меня возникла похожая проблема, только в тестовом режиме компонент ругался при каждой оплате. Методом тыка выяснил, что сигнатура в компоненте не совпадает с сигнатурой от робокассы, и связано это вроде как с наличием копеек.
Помогло поправить метод receive в классе оплаты Robokassa (core/components/minishop2/custom/payment/robokassa.class.php)
Добавил вычисление сигнатуры без копеек
$sum3 = number_format($order->get('cost'), 0, '.', '');
$crc3 = strtoupper(md5($sum3 . ':' . $id . ':' . $this->config['pass2']));
И в последующем ифе проверку
if ($crc == $crc1 || $crc == $crc2 || $crc == $crc3) {...}
Полный код метода:
public function receive(msOrder $order, $params = array())
    {
        $id = $order->get('id');
        $crc = strtoupper($_REQUEST['SignatureValue']);
        // Production
        $sum1 = number_format($order->get('cost'), 6, '.', '');
        $crc1 = strtoupper(md5($sum1 . ':' . $id . ':' . $this->config['pass2']));
        // Test
        $sum2 = number_format($order->get('cost'), 2, '.', '');
        $crc2 = strtoupper(md5($sum2 . ':' . $id . ':' . $this->config['pass2']));
        
        /** вот эти две строки добавил*/
        $sum3 = number_format($order->get('cost'), 0, '.', '');
        $crc3 = strtoupper(md5($sum3 . ':' . $id . ':' . $this->config['pass2']));

        if ($crc == $crc1 || $crc == $crc2 || $crc == $crc3) { //и здесь одно условие
            /** @var miniShop2 $miniShop2 */
            $miniShop2 = $this->modx->getService('miniShop2');
            @$this->modx->context->key = 'mgr';
            $miniShop2->changeOrderStatus($order->get('id'), 2);
            exit('OK');
        } else {
            $this->paymentError('Err: wrong signature.', $params);
        }
    }
т.к. migx хранит пути к файлам только относительно указанного ему медиаисточника, я написал небольшой плагин на событие «pdoToolsOnFenomInit», который создает модификатор для фенома, в котором находится baseUrl меди-источника по его ID
<?php

switch ($modx->event->name) {
    case 'pdoToolsOnFenomInit':
        $fenom->addModifier('mediapath', function ($input) use ($modx) {
            if (!$output = $modx->pdoTools->getStore($input, 'mediapath')) {
                if (!$output = $modx->cacheManager->get('media_' . $input)) {
                    if ($source = $modx->getObject('sources.modMediaSource', $input)) {
                        $source = $source->toArray();
                        $output = '/' . ltrim($source['properties']['baseUrl']['value'], '/');
                    } else {
                        $output = '/';
                    }
                    $modx->cacheManager->set('media_' . $input, $output, 0);
                }
                $modx->pdoTools->setStore($input, $output, 'mediapath');
            }

            return $output;
        });
        break;
}
полученный путь кешируется средствами модыкса (чтоб каждый раз в базу запросы не делать), плюс еще кладется в Store pdoTools-ов, чтоб в циклах не дергать каждый раз кеш :)
использовать можно так:
<img class="image" src="{mediapath(2) ~ $i.image}">
можно сниппету msOrder указать настройку 'userFields' => ['phone' => 'mobilephone']
тогда и у нового пользователя при создании заказа будет телефон в mobilephone записываться, и у залогиненного пользователя подставляться в это поле phone будет номрально
попробуй вызвать через $this->modx

а вообще, чтоб в любом файле подключить $modx, у меня работает такой код:
define('MODX_API_MODE', true);
require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/index.php'; //путь до index.php, который лежит в корне

$modx->getService('error', 'error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget('FILE');
ну так-то да, я что-то не подумал:
откуда форма знает куда ей стучаться?
может попробовать воткнуть в каждую форму скрытую кнопку «в корзину»..? минишоповские скрипты должны понять такой ход :)
<button type="submit" name="ms2_action" value="cart/add" style="display: none;">В корзину</button>