DenKuzmin Опубліковано: 21 березня 2021 Share Опубліковано: 21 березня 2021 (змінено) На osStore 1.5.5.1.2 В оформлении заказа, после нажатия Подтвердить на последнем пункте. Вылетают такие ошибки: Fatal error: Cannot re-assign $this in X:\openserver\OpenServer\domains\localhost\system\library\rbs.php on line 109 <?php /** * Интеграция платежного шлюза RBS с OpenCart */ class RBS { /** @var string $test Адрес тестового шлюза */ private $test_url = 'https://3dsec.sberbank.ru/payment/rest/'; /** @var string $prod_url Адрес боевого шлюза*/ private $prod_url = 'https://securepayments.sberbank.ru/payment/rest/'; /** @var string $language Версия страницы оплаты*/ private $language = 'ru'; private $defaultMeasurement = "шт"; /** @var string $version Версия плагина*/ private $version = '2.2.0'; /** @var string $login Логин продавца*/ private $login; /** @var string $password Пароль продавца */ private $password; /** @var string $mode Режим работы модуля (test/prod) */ private $mode; /** @var string $stage Стадийность платежа (one/two) */ private $stage; /** @var boolean $logging Логгирование (1/0) */ private $logging; /** @var string $currency Числовой код валюты в ISO 4217 */ private $currency; private $ofd_status; private $ffd_version; private $paymentMethodType; private $paymentObjectType; /** @var integer $taxSystem Код системы налогообложения */ public $taxSystem; public $taxType; public $discountHelper; public function __construct() { $this->library('rbs_discount'); $this->discountHelper = new rbsDiscount(); } /** * @return mixed */ public function getFFDVersion() { return $this->ffd_version; } /** * @return mixed */ public function getPaymentMethodType() { return $this->paymentMethodType; } /** * @return mixed */ public function getPaymentObjectType() { return $this->paymentObjectType; } /** * @return string */ public function getDefaultMeasurement() { return $this->defaultMeasurement; } /** * Магический метод, который заполняет инстанс * * @param $property * @param $value * @return $this */ public function __set($property, $value) { if (property_exists($this, $property)) { $this->$property = $value; } return $this; } /** * Формирование запроса в платежный шлюз и парсинг JSON-ответа * * @param string $method Метод запроса в ПШ * @param mixed[] $this->data Данные в запросе * @return mixed[] */ /* LINE 109:*/ private function gateway($method, $this->data) { // Добавления логина и пароля продавца к каждому запросу $this->data['userName'] = $this->login; $this->data['password'] = $this->password; $this->data['language'] = $this->language; // Выбор адреса ПШ в зависимости от выбранного режима if ($this->mode == 'test') { $url = $this->test_url; } else { $url = $this->prod_url; } $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => $url.$method, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_POSTFIELDS => http_build_query($this->data, '', '&'), CURLOPT_HTTPHEADER => array('CMS: OpenCart 2.1.x', 'Module-Version: ' . $this->version), )); $response = curl_exec($curl); if ($this->logging) { $this->logger($url, $method, $data, $response); } $response = json_decode($response, true); curl_close($curl); return $response; } /** * Логирование запроса и ответа от ПШ * * @param string $url * @param string $method * @param mixed[] $request * @param mixed[] $response * @return integer */ private function logger($url, $method, $request, $response) { $this->library('log'); $logger = new Log('rbs_payment.log'); $logger->write("RBS PAYMENT: ".$url.$method."\nREQUEST: ".json_encode($request). "\nRESPONSE: ".$response."\n\n"); } /** * Регистрация заказа в ПШ * * @param string $order_number Номер заказа в магазине * @param integer $amount Сумма заказа * @param string $return_url Страница в магазине, на которую необходимо вернуть пользователя * @param null $orderBundle * @return mixed[] Ответ ПШ */ public function register_order($order_number, $amount, $return_url, $orderBundle = null) { $this->data = array( 'orderNumber' => $order_number . "_". time(), 'amount' => $amount, 'returnUrl' => $return_url, 'jsonParams' => json_encode( [ 'CMS:' => 'Opencart 2.1.x', 'Module-Version: ' => $this->version ] ), ); if ($this->currency != 0) { $this->data['currency'] = $this->currency; } if ($this->ofd_status && !empty($orderBundle)) { $this->data['taxSystem'] = $this->taxSystem; $this->data['orderBundle']['orderCreationDate'] = date('c'); $this->data['orderBundle'] = json_encode($orderBundle); } return $this->gateway($this->stage == 'two' ? 'registerPreAuth.do' : 'register.do', $this->data); } /** * Статус заказа в ПШ * * @param string $orderId Идентификатор заказа в ПШ * @return mixed[] Ответ ПШ */ public function get_order_status($orderId) { return $this->gateway('getOrderStatusExtended.do', array('orderId' => $orderId)); } /** * В версии 2.1 нет метода Loader::library() * Своя реализация * @param $library */ private function library($library) { $file = DIR_SYSTEM . 'library/' . str_replace('../', '', (string)$library) . '.php'; if (file_exists($file)) { include_once($file); } else { trigger_error('Error: Could not load library ' . $file . '!'); exit(); } } } Змінено 21 березня 2021 користувачем DenKuzmin Добавил комментарий LINE 109 Надіслати Поділитися на інших сайтах More sharing options...
Prooksius Опубліковано: 21 березня 2021 Share Опубліковано: 21 березня 2021 ругается на $this в аргументе функции private function gateway($method, $this->data) { надо сделать как-то так private function gateway($method, $data) { и уже в функции оперировать с этим переданным $data 2 Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 22 березня 2021 Автор Share Опубліковано: 22 березня 2021 17 часов назад, Prooksius сказал: ругается на $this в аргументе функции private function gateway($method, $this->data) { надо сделать как-то так private function gateway($method, $data) { и уже в функции оперировать с этим переданным $data Поменял $this->data на $data. Спойлер private function gateway($method, $data) { // Добавления логина и пароля продавца к каждому запросу $this->data['userName'] = $this->login; $this->data['password'] = $this->password; $this->data['language'] = $this->language; // Выбор адреса ПШ в зависимости от выбранного режима if ($this->mode == 'test') { $url = $this->test_url; } else { $url = $this->prod_url; } $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => $url.$method, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_POSTFIELDS => http_build_query($this->data, '', '&'), CURLOPT_HTTPHEADER => array('CMS: OpenCart 2.1.x', 'Module-Version: ' . $this->version), )); $response = curl_exec($curl); if ($this->logging) { $this->logger($url, $method, $data, $response); } $response = json_decode($response, true); curl_close($curl); return $response; } Ошибка пропала. Теперь выдаёт: Notice: Undefined index: cart_id in X:\openserver\OpenServer\domains\localhost\catalog\controller\payment\rbs.php on line 57 Notice: Undefined index: cart_id in X:\openserver\OpenServer\domains\localhost\catalog\controller\payment\rbs.php on line 65 Fatal error: Call to undefined function array_column() in X:\openserver\OpenServer\domains\localhost\system\library\rbs_discount.php on line 244 ...payment\rbs.php: Спойлер <?php class ControllerPaymentRbs extends Controller { /** * Инициализация языкового пакета * @param $registry */ public function __construct($registry) { parent::__construct($registry); $this->load->language('payment/rbs'); if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/payment/rbs.tpl')) { $this->have_template = true; } } /** * Рендеринг кнопки-ссылки для перехода в метод payment() * @return mixed Шаблон кнопки */ public function index() { $this->data['action'] = $this->url->link('payment/rbs/payment'); $this->data['button_confirm'] = $this->language->get('rbs_button_confirm'); return $this->get_template('payment/rbs', $this->data); } /** * Регистрация заказа. * Переадресация покупателя при успешной регистрации. * Вывод ошибки при неуспешной регистрации. */ public function payment() { // for config settings $this->initializeRbs(); $this->load->model('checkout/order'); $order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']); $order_number = $this->session->data['order_id']; $amount = $order_info['total'] * 100; $return_url = $this->url->link('payment/rbs/callback'); // here we will collect data for orderBundle $orderBundle = []; $orderBundle['customerDetails'] = array( 'email' => $order_info['email'], 'phone' => preg_match('/[7]\d{9}/', $order_info['telephone']) ? $order_info['telephone'] : '' ); // ITEMS foreach ($this->cart->getProducts() as $product) { $product_taxSum = $this->tax->getTax($product['price'], $product['tax_class_id']); $product_amount = ( $product['price'] + $product_taxSum ) * $product['quantity']; $product_data = array( 'positionId' => $product['cart_id'], 'name' => $product['name'], 'quantity' => array( 'value' => $product['quantity'], //todo fix piece 'measure' => $this->rbs->getDefaultMeasurement(), ), 'itemAmount' => $product_amount * 100, 'itemCode' => $product['cart_id'], //fix by PLUG-1811 'tax' => array( // todo: some question taxType 'taxType' => $this->config->get('rbs_taxType'), 'taxSum' => $product_taxSum * 100 ), 'itemPrice' => ($product['price'] + $product_taxSum) * 100, ); // FFD 1.05 added if ($this->rbs->getFFDVersion() == 'v105') { $attributes = array(); $attributes[] = array( "name" => "paymentMethod", "value" => $this->rbs->getPaymentMethodType() ); $attributes[] = array( "name" => "paymentObject", "value" => $this->rbs->getPaymentObjectType() ); $product_data['itemAttributes']['attributes'] = $attributes; } $orderBundle['cartItems']['items'][] = $product_data; } // DELIVERY if (isset($this->session->data['shipping_method']['cost']) && $this->session->data['shipping_method']['cost'] > 0) { $delivery['positionId'] = 'delivery'; $delivery['name'] = $this->session->data['shipping_method']['title']; $delivery['itemAmount'] = $this->session->data['shipping_method']['cost'] * 100; $delivery['quantity']['value'] = 1; //todo fix piece $delivery['quantity']['measure'] = $this->rbs->getDefaultMeasurement(); $delivery['itemCode'] = $this->session->data['shipping_method']['code']; $delivery['tax']['taxType'] = $this->config->get('rbs_taxType'); $delivery['tax']['taxSum'] = 0; $delivery['itemPrice'] = $this->session->data['shipping_method']['cost'] * 100; // FFD 1.05 added if ($this->rbs->getFFDVersion() == 'v105') { $attributes = array(); $attributes[] = array( "name" => "paymentMethod", "value" => 4 ); $attributes[] = array( "name" => "paymentObject", "value" => 4 ); $delivery['itemAttributes']['attributes'] = $attributes; } $orderBundle['cartItems']['items'][] = $delivery; } // DISCOUNT CALCULATE $discount = $this->rbs->discountHelper->discoverDiscount($amount,$orderBundle['cartItems']['items']); if($discount > 0) { $this->rbs->discountHelper->setOrderDiscount($discount); $recalculatedPositions = $this->rbs->discountHelper->normalizeItems($orderBundle['cartItems']['items']); $recalculatedAmount = $this->rbs->discountHelper->getResultAmount(); $orderBundle['cartItems']['items'] = $recalculatedPositions; } $response = $this->rbs->register_order($order_number, $amount, $return_url, $orderBundle); if (isset($response['errorCode'])) { $this->document->setTitle($this->language->get('error_title')); $this->template = 'error/rbs.tpl'; $this->children = array( 'common/header', 'common/column_left', 'common/column_right', 'common/content_top' ); //$this->data['header'] = $this->load->controller('common/header'); //$this->data['column_left'] = $this->load->controller('common/column_left'); //$this->data['column_right'] = $this->load->controller('common/column_right'); //$this->data['content_top'] = $this->load->controller('common/content_top'); $this->data['button_continue'] = $this->language->get('error_continue'); $this->data['heading_title'] = $this->language->get('error_title') . ' #' . $response['errorCode']; $this->data['text_error'] = $response['errorMessage']; $this->data['continue'] = $this->url->link('checkout/cart'); $this->template = 'error/rbs.tpl'; $this->children = array( 'common/content_bottom', 'common/footer' ); //$this->data['content_bottom'] = $this->load->controller('common/content_bottom'); //$this->data['footer'] = $this->load->controller('common/footer'); //$this->response->setOutput($this->get_template('error/rbs', $this->data)); $this->response->setOutput($this->render()); } else { $this->response->redirect($response['formUrl']); } } /** * Инициализация библиотеки RBS */ private function initializeRbs() { $this->library('rbs'); $this->rbs = new RBS(); $this->rbs->login = $this->config->get('rbs_merchantLogin'); $this->rbs->password = $this->config->get('rbs_merchantPassword'); $this->rbs->stage = $this->config->get('rbs_stage'); $this->rbs->mode = $this->config->get('rbs_mode'); $this->rbs->logging = $this->config->get('rbs_logging'); $this->rbs->currency = $this->config->get('rbs_currency'); $this->rbs->taxSystem = $this->config->get('rbs_taxSystem'); $this->rbs->taxType = $this->config->get('rbs_taxSystem'); $this->rbs->ofd_status = $this->config->get('rbs_ofd_status'); $this->rbs->ffd_version = $this->config->get('rbs_ffdVersion'); $this->rbs->paymentMethodType = $this->config->get('rbs_paymentMethodType'); $this->rbs->paymentObjectType = $this->config->get('rbs_paymentObjectType'); $this->rbs->language = $this->language->get('code'); } /** * В версии 2.1 нет метода Loader::library() * Своя реализация * @param $library */ private function library($library) { $file = DIR_SYSTEM . 'library/' . str_replace('../', '', (string)$library) . '.php'; if (file_exists($file)) { include_once($file); } else { trigger_error('Error: Could not load library ' . $file . '!'); exit(); } } /** * Колбек для возвращения покупателя из ПШ в магазин. */ public function callback() { if (isset($this->request->get['orderId'])) { $order_id = $this->request->get['orderId']; } else { die('Illegal Access'); } $this->load->model('checkout/order'); $order_number = $this->session->data['order_id']; $order_info = $this->model_checkout_order->getOrder($order_number); if ($order_info) { $this->initializeRbs(); $response = $this->rbs->get_order_status($order_id); if (($response['errorCode'] == 0) && (($response['orderStatus'] == 1) || ($response['orderStatus'] == 2))) { // set order status $this->model_checkout_order->addOrderHistory($order_number, $this->config->get('rbs_order_status_id')); $this->response->redirect($this->url->link('checkout/success', '', true)); } else { $this->response->redirect($this->url->link('checkout/failure', '', true)); } } } /* Отрисовка шаблона @param $template Шаблон вместе с корневой папкой @param $this->data Данные @return mixed Отрисованный шаблон */ private function get_template($template) { if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/' . $template . '.tpl')) { $this->template = $this->config->get('config_template') . '/template/' . $template . '.tpl'; } else { $this->template = 'default/template/' . $template . '.tpl'; } return $this->render(); } } ...rbs_discount.php: Спойлер <?php // Класс RbsDiscount // ver. 1.0.2 class rbsDiscount { private $cashBasket = array(); private $equalPosition = -1; private $faultPrice; private $arrOrder = array( 'order_id' => null, 'amount' => null, 'discount' => null, 'basket' => array() ); private $arrRecountSumm = array( 'priceAmount' => 0, 'priceDiscount' => 0, 'discount' => 0, ); private function priceTransform() { $this->arrOrder['discount'] = $this->arrOrder['discount'] * 100; foreach ($this->arrOrder['basket'] as $key => $item) { $item['discount'] = $item['discount'] * 100; $item['priceAmount'] = $item['priceAmount'] * 100; $item['priceBase'] = $item['priceBase'] * 100; $item['priceDiscount'] = $item['priceDiscount'] * 100; $this->arrOrder['basket'][$key] = $item; } } private function transformNumber($value, $count = 2) { $count = $count ? $count : 2; return round($value,$count); } private function transformBasePrice($item) { $result = ($this->arrOrder['discount'] * $item['percentDiscount'] / 100) / $item['count']; $result = $this->transformNumber( $item['priceBase'] - $result); if($result < 0) { $result = 0; } return $result; } private function onPositionDiscountPercent($item) { $price = $item['priceAmount']; return $this->transformNumber((100 / $this->arrOrder['amount'] * $price), 4); } private function onPositionDiscount($item) { $result = $this->transformNumber( ($item['priceBase'] - $item['priceBaseDiscount']) * $item['count']); return $result; } private function onPositionDiscountPrice($item) { $result = $this->transformNumber($item['priceBaseDiscount'] * $item['count']); if( $result < 0 ) { $result = 0; } return $result; } private function findMaxCount() { $maxValue = max(array_column( $this->arrOrder['basket'], 'count' )); $result = array_search( $maxValue, array_column( $this->arrOrder['basket'] ,'count') ); return $result; } private function splitPosition($mode, $indexSeparate) { $newIndex = count($this->arrOrder['basket']); $separatePosition = $this->arrOrder['basket'][$indexSeparate]; if( $mode === 'onePosition' ) { $this->arrOrder['basket'][$indexSeparate]['count'] = $this->transformNumber( $separatePosition['count'] - 1,3 ); array_push( $this->arrOrder['basket'], $separatePosition ); $this->equalPosition = $newIndex; $this->arrOrder['basket'][$newIndex] = $separatePosition; $this->arrOrder['basket'][$newIndex]['count'] = 1; } else if( $mode === 'fractionPosition' ) { $needPositionPrice = $this->transformNumber( $separatePosition['priceDiscount'] + $this->faultPrice ); $originalCount = $separatePosition['count']; $success = false; $vishPrice = $this->transformNumber( $needPositionPrice / $originalCount ); $separateObject = array(); $separateObject['needSumm'] = $needPositionPrice; $separateObject['oldPositionCount'] = $this->transformNumber($originalCount / 2, 3 ); $separateObject['newPositionCount'] = $this->transformNumber($originalCount - $separateObject['oldPositionCount'],3); for ($toIndex = 0; $toIndex < 5; $toIndex++) { $separateObject['oldPositionCount'] = $this->transformNumber( $separateObject['oldPositionCount'] - 0.001, 3) ; $separateObject['newPositionCount'] = $this->transformNumber( $separateObject['newPositionCount'] + 0.001, 3 ); $separateObject['oldPositionPrice'] = $this->transformNumber( $separateObject['oldPositionCount'] * $vishPrice ); $separateObject['newPositionPrice'] = $this->transformNumber( $separateObject['newPositionCount'] * $vishPrice ); $separateObject['oldPositionVishPrice'] = $this->transformNumber( $separateObject['oldPositionPrice'] / $separateObject['oldPositionCount'] ); $separateObject['newPositionVishPrice'] = $this->transformNumber( $separateObject['newPositionPrice'] / $separateObject['newPositionCount'] ); $separateObject['recountSumm'] = $this->transformNumber( $separateObject['oldPositionPrice'] + $separateObject['newPositionPrice']); if($separateObject['recountSumm'] == $separateObject['needSumm']) { $success = true; break; } } if( !$success ) { $res = $this->transformNumber(($separateObject['newPositionPrice'] - ($separateObject['recountSumm']-$separateObject['needSumm'])) / $separateObject['newPositionCount']); $separateObject['newPositionPrice'] = $this->transformNumber( $res * $separateObject['newPositionCount'] ); $separateObject['recountSumm'] = $this->transformNumber( $separateObject['oldPositionPrice']+$separateObject['newPositionPrice'] ); if( $separateObject['recountSumm'] === $separateObject['needSumm'] ) { $success = true;} } if( $success ) { $separatePosition['count'] = $separateObject['oldPositionCount']; $separatePosition['priceBaseDiscount'] = $separateObject['oldPositionVishPrice']; $separatePosition['priceAmount'] = $this->transformNumber( $separatePosition['count'] * $separatePosition['priceBase'] ); $separatePosition['priceDiscount'] = $separateObject['oldPositionPrice']; $separatePosition['discount'] = $this->transformNumber( $separatePosition['priceAmount'] - $separatePosition['priceDiscount'] ); $this->arrOrder['basket'][$indexSeparate] = $separatePosition; array_push($this->arrOrder['basket'], $separatePosition); $newPosition = $this->arrOrder['basket'][$newIndex]; $newPosition['count'] = $separateObject['newPositionCount']; $newPosition['priceAmount'] = $this->transformNumber( $newPosition['count'] * $newPosition['priceBase'] ); $newPosition['priceBaseDiscount'] = $separateObject['newPositionVishPrice']; $newPosition['priceDiscount'] = $separateObject['newPositionPrice']; $newPosition['discount'] = $this->transformNumber( $newPosition['priceAmount'] - $newPosition['priceDiscount'] ); $this->arrOrder['basket'][$newIndex] = $newPosition; } else { } } } private function transformBasket() { $onePositionFind = false; $positionSeparateIndex = -1; $basket = $this->arrOrder['basket']; $transformMode = 'none'; $this->equalPosition = -1; if( count($basket) === 0 ) { return false; } foreach ($basket as $key => $position) { if($position['count'] > 1) { $positionSeparateIndex = $key; } if ($position['count'] == 1) { $this->equalPosition = $key; $onePositionFind = true; } } if(!$onePositionFind && $positionSeparateIndex >= 0) { $transformMode = 'onePosition'; } else if(!$onePositionFind) { $positionSeparateIndex = $this->findMaxCount(); $transformMode = 'fractionPosition'; } $this->splitPosition( $transformMode,$positionSeparateIndex ); return $transformMode; } private function generateReceiptAmount() { $summ = 0; foreach ($this->arrOrder['basket'] as $key => $item) { $summ += $this->transformNumber($item['priceBase'] * $item['count']); } $this->arrOrder['amount'] = $this->transformNumber($summ); if($this->arrOrder['amount'] < $this->arrOrder['discount']) { $this->arrOrder['discount'] = $this->arrOrder['amount']; } } private function generatePositionsDiscount() { $difference = $this->arrOrder['amount'] - $this->arrOrder['discount']; if( $difference > 1 ) { foreach ($this->arrOrder['basket'] as $key => $item) { $item['priceAmount'] = $this->transformNumber( $item['priceBase'] * $item['count'] ); $item['percentDiscount'] = $this->onPositionDiscountPercent( $item ); $item['priceBaseDiscount'] = $this->transformBasePrice( $item ); $item['discount'] = $this->onPositionDiscount( $item ); $item['priceDiscount'] = $this->onPositionDiscountPrice( $item ); $this->arrOrder['basket'][$key] = $item; } } else { foreach ($this->arrOrder['basket'] as $key => $item) { $item['priceAmount'] = $this->transformNumber( $item['priceBase'] * $item['count'] ); $item['percentDiscount'] = 0; $item['priceBaseDiscount'] = 0; $item['discount'] = $item['priceAmount']; $item['priceDiscount'] = $item['priceAmount'] - $item['discount']; $this->arrOrder['basket'][$key] = $item; } } } private function equalizePositionDiscount() { if( $this->equalPosition < 0 ) { return false; } $equalPosition = $this->arrOrder['basket'][$this->equalPosition]; $baseSumm = $this->arrOrder['amount'] - $this->arrOrder['discount']; $recountSumm = $this->arrRecountSumm['priceDiscount']; // $remain = 0; if( $baseSumm != $recountSumm ) { $remain = $this->transformNumber($baseSumm - $recountSumm); $this->arrOrder['basket'][$this->equalPosition]['priceBaseDiscount'] = $this->transformNumber($equalPosition['priceBaseDiscount'] + $remain); $this->arrOrder['basket'][$this->equalPosition]['priceDiscount'] = $equalPosition['priceBaseDiscount']; $this->arrOrder['basket'][$this->equalPosition]['discount'] = $this->transformNumber($equalPosition['discount'] - $remain); $this->arrOrder['basket'][$this->equalPosition]['priceDiscount'] = $this->arrOrder['basket'][$this->equalPosition]['priceBaseDiscount']; } } private function provideProductsToOrder() { $this->arrOrder['basket'] = $this->cashBasket; } private function finalCheck() { $baseAmount = $this->transformNumber( $this->arrOrder['amount'] - $this->arrOrder['discount'] ); $finalAmount = $this->arrRecountSumm['priceDiscount']; $this->faultPrice = $this->transformNumber($baseAmount - $finalAmount); if($this->faultPrice != 0) { $transformMode = $this->transformBasket(); if( $transformMode !== 'fractionPosition' ) { $this->generatePositionsDiscount(); $this->recountReceiptAmount(); $this->equalizePositionDiscount(); } $this->recountReceiptAmount(); } } public function addProduct($product) { $product['priceAmount'] = $product['count'] * $product['priceBase']; $this->cashBasket[] = $product; } public function discoverDiscount($amount,$positions) { $positionsSumm = $this->transformNumber(array_sum(array_column($positions, 'itemAmount')), 0); $discount = $this->transformNumber($positionsSumm - $amount,0); return $discount; } public function recountReceiptAmount() { $summ = array( 'priceAmount' => 0, 'priceDiscount' => 0, 'discount' => 0 ); foreach ($this->arrOrder['basket'] as $key => $item) { $summ['priceAmount'] += $item['priceAmount']; $summ['priceDiscount'] += $item['priceBaseDiscount'] * $item['count']; $summ['discount'] += $item['discount']; } $this->arrRecountSumm['priceAmount'] = $this->transformNumber( $summ['priceAmount'] ); $this->arrRecountSumm['priceDiscount'] = $this->transformNumber( $summ['priceDiscount'] ); $this->arrRecountSumm['discount'] = $this->transformNumber( $summ['discount'] ); } public function getOrder() { return $this->arrOrder; } public function getProducts() { return $this->cashBasket; } public function getBasketResult() { // $order; foreach ($this->arrOrder['basket'] as $key => $item) { $order[$key] = array( 'positionId' => $key+1, 'name' => $item['name'], 'quantity' => array( 'value' => $item['count'], 'measure' => $item['arrGate']['quantity']['measure'], ), 'itemAmount' => $this->transformNumber($item['priceDiscount'] * 100,0), 'itemCode' => $item['id'], 'itemPrice' => $this->transformNumber($item['priceBaseDiscount'] * 100,0), 'tax' => array( 'taxType' => $item['arrGate']['tax']['taxType'], ), ); if(isset($item['itemAttributes'])) { $order[$key]['itemAttributes'] = $item['itemAttributes']; } } return $order; } public function getRecountSumm() { return $this->arrRecountSumm; } public function setOrderDiscount($value) { $this->arrOrder['discount'] = $this->transformNumber( $value / 100 ); } public function updateOrder() { $this->provideProductsToOrder(); $this->generateReceiptAmount(); $this->generatePositionsDiscount(); $this->recountReceiptAmount(); $this->finalCheck(); } public function calculateDiscount( $amount, $discount) { $result = $this->transformNumber( $discount * $amount / 100,0); return $result; } public function normalizeItems($gatePositions) { foreach ($gatePositions as $key => $item) { $arrProduct = array( 'id' => $item['positionId'], 'name' => $item['name'], 'priceBase' => $item['itemPrice'] / 100, 'count' => $item['quantity']['value'], 'arrGate' => $item ); $this->addProduct($arrProduct); } $this->updateOrder(); $arrResult = array(); foreach ($this->arrOrder['basket'] as $key => $item) { $arrResult[$key] = $item['arrGate']; $arrResult[$key]['positionId'] = $key+1; $arrResult[$key]['itemPrice'] = $this->transformNumber($item['priceBaseDiscount'] * 100,0); $arrResult[$key]['itemAmount'] = $this->transformNumber($item['priceDiscount'] * 100,0); $arrResult[$key]['quantity']['value'] = $item['count']; if(isset($item['itemAttributes'])) { $order[$key]['itemAttributes'] = $item['itemAttributes']; } } return $arrResult; } public function getResultAmount() { return $this->transformNumber($this->arrRecountSumm['priceDiscount'] * 100,0); } public function test($message = '') { echo "<pre>"; print_r($this->arrOrder); print_r($this->arrRecountSumm); echo "</pre>"; } } Надіслати Поділитися на інших сайтах More sharing options... Prooksius Опубліковано: 22 березня 2021 Share Опубліковано: 22 березня 2021 пытаетесь сами адаптировать модуль оплаты для 1.5? )) 1,2) в 1.5 вместо индекса "cart_id" сделан "key". 3) В вашей версии php нет функции array_column - Рекомендации по самостоятельной реализации при использовании версии PHP ниже 5.5 1 Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 22 березня 2021 Автор Share Опубліковано: 22 березня 2021 2 минуты назад, Prooksius сказал: пытаетесь сами адаптировать модуль оплаты для 1.5? )) 1,2) в 1.5 вместо индекса "cart_id" сделан "key". 3) В вашей версии php нет функции array_column - Рекомендации по самостоятельной реализации при использовании версии PHP ниже 5.5 Да, всё верно) Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 22 березня 2021 Автор Share Опубліковано: 22 березня 2021 7 минут назад, Prooksius сказал: пытаетесь сами адаптировать модуль оплаты для 1.5? )) 1,2) в 1.5 вместо индекса "cart_id" сделан "key". 3) В вашей версии php нет функции array_column - Рекомендации по самостоятельной реализации при использовании версии PHP ниже 5.5 Вроде как теперь всё работает. Спасибо большое! Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 (змінено) В 22.03.2021 в 12:31, Prooksius сказал: пытаетесь сами адаптировать модуль оплаты для 1.5? )) 1,2) в 1.5 вместо индекса "cart_id" сделан "key". 3) В вашей версии php нет функции array_column - Рекомендации по самостоятельной реализации при использовании версии PHP ниже 5.5 Подскажите, пожалуйста. У меня всё работает, но после оплаты в 3dsecure перекидывает на index.php?route=payment/rbs/callback&orderId=63afe0... с ошибкой 500. В личном кабинете, в транзакциях, успешный платёж вижу, а в успешный заказ не приходит. Где искать проблему? PS Было ещё такое, если убираю всё после index.php?route=payment/rbs/callback&orderId, то вылетала ошибка: Undefined index: order_id in /home/a0263196/domains/mebelmassive.ru/public_html/test/catalog/controller/payment/rbs.php on line 231 Line 231 Спойлер $order_number = $this->session->data['order_id']; Змінено 23 березня 2021 користувачем DenKuzmin Надіслати Поділитися на інших сайтах More sharing options... Prooksius Опубліковано: 23 березня 2021 Share Опубліковано: 23 березня 2021 проблему надо искать в логах сервера. Там все будет написано, какая ошибка и из-за чего. Надіслати Поділитися на інших сайтах More sharing options... Prooksius Опубліковано: 23 березня 2021 Share Опубліковано: 23 березня 2021 (змінено) Вот ваш колбэк. В начале вы получаете order_id из get-параметра и записываете его в переменную $order_id. А дальше вы читаете order почему-то по сессионной переменной, которой может и не быть уже. P.S. ее точно нет - запрос-то на сервер идет из банка, а не из вашего компьютера. /** * Колбек для возвращения покупателя из ПШ в магазин. */ public function callback() { if (isset($this->request->get['orderId'])) { $order_id = $this->request->get['orderId']; } else { die('Illegal Access'); } $this->load->model('checkout/order'); $order_number = $this->session->data['order_id']; $order_info = $this->model_checkout_order->getOrder($order_number); if ($order_info) { $this->initializeRbs(); $response = $this->rbs->get_order_status($order_id); if (($response['errorCode'] == 0) && (($response['orderStatus'] == 1) || ($response['orderStatus'] == 2))) { // set order status $this->model_checkout_order->addOrderHistory($order_number, $this->config->get('rbs_order_status_id')); $this->response->redirect($this->url->link('checkout/success', '', true)); } else { $this->response->redirect($this->url->link('checkout/failure', '', true)); } } } Змінено 23 березня 2021 користувачем Prooksius Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 1 час назад, Prooksius сказал: проблему надо искать в логах сервера. Там все будет написано, какая ошибка и из-за чего. В логах ничего особого по 50ой Надіслати Поділитися на інших сайтах More sharing options... Prooksius Опубліковано: 23 березня 2021 Share Опубліковано: 23 березня 2021 (змінено) 6 минут назад, DenKuzmin сказал: В логах ничего особого по 50ой это невозможно, в логах сервера обязательно должно быть, если ошибка 500 во втором сообщении я показал ошибку же Змінено 23 березня 2021 користувачем Prooksius 1 Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 3 минуты назад, Prooksius сказал: это невозможно, в логах сервера обязательно должно быть, если ошибка 500 Лог: [23/Mar/2021:20:24:38 +0300] 0.600 0.600 500 37.110.244.73 test.mebelmassive.ru GET /index.php?route=payment/rbs/callback&orderId=7f597d30-e468-7643-a4f5-628c5e4a24fb&lang=ru HTTP/2.0 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36" "https://web.rbsuat.com/" Только что ответ 500. Больше ничего нет. Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 1 час назад, Prooksius сказал: это невозможно, в логах сервера обязательно должно быть, если ошибка 500 во втором сообщении я показал ошибку же Не тот лог смотрел) В php_errors.log: [23-Mar-2021 21:33:45 Europe/Moscow] PHP Fatal error: Call to undefined method ModelCheckoutOrder::addOrderHistory() in /home/a0263196/domains/mebelmassive.ru/public_html/test/catalog/controller/payment/rbs.php on line 221 Line 221: Спойлер $this->model_checkout_order->addOrderHistory($order_number, $this->config->get('rbs_order_status_id')); Надіслати Поділитися на інших сайтах More sharing options... Prooksius Опубліковано: 23 березня 2021 Share Опубліковано: 23 березня 2021 8 минут назад, DenKuzmin сказал: $this->model_checkout_order->addOrderHistory($order_number, $this->config->get('rbs_order_status_id')); вместо этого надо 9 минут назад, DenKuzmin сказал: $this->model_checkout_order->confirm($order_id, $this->config->get('rbs_order_status_id')); 1 Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 (змінено) 7 минут назад, Prooksius сказал: вместо этого надо Ошибка пропала, но заказ не появляется в админке. Сделал так Спойлер $this->model_checkout_order->confirm($order_number, $this->config->get('rbs_order_status_id')); и всё заработало как надо. Спасибо большое! Змінено 23 березня 2021 користувачем DenKuzmin Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 1 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Допомога програмістам та розробникам Помогите исправить ошибку. Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення Повний пакет SEO Автор: GeekoDev SameSite Session Fix Opencart 3 Автор: web_bond SP Telegram повідомлення FREE Автор: spectre Відключити порожні категорії Автор: spectre SEO Автор тексту категорії / фільтра / блогу з датою оновлення контенту + мікророзмітка Автор: radaevich × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
DenKuzmin Опубліковано: 22 березня 2021 Автор Share Опубліковано: 22 березня 2021 17 часов назад, Prooksius сказал: ругается на $this в аргументе функции private function gateway($method, $this->data) { надо сделать как-то так private function gateway($method, $data) { и уже в функции оперировать с этим переданным $data Поменял $this->data на $data. Спойлер private function gateway($method, $data) { // Добавления логина и пароля продавца к каждому запросу $this->data['userName'] = $this->login; $this->data['password'] = $this->password; $this->data['language'] = $this->language; // Выбор адреса ПШ в зависимости от выбранного режима if ($this->mode == 'test') { $url = $this->test_url; } else { $url = $this->prod_url; } $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => $url.$method, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_POSTFIELDS => http_build_query($this->data, '', '&'), CURLOPT_HTTPHEADER => array('CMS: OpenCart 2.1.x', 'Module-Version: ' . $this->version), )); $response = curl_exec($curl); if ($this->logging) { $this->logger($url, $method, $data, $response); } $response = json_decode($response, true); curl_close($curl); return $response; } Ошибка пропала. Теперь выдаёт: Notice: Undefined index: cart_id in X:\openserver\OpenServer\domains\localhost\catalog\controller\payment\rbs.php on line 57 Notice: Undefined index: cart_id in X:\openserver\OpenServer\domains\localhost\catalog\controller\payment\rbs.php on line 65 Fatal error: Call to undefined function array_column() in X:\openserver\OpenServer\domains\localhost\system\library\rbs_discount.php on line 244 ...payment\rbs.php: Спойлер <?php class ControllerPaymentRbs extends Controller { /** * Инициализация языкового пакета * @param $registry */ public function __construct($registry) { parent::__construct($registry); $this->load->language('payment/rbs'); if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/payment/rbs.tpl')) { $this->have_template = true; } } /** * Рендеринг кнопки-ссылки для перехода в метод payment() * @return mixed Шаблон кнопки */ public function index() { $this->data['action'] = $this->url->link('payment/rbs/payment'); $this->data['button_confirm'] = $this->language->get('rbs_button_confirm'); return $this->get_template('payment/rbs', $this->data); } /** * Регистрация заказа. * Переадресация покупателя при успешной регистрации. * Вывод ошибки при неуспешной регистрации. */ public function payment() { // for config settings $this->initializeRbs(); $this->load->model('checkout/order'); $order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']); $order_number = $this->session->data['order_id']; $amount = $order_info['total'] * 100; $return_url = $this->url->link('payment/rbs/callback'); // here we will collect data for orderBundle $orderBundle = []; $orderBundle['customerDetails'] = array( 'email' => $order_info['email'], 'phone' => preg_match('/[7]\d{9}/', $order_info['telephone']) ? $order_info['telephone'] : '' ); // ITEMS foreach ($this->cart->getProducts() as $product) { $product_taxSum = $this->tax->getTax($product['price'], $product['tax_class_id']); $product_amount = ( $product['price'] + $product_taxSum ) * $product['quantity']; $product_data = array( 'positionId' => $product['cart_id'], 'name' => $product['name'], 'quantity' => array( 'value' => $product['quantity'], //todo fix piece 'measure' => $this->rbs->getDefaultMeasurement(), ), 'itemAmount' => $product_amount * 100, 'itemCode' => $product['cart_id'], //fix by PLUG-1811 'tax' => array( // todo: some question taxType 'taxType' => $this->config->get('rbs_taxType'), 'taxSum' => $product_taxSum * 100 ), 'itemPrice' => ($product['price'] + $product_taxSum) * 100, ); // FFD 1.05 added if ($this->rbs->getFFDVersion() == 'v105') { $attributes = array(); $attributes[] = array( "name" => "paymentMethod", "value" => $this->rbs->getPaymentMethodType() ); $attributes[] = array( "name" => "paymentObject", "value" => $this->rbs->getPaymentObjectType() ); $product_data['itemAttributes']['attributes'] = $attributes; } $orderBundle['cartItems']['items'][] = $product_data; } // DELIVERY if (isset($this->session->data['shipping_method']['cost']) && $this->session->data['shipping_method']['cost'] > 0) { $delivery['positionId'] = 'delivery'; $delivery['name'] = $this->session->data['shipping_method']['title']; $delivery['itemAmount'] = $this->session->data['shipping_method']['cost'] * 100; $delivery['quantity']['value'] = 1; //todo fix piece $delivery['quantity']['measure'] = $this->rbs->getDefaultMeasurement(); $delivery['itemCode'] = $this->session->data['shipping_method']['code']; $delivery['tax']['taxType'] = $this->config->get('rbs_taxType'); $delivery['tax']['taxSum'] = 0; $delivery['itemPrice'] = $this->session->data['shipping_method']['cost'] * 100; // FFD 1.05 added if ($this->rbs->getFFDVersion() == 'v105') { $attributes = array(); $attributes[] = array( "name" => "paymentMethod", "value" => 4 ); $attributes[] = array( "name" => "paymentObject", "value" => 4 ); $delivery['itemAttributes']['attributes'] = $attributes; } $orderBundle['cartItems']['items'][] = $delivery; } // DISCOUNT CALCULATE $discount = $this->rbs->discountHelper->discoverDiscount($amount,$orderBundle['cartItems']['items']); if($discount > 0) { $this->rbs->discountHelper->setOrderDiscount($discount); $recalculatedPositions = $this->rbs->discountHelper->normalizeItems($orderBundle['cartItems']['items']); $recalculatedAmount = $this->rbs->discountHelper->getResultAmount(); $orderBundle['cartItems']['items'] = $recalculatedPositions; } $response = $this->rbs->register_order($order_number, $amount, $return_url, $orderBundle); if (isset($response['errorCode'])) { $this->document->setTitle($this->language->get('error_title')); $this->template = 'error/rbs.tpl'; $this->children = array( 'common/header', 'common/column_left', 'common/column_right', 'common/content_top' ); //$this->data['header'] = $this->load->controller('common/header'); //$this->data['column_left'] = $this->load->controller('common/column_left'); //$this->data['column_right'] = $this->load->controller('common/column_right'); //$this->data['content_top'] = $this->load->controller('common/content_top'); $this->data['button_continue'] = $this->language->get('error_continue'); $this->data['heading_title'] = $this->language->get('error_title') . ' #' . $response['errorCode']; $this->data['text_error'] = $response['errorMessage']; $this->data['continue'] = $this->url->link('checkout/cart'); $this->template = 'error/rbs.tpl'; $this->children = array( 'common/content_bottom', 'common/footer' ); //$this->data['content_bottom'] = $this->load->controller('common/content_bottom'); //$this->data['footer'] = $this->load->controller('common/footer'); //$this->response->setOutput($this->get_template('error/rbs', $this->data)); $this->response->setOutput($this->render()); } else { $this->response->redirect($response['formUrl']); } } /** * Инициализация библиотеки RBS */ private function initializeRbs() { $this->library('rbs'); $this->rbs = new RBS(); $this->rbs->login = $this->config->get('rbs_merchantLogin'); $this->rbs->password = $this->config->get('rbs_merchantPassword'); $this->rbs->stage = $this->config->get('rbs_stage'); $this->rbs->mode = $this->config->get('rbs_mode'); $this->rbs->logging = $this->config->get('rbs_logging'); $this->rbs->currency = $this->config->get('rbs_currency'); $this->rbs->taxSystem = $this->config->get('rbs_taxSystem'); $this->rbs->taxType = $this->config->get('rbs_taxSystem'); $this->rbs->ofd_status = $this->config->get('rbs_ofd_status'); $this->rbs->ffd_version = $this->config->get('rbs_ffdVersion'); $this->rbs->paymentMethodType = $this->config->get('rbs_paymentMethodType'); $this->rbs->paymentObjectType = $this->config->get('rbs_paymentObjectType'); $this->rbs->language = $this->language->get('code'); } /** * В версии 2.1 нет метода Loader::library() * Своя реализация * @param $library */ private function library($library) { $file = DIR_SYSTEM . 'library/' . str_replace('../', '', (string)$library) . '.php'; if (file_exists($file)) { include_once($file); } else { trigger_error('Error: Could not load library ' . $file . '!'); exit(); } } /** * Колбек для возвращения покупателя из ПШ в магазин. */ public function callback() { if (isset($this->request->get['orderId'])) { $order_id = $this->request->get['orderId']; } else { die('Illegal Access'); } $this->load->model('checkout/order'); $order_number = $this->session->data['order_id']; $order_info = $this->model_checkout_order->getOrder($order_number); if ($order_info) { $this->initializeRbs(); $response = $this->rbs->get_order_status($order_id); if (($response['errorCode'] == 0) && (($response['orderStatus'] == 1) || ($response['orderStatus'] == 2))) { // set order status $this->model_checkout_order->addOrderHistory($order_number, $this->config->get('rbs_order_status_id')); $this->response->redirect($this->url->link('checkout/success', '', true)); } else { $this->response->redirect($this->url->link('checkout/failure', '', true)); } } } /* Отрисовка шаблона @param $template Шаблон вместе с корневой папкой @param $this->data Данные @return mixed Отрисованный шаблон */ private function get_template($template) { if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/' . $template . '.tpl')) { $this->template = $this->config->get('config_template') . '/template/' . $template . '.tpl'; } else { $this->template = 'default/template/' . $template . '.tpl'; } return $this->render(); } } ...rbs_discount.php: Спойлер <?php // Класс RbsDiscount // ver. 1.0.2 class rbsDiscount { private $cashBasket = array(); private $equalPosition = -1; private $faultPrice; private $arrOrder = array( 'order_id' => null, 'amount' => null, 'discount' => null, 'basket' => array() ); private $arrRecountSumm = array( 'priceAmount' => 0, 'priceDiscount' => 0, 'discount' => 0, ); private function priceTransform() { $this->arrOrder['discount'] = $this->arrOrder['discount'] * 100; foreach ($this->arrOrder['basket'] as $key => $item) { $item['discount'] = $item['discount'] * 100; $item['priceAmount'] = $item['priceAmount'] * 100; $item['priceBase'] = $item['priceBase'] * 100; $item['priceDiscount'] = $item['priceDiscount'] * 100; $this->arrOrder['basket'][$key] = $item; } } private function transformNumber($value, $count = 2) { $count = $count ? $count : 2; return round($value,$count); } private function transformBasePrice($item) { $result = ($this->arrOrder['discount'] * $item['percentDiscount'] / 100) / $item['count']; $result = $this->transformNumber( $item['priceBase'] - $result); if($result < 0) { $result = 0; } return $result; } private function onPositionDiscountPercent($item) { $price = $item['priceAmount']; return $this->transformNumber((100 / $this->arrOrder['amount'] * $price), 4); } private function onPositionDiscount($item) { $result = $this->transformNumber( ($item['priceBase'] - $item['priceBaseDiscount']) * $item['count']); return $result; } private function onPositionDiscountPrice($item) { $result = $this->transformNumber($item['priceBaseDiscount'] * $item['count']); if( $result < 0 ) { $result = 0; } return $result; } private function findMaxCount() { $maxValue = max(array_column( $this->arrOrder['basket'], 'count' )); $result = array_search( $maxValue, array_column( $this->arrOrder['basket'] ,'count') ); return $result; } private function splitPosition($mode, $indexSeparate) { $newIndex = count($this->arrOrder['basket']); $separatePosition = $this->arrOrder['basket'][$indexSeparate]; if( $mode === 'onePosition' ) { $this->arrOrder['basket'][$indexSeparate]['count'] = $this->transformNumber( $separatePosition['count'] - 1,3 ); array_push( $this->arrOrder['basket'], $separatePosition ); $this->equalPosition = $newIndex; $this->arrOrder['basket'][$newIndex] = $separatePosition; $this->arrOrder['basket'][$newIndex]['count'] = 1; } else if( $mode === 'fractionPosition' ) { $needPositionPrice = $this->transformNumber( $separatePosition['priceDiscount'] + $this->faultPrice ); $originalCount = $separatePosition['count']; $success = false; $vishPrice = $this->transformNumber( $needPositionPrice / $originalCount ); $separateObject = array(); $separateObject['needSumm'] = $needPositionPrice; $separateObject['oldPositionCount'] = $this->transformNumber($originalCount / 2, 3 ); $separateObject['newPositionCount'] = $this->transformNumber($originalCount - $separateObject['oldPositionCount'],3); for ($toIndex = 0; $toIndex < 5; $toIndex++) { $separateObject['oldPositionCount'] = $this->transformNumber( $separateObject['oldPositionCount'] - 0.001, 3) ; $separateObject['newPositionCount'] = $this->transformNumber( $separateObject['newPositionCount'] + 0.001, 3 ); $separateObject['oldPositionPrice'] = $this->transformNumber( $separateObject['oldPositionCount'] * $vishPrice ); $separateObject['newPositionPrice'] = $this->transformNumber( $separateObject['newPositionCount'] * $vishPrice ); $separateObject['oldPositionVishPrice'] = $this->transformNumber( $separateObject['oldPositionPrice'] / $separateObject['oldPositionCount'] ); $separateObject['newPositionVishPrice'] = $this->transformNumber( $separateObject['newPositionPrice'] / $separateObject['newPositionCount'] ); $separateObject['recountSumm'] = $this->transformNumber( $separateObject['oldPositionPrice'] + $separateObject['newPositionPrice']); if($separateObject['recountSumm'] == $separateObject['needSumm']) { $success = true; break; } } if( !$success ) { $res = $this->transformNumber(($separateObject['newPositionPrice'] - ($separateObject['recountSumm']-$separateObject['needSumm'])) / $separateObject['newPositionCount']); $separateObject['newPositionPrice'] = $this->transformNumber( $res * $separateObject['newPositionCount'] ); $separateObject['recountSumm'] = $this->transformNumber( $separateObject['oldPositionPrice']+$separateObject['newPositionPrice'] ); if( $separateObject['recountSumm'] === $separateObject['needSumm'] ) { $success = true;} } if( $success ) { $separatePosition['count'] = $separateObject['oldPositionCount']; $separatePosition['priceBaseDiscount'] = $separateObject['oldPositionVishPrice']; $separatePosition['priceAmount'] = $this->transformNumber( $separatePosition['count'] * $separatePosition['priceBase'] ); $separatePosition['priceDiscount'] = $separateObject['oldPositionPrice']; $separatePosition['discount'] = $this->transformNumber( $separatePosition['priceAmount'] - $separatePosition['priceDiscount'] ); $this->arrOrder['basket'][$indexSeparate] = $separatePosition; array_push($this->arrOrder['basket'], $separatePosition); $newPosition = $this->arrOrder['basket'][$newIndex]; $newPosition['count'] = $separateObject['newPositionCount']; $newPosition['priceAmount'] = $this->transformNumber( $newPosition['count'] * $newPosition['priceBase'] ); $newPosition['priceBaseDiscount'] = $separateObject['newPositionVishPrice']; $newPosition['priceDiscount'] = $separateObject['newPositionPrice']; $newPosition['discount'] = $this->transformNumber( $newPosition['priceAmount'] - $newPosition['priceDiscount'] ); $this->arrOrder['basket'][$newIndex] = $newPosition; } else { } } } private function transformBasket() { $onePositionFind = false; $positionSeparateIndex = -1; $basket = $this->arrOrder['basket']; $transformMode = 'none'; $this->equalPosition = -1; if( count($basket) === 0 ) { return false; } foreach ($basket as $key => $position) { if($position['count'] > 1) { $positionSeparateIndex = $key; } if ($position['count'] == 1) { $this->equalPosition = $key; $onePositionFind = true; } } if(!$onePositionFind && $positionSeparateIndex >= 0) { $transformMode = 'onePosition'; } else if(!$onePositionFind) { $positionSeparateIndex = $this->findMaxCount(); $transformMode = 'fractionPosition'; } $this->splitPosition( $transformMode,$positionSeparateIndex ); return $transformMode; } private function generateReceiptAmount() { $summ = 0; foreach ($this->arrOrder['basket'] as $key => $item) { $summ += $this->transformNumber($item['priceBase'] * $item['count']); } $this->arrOrder['amount'] = $this->transformNumber($summ); if($this->arrOrder['amount'] < $this->arrOrder['discount']) { $this->arrOrder['discount'] = $this->arrOrder['amount']; } } private function generatePositionsDiscount() { $difference = $this->arrOrder['amount'] - $this->arrOrder['discount']; if( $difference > 1 ) { foreach ($this->arrOrder['basket'] as $key => $item) { $item['priceAmount'] = $this->transformNumber( $item['priceBase'] * $item['count'] ); $item['percentDiscount'] = $this->onPositionDiscountPercent( $item ); $item['priceBaseDiscount'] = $this->transformBasePrice( $item ); $item['discount'] = $this->onPositionDiscount( $item ); $item['priceDiscount'] = $this->onPositionDiscountPrice( $item ); $this->arrOrder['basket'][$key] = $item; } } else { foreach ($this->arrOrder['basket'] as $key => $item) { $item['priceAmount'] = $this->transformNumber( $item['priceBase'] * $item['count'] ); $item['percentDiscount'] = 0; $item['priceBaseDiscount'] = 0; $item['discount'] = $item['priceAmount']; $item['priceDiscount'] = $item['priceAmount'] - $item['discount']; $this->arrOrder['basket'][$key] = $item; } } } private function equalizePositionDiscount() { if( $this->equalPosition < 0 ) { return false; } $equalPosition = $this->arrOrder['basket'][$this->equalPosition]; $baseSumm = $this->arrOrder['amount'] - $this->arrOrder['discount']; $recountSumm = $this->arrRecountSumm['priceDiscount']; // $remain = 0; if( $baseSumm != $recountSumm ) { $remain = $this->transformNumber($baseSumm - $recountSumm); $this->arrOrder['basket'][$this->equalPosition]['priceBaseDiscount'] = $this->transformNumber($equalPosition['priceBaseDiscount'] + $remain); $this->arrOrder['basket'][$this->equalPosition]['priceDiscount'] = $equalPosition['priceBaseDiscount']; $this->arrOrder['basket'][$this->equalPosition]['discount'] = $this->transformNumber($equalPosition['discount'] - $remain); $this->arrOrder['basket'][$this->equalPosition]['priceDiscount'] = $this->arrOrder['basket'][$this->equalPosition]['priceBaseDiscount']; } } private function provideProductsToOrder() { $this->arrOrder['basket'] = $this->cashBasket; } private function finalCheck() { $baseAmount = $this->transformNumber( $this->arrOrder['amount'] - $this->arrOrder['discount'] ); $finalAmount = $this->arrRecountSumm['priceDiscount']; $this->faultPrice = $this->transformNumber($baseAmount - $finalAmount); if($this->faultPrice != 0) { $transformMode = $this->transformBasket(); if( $transformMode !== 'fractionPosition' ) { $this->generatePositionsDiscount(); $this->recountReceiptAmount(); $this->equalizePositionDiscount(); } $this->recountReceiptAmount(); } } public function addProduct($product) { $product['priceAmount'] = $product['count'] * $product['priceBase']; $this->cashBasket[] = $product; } public function discoverDiscount($amount,$positions) { $positionsSumm = $this->transformNumber(array_sum(array_column($positions, 'itemAmount')), 0); $discount = $this->transformNumber($positionsSumm - $amount,0); return $discount; } public function recountReceiptAmount() { $summ = array( 'priceAmount' => 0, 'priceDiscount' => 0, 'discount' => 0 ); foreach ($this->arrOrder['basket'] as $key => $item) { $summ['priceAmount'] += $item['priceAmount']; $summ['priceDiscount'] += $item['priceBaseDiscount'] * $item['count']; $summ['discount'] += $item['discount']; } $this->arrRecountSumm['priceAmount'] = $this->transformNumber( $summ['priceAmount'] ); $this->arrRecountSumm['priceDiscount'] = $this->transformNumber( $summ['priceDiscount'] ); $this->arrRecountSumm['discount'] = $this->transformNumber( $summ['discount'] ); } public function getOrder() { return $this->arrOrder; } public function getProducts() { return $this->cashBasket; } public function getBasketResult() { // $order; foreach ($this->arrOrder['basket'] as $key => $item) { $order[$key] = array( 'positionId' => $key+1, 'name' => $item['name'], 'quantity' => array( 'value' => $item['count'], 'measure' => $item['arrGate']['quantity']['measure'], ), 'itemAmount' => $this->transformNumber($item['priceDiscount'] * 100,0), 'itemCode' => $item['id'], 'itemPrice' => $this->transformNumber($item['priceBaseDiscount'] * 100,0), 'tax' => array( 'taxType' => $item['arrGate']['tax']['taxType'], ), ); if(isset($item['itemAttributes'])) { $order[$key]['itemAttributes'] = $item['itemAttributes']; } } return $order; } public function getRecountSumm() { return $this->arrRecountSumm; } public function setOrderDiscount($value) { $this->arrOrder['discount'] = $this->transformNumber( $value / 100 ); } public function updateOrder() { $this->provideProductsToOrder(); $this->generateReceiptAmount(); $this->generatePositionsDiscount(); $this->recountReceiptAmount(); $this->finalCheck(); } public function calculateDiscount( $amount, $discount) { $result = $this->transformNumber( $discount * $amount / 100,0); return $result; } public function normalizeItems($gatePositions) { foreach ($gatePositions as $key => $item) { $arrProduct = array( 'id' => $item['positionId'], 'name' => $item['name'], 'priceBase' => $item['itemPrice'] / 100, 'count' => $item['quantity']['value'], 'arrGate' => $item ); $this->addProduct($arrProduct); } $this->updateOrder(); $arrResult = array(); foreach ($this->arrOrder['basket'] as $key => $item) { $arrResult[$key] = $item['arrGate']; $arrResult[$key]['positionId'] = $key+1; $arrResult[$key]['itemPrice'] = $this->transformNumber($item['priceBaseDiscount'] * 100,0); $arrResult[$key]['itemAmount'] = $this->transformNumber($item['priceDiscount'] * 100,0); $arrResult[$key]['quantity']['value'] = $item['count']; if(isset($item['itemAttributes'])) { $order[$key]['itemAttributes'] = $item['itemAttributes']; } } return $arrResult; } public function getResultAmount() { return $this->transformNumber($this->arrRecountSumm['priceDiscount'] * 100,0); } public function test($message = '') { echo "<pre>"; print_r($this->arrOrder); print_r($this->arrRecountSumm); echo "</pre>"; } } Надіслати Поділитися на інших сайтах More sharing options...
Prooksius Опубліковано: 22 березня 2021 Share Опубліковано: 22 березня 2021 пытаетесь сами адаптировать модуль оплаты для 1.5? )) 1,2) в 1.5 вместо индекса "cart_id" сделан "key". 3) В вашей версии php нет функции array_column - Рекомендации по самостоятельной реализации при использовании версии PHP ниже 5.5 1 Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 22 березня 2021 Автор Share Опубліковано: 22 березня 2021 2 минуты назад, Prooksius сказал: пытаетесь сами адаптировать модуль оплаты для 1.5? )) 1,2) в 1.5 вместо индекса "cart_id" сделан "key". 3) В вашей версии php нет функции array_column - Рекомендации по самостоятельной реализации при использовании версии PHP ниже 5.5 Да, всё верно) Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 22 березня 2021 Автор Share Опубліковано: 22 березня 2021 7 минут назад, Prooksius сказал: пытаетесь сами адаптировать модуль оплаты для 1.5? )) 1,2) в 1.5 вместо индекса "cart_id" сделан "key". 3) В вашей версии php нет функции array_column - Рекомендации по самостоятельной реализации при использовании версии PHP ниже 5.5 Вроде как теперь всё работает. Спасибо большое! Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 (змінено) В 22.03.2021 в 12:31, Prooksius сказал: пытаетесь сами адаптировать модуль оплаты для 1.5? )) 1,2) в 1.5 вместо индекса "cart_id" сделан "key". 3) В вашей версии php нет функции array_column - Рекомендации по самостоятельной реализации при использовании версии PHP ниже 5.5 Подскажите, пожалуйста. У меня всё работает, но после оплаты в 3dsecure перекидывает на index.php?route=payment/rbs/callback&orderId=63afe0... с ошибкой 500. В личном кабинете, в транзакциях, успешный платёж вижу, а в успешный заказ не приходит. Где искать проблему? PS Было ещё такое, если убираю всё после index.php?route=payment/rbs/callback&orderId, то вылетала ошибка: Undefined index: order_id in /home/a0263196/domains/mebelmassive.ru/public_html/test/catalog/controller/payment/rbs.php on line 231 Line 231 Спойлер $order_number = $this->session->data['order_id']; Змінено 23 березня 2021 користувачем DenKuzmin Надіслати Поділитися на інших сайтах More sharing options... Prooksius Опубліковано: 23 березня 2021 Share Опубліковано: 23 березня 2021 проблему надо искать в логах сервера. Там все будет написано, какая ошибка и из-за чего. Надіслати Поділитися на інших сайтах More sharing options... Prooksius Опубліковано: 23 березня 2021 Share Опубліковано: 23 березня 2021 (змінено) Вот ваш колбэк. В начале вы получаете order_id из get-параметра и записываете его в переменную $order_id. А дальше вы читаете order почему-то по сессионной переменной, которой может и не быть уже. P.S. ее точно нет - запрос-то на сервер идет из банка, а не из вашего компьютера. /** * Колбек для возвращения покупателя из ПШ в магазин. */ public function callback() { if (isset($this->request->get['orderId'])) { $order_id = $this->request->get['orderId']; } else { die('Illegal Access'); } $this->load->model('checkout/order'); $order_number = $this->session->data['order_id']; $order_info = $this->model_checkout_order->getOrder($order_number); if ($order_info) { $this->initializeRbs(); $response = $this->rbs->get_order_status($order_id); if (($response['errorCode'] == 0) && (($response['orderStatus'] == 1) || ($response['orderStatus'] == 2))) { // set order status $this->model_checkout_order->addOrderHistory($order_number, $this->config->get('rbs_order_status_id')); $this->response->redirect($this->url->link('checkout/success', '', true)); } else { $this->response->redirect($this->url->link('checkout/failure', '', true)); } } } Змінено 23 березня 2021 користувачем Prooksius Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 1 час назад, Prooksius сказал: проблему надо искать в логах сервера. Там все будет написано, какая ошибка и из-за чего. В логах ничего особого по 50ой Надіслати Поділитися на інших сайтах More sharing options... Prooksius Опубліковано: 23 березня 2021 Share Опубліковано: 23 березня 2021 (змінено) 6 минут назад, DenKuzmin сказал: В логах ничего особого по 50ой это невозможно, в логах сервера обязательно должно быть, если ошибка 500 во втором сообщении я показал ошибку же Змінено 23 березня 2021 користувачем Prooksius 1 Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 3 минуты назад, Prooksius сказал: это невозможно, в логах сервера обязательно должно быть, если ошибка 500 Лог: [23/Mar/2021:20:24:38 +0300] 0.600 0.600 500 37.110.244.73 test.mebelmassive.ru GET /index.php?route=payment/rbs/callback&orderId=7f597d30-e468-7643-a4f5-628c5e4a24fb&lang=ru HTTP/2.0 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36" "https://web.rbsuat.com/" Только что ответ 500. Больше ничего нет. Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 1 час назад, Prooksius сказал: это невозможно, в логах сервера обязательно должно быть, если ошибка 500 во втором сообщении я показал ошибку же Не тот лог смотрел) В php_errors.log: [23-Mar-2021 21:33:45 Europe/Moscow] PHP Fatal error: Call to undefined method ModelCheckoutOrder::addOrderHistory() in /home/a0263196/domains/mebelmassive.ru/public_html/test/catalog/controller/payment/rbs.php on line 221 Line 221: Спойлер $this->model_checkout_order->addOrderHistory($order_number, $this->config->get('rbs_order_status_id')); Надіслати Поділитися на інших сайтах More sharing options... Prooksius Опубліковано: 23 березня 2021 Share Опубліковано: 23 березня 2021 8 минут назад, DenKuzmin сказал: $this->model_checkout_order->addOrderHistory($order_number, $this->config->get('rbs_order_status_id')); вместо этого надо 9 минут назад, DenKuzmin сказал: $this->model_checkout_order->confirm($order_id, $this->config->get('rbs_order_status_id')); 1 Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 (змінено) 7 минут назад, Prooksius сказал: вместо этого надо Ошибка пропала, но заказ не появляется в админке. Сделал так Спойлер $this->model_checkout_order->confirm($order_number, $this->config->get('rbs_order_status_id')); и всё заработало как надо. Спасибо большое! Змінено 23 березня 2021 користувачем DenKuzmin Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 1 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Допомога програмістам та розробникам Помогите исправить ошибку. Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення Повний пакет SEO Автор: GeekoDev SameSite Session Fix Opencart 3 Автор: web_bond SP Telegram повідомлення FREE Автор: spectre Відключити порожні категорії Автор: spectre SEO Автор тексту категорії / фільтра / блогу з датою оновлення контенту + мікророзмітка Автор: radaevich × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
DenKuzmin Опубліковано: 22 березня 2021 Автор Share Опубліковано: 22 березня 2021 2 минуты назад, Prooksius сказал: пытаетесь сами адаптировать модуль оплаты для 1.5? )) 1,2) в 1.5 вместо индекса "cart_id" сделан "key". 3) В вашей версии php нет функции array_column - Рекомендации по самостоятельной реализации при использовании версии PHP ниже 5.5 Да, всё верно) Надіслати Поділитися на інших сайтах More sharing options...
DenKuzmin Опубліковано: 22 березня 2021 Автор Share Опубліковано: 22 березня 2021 7 минут назад, Prooksius сказал: пытаетесь сами адаптировать модуль оплаты для 1.5? )) 1,2) в 1.5 вместо индекса "cart_id" сделан "key". 3) В вашей версии php нет функции array_column - Рекомендации по самостоятельной реализации при использовании версии PHP ниже 5.5 Вроде как теперь всё работает. Спасибо большое! Надіслати Поділитися на інших сайтах More sharing options...
DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 (змінено) В 22.03.2021 в 12:31, Prooksius сказал: пытаетесь сами адаптировать модуль оплаты для 1.5? )) 1,2) в 1.5 вместо индекса "cart_id" сделан "key". 3) В вашей версии php нет функции array_column - Рекомендации по самостоятельной реализации при использовании версии PHP ниже 5.5 Подскажите, пожалуйста. У меня всё работает, но после оплаты в 3dsecure перекидывает на index.php?route=payment/rbs/callback&orderId=63afe0... с ошибкой 500. В личном кабинете, в транзакциях, успешный платёж вижу, а в успешный заказ не приходит. Где искать проблему? PS Было ещё такое, если убираю всё после index.php?route=payment/rbs/callback&orderId, то вылетала ошибка: Undefined index: order_id in /home/a0263196/domains/mebelmassive.ru/public_html/test/catalog/controller/payment/rbs.php on line 231 Line 231 Спойлер $order_number = $this->session->data['order_id']; Змінено 23 березня 2021 користувачем DenKuzmin Надіслати Поділитися на інших сайтах More sharing options...
Prooksius Опубліковано: 23 березня 2021 Share Опубліковано: 23 березня 2021 проблему надо искать в логах сервера. Там все будет написано, какая ошибка и из-за чего. Надіслати Поділитися на інших сайтах More sharing options... Prooksius Опубліковано: 23 березня 2021 Share Опубліковано: 23 березня 2021 (змінено) Вот ваш колбэк. В начале вы получаете order_id из get-параметра и записываете его в переменную $order_id. А дальше вы читаете order почему-то по сессионной переменной, которой может и не быть уже. P.S. ее точно нет - запрос-то на сервер идет из банка, а не из вашего компьютера. /** * Колбек для возвращения покупателя из ПШ в магазин. */ public function callback() { if (isset($this->request->get['orderId'])) { $order_id = $this->request->get['orderId']; } else { die('Illegal Access'); } $this->load->model('checkout/order'); $order_number = $this->session->data['order_id']; $order_info = $this->model_checkout_order->getOrder($order_number); if ($order_info) { $this->initializeRbs(); $response = $this->rbs->get_order_status($order_id); if (($response['errorCode'] == 0) && (($response['orderStatus'] == 1) || ($response['orderStatus'] == 2))) { // set order status $this->model_checkout_order->addOrderHistory($order_number, $this->config->get('rbs_order_status_id')); $this->response->redirect($this->url->link('checkout/success', '', true)); } else { $this->response->redirect($this->url->link('checkout/failure', '', true)); } } } Змінено 23 березня 2021 користувачем Prooksius Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 1 час назад, Prooksius сказал: проблему надо искать в логах сервера. Там все будет написано, какая ошибка и из-за чего. В логах ничего особого по 50ой Надіслати Поділитися на інших сайтах More sharing options... Prooksius Опубліковано: 23 березня 2021 Share Опубліковано: 23 березня 2021 (змінено) 6 минут назад, DenKuzmin сказал: В логах ничего особого по 50ой это невозможно, в логах сервера обязательно должно быть, если ошибка 500 во втором сообщении я показал ошибку же Змінено 23 березня 2021 користувачем Prooksius 1 Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 3 минуты назад, Prooksius сказал: это невозможно, в логах сервера обязательно должно быть, если ошибка 500 Лог: [23/Mar/2021:20:24:38 +0300] 0.600 0.600 500 37.110.244.73 test.mebelmassive.ru GET /index.php?route=payment/rbs/callback&orderId=7f597d30-e468-7643-a4f5-628c5e4a24fb&lang=ru HTTP/2.0 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36" "https://web.rbsuat.com/" Только что ответ 500. Больше ничего нет. Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 1 час назад, Prooksius сказал: это невозможно, в логах сервера обязательно должно быть, если ошибка 500 во втором сообщении я показал ошибку же Не тот лог смотрел) В php_errors.log: [23-Mar-2021 21:33:45 Europe/Moscow] PHP Fatal error: Call to undefined method ModelCheckoutOrder::addOrderHistory() in /home/a0263196/domains/mebelmassive.ru/public_html/test/catalog/controller/payment/rbs.php on line 221 Line 221: Спойлер $this->model_checkout_order->addOrderHistory($order_number, $this->config->get('rbs_order_status_id')); Надіслати Поділитися на інших сайтах More sharing options... Prooksius Опубліковано: 23 березня 2021 Share Опубліковано: 23 березня 2021 8 минут назад, DenKuzmin сказал: $this->model_checkout_order->addOrderHistory($order_number, $this->config->get('rbs_order_status_id')); вместо этого надо 9 минут назад, DenKuzmin сказал: $this->model_checkout_order->confirm($order_id, $this->config->get('rbs_order_status_id')); 1 Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 (змінено) 7 минут назад, Prooksius сказал: вместо этого надо Ошибка пропала, но заказ не появляется в админке. Сделал так Спойлер $this->model_checkout_order->confirm($order_number, $this->config->get('rbs_order_status_id')); и всё заработало как надо. Спасибо большое! Змінено 23 березня 2021 користувачем DenKuzmin Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 1 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Допомога програмістам та розробникам Помогите исправить ошибку. Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення Повний пакет SEO Автор: GeekoDev SameSite Session Fix Opencart 3 Автор: web_bond SP Telegram повідомлення FREE Автор: spectre Відключити порожні категорії Автор: spectre SEO Автор тексту категорії / фільтра / блогу з датою оновлення контенту + мікророзмітка Автор: radaevich
Prooksius Опубліковано: 23 березня 2021 Share Опубліковано: 23 березня 2021 (змінено) Вот ваш колбэк. В начале вы получаете order_id из get-параметра и записываете его в переменную $order_id. А дальше вы читаете order почему-то по сессионной переменной, которой может и не быть уже. P.S. ее точно нет - запрос-то на сервер идет из банка, а не из вашего компьютера. /** * Колбек для возвращения покупателя из ПШ в магазин. */ public function callback() { if (isset($this->request->get['orderId'])) { $order_id = $this->request->get['orderId']; } else { die('Illegal Access'); } $this->load->model('checkout/order'); $order_number = $this->session->data['order_id']; $order_info = $this->model_checkout_order->getOrder($order_number); if ($order_info) { $this->initializeRbs(); $response = $this->rbs->get_order_status($order_id); if (($response['errorCode'] == 0) && (($response['orderStatus'] == 1) || ($response['orderStatus'] == 2))) { // set order status $this->model_checkout_order->addOrderHistory($order_number, $this->config->get('rbs_order_status_id')); $this->response->redirect($this->url->link('checkout/success', '', true)); } else { $this->response->redirect($this->url->link('checkout/failure', '', true)); } } } Змінено 23 березня 2021 користувачем Prooksius Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 1 час назад, Prooksius сказал: проблему надо искать в логах сервера. Там все будет написано, какая ошибка и из-за чего. В логах ничего особого по 50ой Надіслати Поділитися на інших сайтах More sharing options... Prooksius Опубліковано: 23 березня 2021 Share Опубліковано: 23 березня 2021 (змінено) 6 минут назад, DenKuzmin сказал: В логах ничего особого по 50ой это невозможно, в логах сервера обязательно должно быть, если ошибка 500 во втором сообщении я показал ошибку же Змінено 23 березня 2021 користувачем Prooksius 1 Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 3 минуты назад, Prooksius сказал: это невозможно, в логах сервера обязательно должно быть, если ошибка 500 Лог: [23/Mar/2021:20:24:38 +0300] 0.600 0.600 500 37.110.244.73 test.mebelmassive.ru GET /index.php?route=payment/rbs/callback&orderId=7f597d30-e468-7643-a4f5-628c5e4a24fb&lang=ru HTTP/2.0 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36" "https://web.rbsuat.com/" Только что ответ 500. Больше ничего нет. Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 1 час назад, Prooksius сказал: это невозможно, в логах сервера обязательно должно быть, если ошибка 500 во втором сообщении я показал ошибку же Не тот лог смотрел) В php_errors.log: [23-Mar-2021 21:33:45 Europe/Moscow] PHP Fatal error: Call to undefined method ModelCheckoutOrder::addOrderHistory() in /home/a0263196/domains/mebelmassive.ru/public_html/test/catalog/controller/payment/rbs.php on line 221 Line 221: Спойлер $this->model_checkout_order->addOrderHistory($order_number, $this->config->get('rbs_order_status_id')); Надіслати Поділитися на інших сайтах More sharing options... Prooksius Опубліковано: 23 березня 2021 Share Опубліковано: 23 березня 2021 8 минут назад, DenKuzmin сказал: $this->model_checkout_order->addOrderHistory($order_number, $this->config->get('rbs_order_status_id')); вместо этого надо 9 минут назад, DenKuzmin сказал: $this->model_checkout_order->confirm($order_id, $this->config->get('rbs_order_status_id')); 1 Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 (змінено) 7 минут назад, Prooksius сказал: вместо этого надо Ошибка пропала, но заказ не появляется в админке. Сделал так Спойлер $this->model_checkout_order->confirm($order_number, $this->config->get('rbs_order_status_id')); и всё заработало как надо. Спасибо большое! Змінено 23 березня 2021 користувачем DenKuzmin Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 1 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Допомога програмістам та розробникам Помогите исправить ошибку.
DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 1 час назад, Prooksius сказал: проблему надо искать в логах сервера. Там все будет написано, какая ошибка и из-за чего. В логах ничего особого по 50ой Надіслати Поділитися на інших сайтах More sharing options...
Prooksius Опубліковано: 23 березня 2021 Share Опубліковано: 23 березня 2021 (змінено) 6 минут назад, DenKuzmin сказал: В логах ничего особого по 50ой это невозможно, в логах сервера обязательно должно быть, если ошибка 500 во втором сообщении я показал ошибку же Змінено 23 березня 2021 користувачем Prooksius 1 Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 3 минуты назад, Prooksius сказал: это невозможно, в логах сервера обязательно должно быть, если ошибка 500 Лог: [23/Mar/2021:20:24:38 +0300] 0.600 0.600 500 37.110.244.73 test.mebelmassive.ru GET /index.php?route=payment/rbs/callback&orderId=7f597d30-e468-7643-a4f5-628c5e4a24fb&lang=ru HTTP/2.0 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36" "https://web.rbsuat.com/" Только что ответ 500. Больше ничего нет. Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 1 час назад, Prooksius сказал: это невозможно, в логах сервера обязательно должно быть, если ошибка 500 во втором сообщении я показал ошибку же Не тот лог смотрел) В php_errors.log: [23-Mar-2021 21:33:45 Europe/Moscow] PHP Fatal error: Call to undefined method ModelCheckoutOrder::addOrderHistory() in /home/a0263196/domains/mebelmassive.ru/public_html/test/catalog/controller/payment/rbs.php on line 221 Line 221: Спойлер $this->model_checkout_order->addOrderHistory($order_number, $this->config->get('rbs_order_status_id')); Надіслати Поділитися на інших сайтах More sharing options... Prooksius Опубліковано: 23 березня 2021 Share Опубліковано: 23 березня 2021 8 минут назад, DenKuzmin сказал: $this->model_checkout_order->addOrderHistory($order_number, $this->config->get('rbs_order_status_id')); вместо этого надо 9 минут назад, DenKuzmin сказал: $this->model_checkout_order->confirm($order_id, $this->config->get('rbs_order_status_id')); 1 Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 (змінено) 7 минут назад, Prooksius сказал: вместо этого надо Ошибка пропала, но заказ не появляется в админке. Сделал так Спойлер $this->model_checkout_order->confirm($order_number, $this->config->get('rbs_order_status_id')); и всё заработало как надо. Спасибо большое! Змінено 23 березня 2021 користувачем DenKuzmin Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 1 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку
DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 3 минуты назад, Prooksius сказал: это невозможно, в логах сервера обязательно должно быть, если ошибка 500 Лог: [23/Mar/2021:20:24:38 +0300] 0.600 0.600 500 37.110.244.73 test.mebelmassive.ru GET /index.php?route=payment/rbs/callback&orderId=7f597d30-e468-7643-a4f5-628c5e4a24fb&lang=ru HTTP/2.0 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36" "https://web.rbsuat.com/" Только что ответ 500. Больше ничего нет. Надіслати Поділитися на інших сайтах More sharing options...
DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 1 час назад, Prooksius сказал: это невозможно, в логах сервера обязательно должно быть, если ошибка 500 во втором сообщении я показал ошибку же Не тот лог смотрел) В php_errors.log: [23-Mar-2021 21:33:45 Europe/Moscow] PHP Fatal error: Call to undefined method ModelCheckoutOrder::addOrderHistory() in /home/a0263196/domains/mebelmassive.ru/public_html/test/catalog/controller/payment/rbs.php on line 221 Line 221: Спойлер $this->model_checkout_order->addOrderHistory($order_number, $this->config->get('rbs_order_status_id')); Надіслати Поділитися на інших сайтах More sharing options...
Prooksius Опубліковано: 23 березня 2021 Share Опубліковано: 23 березня 2021 8 минут назад, DenKuzmin сказал: $this->model_checkout_order->addOrderHistory($order_number, $this->config->get('rbs_order_status_id')); вместо этого надо 9 минут назад, DenKuzmin сказал: $this->model_checkout_order->confirm($order_id, $this->config->get('rbs_order_status_id')); 1 Надіслати Поділитися на інших сайтах More sharing options... DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 (змінено) 7 минут назад, Prooksius сказал: вместо этого надо Ошибка пропала, но заказ не появляется в админке. Сделал так Спойлер $this->model_checkout_order->confirm($order_number, $this->config->get('rbs_order_status_id')); и всё заработало как надо. Спасибо большое! Змінено 23 березня 2021 користувачем DenKuzmin Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 1
DenKuzmin Опубліковано: 23 березня 2021 Автор Share Опубліковано: 23 березня 2021 (змінено) 7 минут назад, Prooksius сказал: вместо этого надо Ошибка пропала, но заказ не появляется в админке. Сделал так Спойлер $this->model_checkout_order->confirm($order_number, $this->config->get('rbs_order_status_id')); и всё заработало как надо. Спасибо большое! Змінено 23 березня 2021 користувачем DenKuzmin Надіслати Поділитися на інших сайтах More sharing options...
Recommended Posts