Dmitry P.

Dmitry P.

С нами с 22 ноября 2017; Место в рейтинге пользователей: #429
Dmitry P.
04 августа 2020, 10:39
2
0
У меня возникла похожая проблема, только в тестовом режиме компонент ругался при каждой оплате. Методом тыка выяснил, что сигнатура в компоненте не совпадает с сигнатурой от робокассы, и связано это вроде как с наличием копеек.
Помогло поправить метод 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);
        }
    }