From e8750a0c29c70b2e3d5ab7fd2cb91d721e9f9b5d Mon Sep 17 00:00:00 2001 From: panariga Date: Sun, 14 Dec 2025 12:05:09 +0200 Subject: [PATCH] Update catalog/controller/payment/hutko.php --- catalog/controller/payment/hutko.php | 48 +++++++++++++++------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/catalog/controller/payment/hutko.php b/catalog/controller/payment/hutko.php index b7eb520..3068968 100644 --- a/catalog/controller/payment/hutko.php +++ b/catalog/controller/payment/hutko.php @@ -24,24 +24,20 @@ class Hutko extends \Opencart\System\Engine\Controller { if (!$order_info) { $json['error'] = 'Order missing'; } else { - // 1. Generate unique Ref for THIS attempt - $timestamp = time(); - $hutko_ref = $order_info['order_id'] . '#' . $timestamp; + $hutko_ref = $order_info['order_id'] . '#' . time(); + // Call the shared logic method $request_data = $this->buildRequest($order_info, $hutko_ref); if (!$request_data) { $json['error'] = $this->language->get('error_payment_data_build'); } else { $this->load->model('extension/hutko/payment/hutko'); - - // 2. Call API $response = $this->api($this->checkout_url, $request_data); if (($response['response']['response_status'] ?? '') === 'success' && !empty($response['response']['checkout_url'])) { $url = $response['response']['checkout_url']; - // 3. Log to INTERNAL DB (Not Customer History) $this->model_extension_hutko_payment_hutko->logTransaction( $order_info['order_id'], $hutko_ref, @@ -50,14 +46,12 @@ class Hutko extends \Opencart\System\Engine\Controller { $request_data['amount'] / 100, $request_data['currency'], [ - 'request_data' => $request_data, // Store sent data (except signature if needed) + 'request_data' => $request_data, 'checkout_url' => $url, 'user_agent' => $this->request->server['HTTP_USER_AGENT'] ?? '' ] ); - // 4. Update Order Status to "Pending" (or configured status) if not already - // Only add history if it's a fresh order, don't spam. if ($order_info['order_status_id'] == 0) { $this->model_checkout_order->addHistory($order_info['order_id'], $this->config->get('payment_hutko_new_order_status_id'), $this->language->get('text_initiated_payment'), false); } @@ -66,8 +60,6 @@ class Hutko extends \Opencart\System\Engine\Controller { } else { $err = $response['response']['error_message'] ?? $this->language->get('error_api_communication'); $json['error'] = $err; - - // Log Failure $this->model_extension_hutko_payment_hutko->logTransaction( $order_info['order_id'], $hutko_ref, @@ -165,8 +157,21 @@ class Hutko extends \Opencart\System\Engine\Controller { } } + + + private function validate($data) { + $sig = $data['signature'] ?? ''; + unset($data['signature'], $data['response_signature_string']); + return hash_equals($this->sign($data), $sig); + } + + + // ========================================================================= + // SHARED LOGIC START + // MAINTENANCE WARNING: Keep synchronized with Admin Controller + // ========================================================================= + private function buildRequest($order, $hutko_ref) { - // Logic same as before, but using passed $hutko_ref $products_data = $this->getProducts($order['order_id'], $order); $total_products_sum = 0; @@ -196,6 +201,10 @@ class Hutko extends \Opencart\System\Engine\Controller { if ($amount_val < 0.01) $amount_val = 0.01; $total_cents = (int)round($amount_val * 100); + // Catalog side URLs are simple + $response_url = $this->url->link('checkout/success', 'language=' . $this->config->get('config_language'), true); + $callback_url = $this->url->link('extension/hutko/payment/hutko.callback', '', true); + $reservation_data = [ "cms_name" => "OpenCart", "cms_version" => VERSION, @@ -214,8 +223,8 @@ class Hutko extends \Opencart\System\Engine\Controller { 'amount' => $total_cents, 'currency' => $order['currency_code'], 'order_desc' => 'Order #' . $order['order_id'], - 'response_url' => $this->url->link('checkout/success', 'language=' . $this->config->get('config_language'), true), - 'server_callback_url' => $this->url->link('extension/hutko/payment/hutko.callback', '', true), + 'response_url' => $response_url, + 'server_callback_url' => $callback_url, 'sender_email' => $order['email'], 'reservation_data' => base64_encode(json_encode($reservation_data)) ]; @@ -224,8 +233,6 @@ class Hutko extends \Opencart\System\Engine\Controller { return $data; } - // Helper functions (getProducts, sign, validate, api, logOC) remain the same... - // Just ensure logOC uses file log for debug, not DB log. private function getProducts(int $order_id, array $order_info): array { $products_data = []; $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "order_product` WHERE `order_id` = '" . (int)$order_id . "'"); @@ -269,12 +276,6 @@ class Hutko extends \Opencart\System\Engine\Controller { foreach($arr as $v) $str .= '|' . $v; return sha1($str); } - - private function validate($data) { - $sig = $data['signature'] ?? ''; - unset($data['signature'], $data['response_signature_string']); - return hash_equals($this->sign($data), $sig); - } private function api($url, $data) { if ($this->config->get('payment_hutko_save_logs')) $this->logOC('Req: ' . json_encode($data)); @@ -302,4 +303,7 @@ class Hutko extends \Opencart\System\Engine\Controller { private function logOC($msg) { $this->log->write("Hutko Payment: " . $msg); } + // ========================================================================= + // SHARED LOGIC END + // ========================================================================= } \ No newline at end of file