diff --git a/README.md b/README.md index e24a121..26a72da 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ![PHP](https://img.shields.io/badge/PHP-5.6%2B-purple) ![License](https://img.shields.io/badge/License-MIT-green) -> **📦 Версия модуля: 1.0.0** +> **📦 Версия модуля: 1.0.1** > **ℹ️ Совместимость версий OpenCart:** > 3.0.0.0, 3.0.1.1, 3.0.1.2, 3.0.2.0, 3.0.3.0, 3.0.3.1, 3.0.3.2, 3.0.3.3, 3.0.3.4, 3.0.3.5, 3.0.3.6, 3.0.3.7, 3.0.3.8, 3.0.3.9, 3.0.4.0, 3.0.4.1, 3.0.5.0 diff --git a/install.xml b/install.xml index 10ab807..1935d74 100644 --- a/install.xml +++ b/install.xml @@ -2,7 +2,7 @@ PayAnyWay payanyway - 1.0.0 + 1.0.1 PayAnyWay https://payanyway.ru/ diff --git a/upload/admin/controller/extension/payment/payanyway.php b/upload/admin/controller/extension/payment/payanyway.php index 9a1a31d..86cec80 100755 --- a/upload/admin/controller/extension/payment/payanyway.php +++ b/upload/admin/controller/extension/payment/payanyway.php @@ -9,7 +9,7 @@ class ControllerExtensionPaymentPayanyway extends Controller { const CMS_NAME = 'OpenCart'; const MODULE_NAME = 'payanyway'; - const MODULE_VERSION = '1.0.0'; + const MODULE_VERSION = '1.0.1'; const MODULE_DEFAULT_SORT_ORDER = 0; private $supportedCurrencies = array('RUB'); diff --git a/upload/catalog/controller/extension/payment/payanyway.php b/upload/catalog/controller/extension/payment/payanyway.php index 60ec208..85d55b7 100755 --- a/upload/catalog/controller/extension/payment/payanyway.php +++ b/upload/catalog/controller/extension/payment/payanyway.php @@ -166,7 +166,7 @@ class ControllerExtensionPaymentPayanyway extends Controller { /** @return string */ private function createTransactionId() { - $date = (new \DateTimeImmutable())->format('YmdHis'); + $date = date('YmdHis'); return $this->orderId . self::TRANSACTION_ID_STRING_DELIMITER . $date; } @@ -296,7 +296,7 @@ class ControllerExtensionPaymentPayanyway extends Controller { if (!isset($_REQUEST['MNT_TRANSACTION_ID'])) { return null; } - $transactionIdData = explode(self::TRANSACTION_ID_STRING_DELIMITER, $_REQUEST['MNT_TRANSACTION_ID']); + $transactionIdData = explode(self::TRANSACTION_ID_STRING_DELIMITER, $_REQUEST['MNT_TRANSACTION_ID'], 2); return isset($transactionIdData[0]) ? (int)$transactionIdData[0] : null; } @@ -343,7 +343,7 @@ class ControllerExtensionPaymentPayanyway extends Controller { ? array_merge(['MNT_COMMAND'], $baseFields) : $baseFields; - $signatureString = array_reduce($fields, static function ($carry, $field) use ($data) { + $signatureString = array_reduce($fields, function ($carry, $field) use ($data) { return $carry . $data[$field]; }, '') . $this->integrityCode; @@ -360,59 +360,10 @@ class ControllerExtensionPaymentPayanyway extends Controller { $this->sendResponse('FAIL'); } - $this->load->model('account/order'); - $products = $this->model_account_order->getOrderProducts($this->orderId); - $deliveryPrice = $this->getDeliveryPrice(); + list($resultCode, $description) = $this->determineCheckResult($callbackData); + $responseData = $this->buildResponseData($callbackData, $resultCode, $description); - $orderTotal = (float)(isset($this->orderInfo['total']) ? $this->orderInfo['total'] : 0); - - $xmlData = array( - 'MNT_ID' => $this->mntId, - 'MNT_TRANSACTION_ID' => $callbackData['MNT_TRANSACTION_ID'], - 'MNT_AMOUNT' => $this->formatPrice($orderTotal), - 'MNT_CURRENCY_CODE' => $callbackData['MNT_CURRENCY_CODE'], - 'inventory' => $this->getInventoryJson($products) ?: null, - 'client' => $callbackData['MNT_SUBSCRIBER_ID'], - 'sno' => null, - 'delivery' => (null !== $deliveryPrice) ? $this->formatPrice($deliveryPrice) : null, - ); - - $orderStatusId = (int)(isset($this->orderInfo['order_status_id']) ? $this->orderInfo['order_status_id'] : 1); - - list($xmlData['MNT_RESULT_CODE'], $xmlData['MNT_DESCRIPTION']) = $this->determineCheckResult($callbackData, $orderStatusId); - - $xmlData['MNT_SIGNATURE'] = md5( - $xmlData['MNT_RESULT_CODE'] . - $xmlData['MNT_ID'] . - $xmlData['MNT_TRANSACTION_ID'] . - $this->integrityCode - ); - - $this->sendResponse($this->buildXMLResponse($xmlData)); - } - - /** - * @param array $callbackData - * @param int $orderStatusId - * @return array - * @throws \Exception - */ - private function determineCheckResult(array $callbackData, $orderStatusId) { - $orderStatus = $this->getOrderStatusById($orderStatusId); - - if (empty($callbackData['MNT_AMOUNT'])) { - return array(100, "Order status is '{$orderStatus}'"); - } - - if ($this->successOrderStatusId === $orderStatusId) { - return array(200, 'Order Paid'); - } - - if (in_array($orderStatusId, array(7, 9, 16), true)) { - return array(500, "Order status is '{$orderStatus}'"); - } - - return array(402, 'Order created, but not paid'); + $this->sendResponse($this->buildXMLResponse($responseData)); } /** @@ -422,7 +373,6 @@ class ControllerExtensionPaymentPayanyway extends Controller { */ private function handlePayCallback(array $callbackData) { $orderTotal = (float)(isset($this->orderInfo['total']) ? $this->orderInfo['total'] : 0); - $currencyCode = isset($this->orderInfo['currency_code']) ? $this->orderInfo['currency_code'] : 'RUB'; $shopData = array( 'MNT_ID' => $this->mntId, @@ -439,33 +389,77 @@ class ControllerExtensionPaymentPayanyway extends Controller { } $isPayedOrder = $this->isOrderPaid(); - - $resultCode = 200; - - $this->load->model('account/order'); - $products = $this->model_account_order->getOrderProducts($this->orderId); - $deliveryPrice = $this->getDeliveryPrice(); - - $xmlData = array( - 'MNT_ID' => $this->mntId, - 'MNT_TRANSACTION_ID' => $callbackData['MNT_TRANSACTION_ID'], - 'MNT_RESULT_CODE' => $resultCode, - 'MNT_SIGNATURE' => md5($resultCode . $this->mntId . $callbackData['MNT_TRANSACTION_ID'] . $this->integrityCode), - 'MNT_AMOUNT' => $callbackData['MNT_AMOUNT'], - 'MNT_CURRENCY_CODE' => $callbackData['MNT_CURRENCY_CODE'], - 'MNT_DESCRIPTION' => $isPayedOrder ? 'Order already paid' : 'Order success paid', - 'inventory' => $this->getInventoryJson($products), - 'client' => $callbackData['MNT_SUBSCRIBER_ID'], - 'sno' => null, - 'delivery' => $deliveryPrice !== null ? $this->formatPrice($deliveryPrice) : null, - ); - if (!$isPayedOrder) { $this->load->language('extension/payment/payanyway'); $this->addOrderHistory($this->successOrderStatusId, $this->language->get('text_payment_completed')); } - $this->sendResponse($this->buildXMLResponse($xmlData)); + $resultCode = 200; + $description = $isPayedOrder ? 'Order already paid' : 'Order success paid'; + $responseData = $this->buildResponseData($callbackData, $resultCode, $description); + + $this->sendResponse($this->buildXMLResponse($responseData)); + } + + /** + * @param array $callbackData + * @param int $resultCode + * @param string $description + * @return array + * @throws \Exception + */ + private function buildResponseData(array $callbackData, $resultCode, $description) { + $orderTotal = (float)(isset($this->orderInfo['total']) ? $this->orderInfo['total'] : 0); + + $data = array( + 'MNT_ID' => $this->mntId, + 'MNT_TRANSACTION_ID' => $callbackData['MNT_TRANSACTION_ID'], + 'MNT_RESULT_CODE' => $resultCode, + 'MNT_DESCRIPTION' => $description, + 'MNT_AMOUNT' => $this->formatPrice($orderTotal), + 'MNT_CURRENCY_CODE' => $callbackData['MNT_CURRENCY_CODE'], + ); + + $signatureSource = $resultCode . $this->mntId . $callbackData['MNT_TRANSACTION_ID'] . $this->integrityCode; + $data['MNT_SIGNATURE'] = md5($signatureSource); + + $this->load->model('account/order'); + $products = $this->model_account_order->getOrderProducts($this->orderId); + $deliveryPrice = $this->getDeliveryPrice(); + + $data['inventory'] = $this->getInventoryJson($products) ?: null; + $data['client'] = $callbackData['MNT_SUBSCRIBER_ID']; + $data['sno'] = null; + $data['delivery'] = (null !== $deliveryPrice) ? $this->formatPrice($deliveryPrice) : null; + + return $data; + } + + /** + * @param array $callbackData + * @return array + * @throws \Exception + */ + private function determineCheckResult(array $callbackData) { + $orderStatusId = isset($this->orderInfo['order_status_id']) ? (int)$this->orderInfo['order_status_id'] : null; + if (null === $orderStatusId) { + return array(500, 'Order status not set'); + } + $orderStatus = $this->getOrderStatusById($orderStatusId); + + if (empty($callbackData['MNT_AMOUNT'])) { + return array(100, "Order status is '{$orderStatus}'"); + } + + if ($this->successOrderStatusId === $orderStatusId) { + return array(200, 'Order Paid'); + } + + if (in_array($orderStatusId, array(7, 9, 16), true)) { + return array(500, "Order status is '{$orderStatus}'"); + } + + return array(402, 'Order created, but not paid'); } /** @return bool */ @@ -498,11 +492,15 @@ class ControllerExtensionPaymentPayanyway extends Controller { * @return false|string */ private function getInventoryJson(array $products) { + if (empty($products)) { + return false; + } + $inventory = array(); foreach ($products as $product) { $name = isset($product['name']) ? $product['name'] : ''; $price = isset($product['price']) ? (float)$product['price'] : 0; - $quantity = isset($product['quantity']) ? (string)$product['quantity'] : '0'; + $quantity = isset($product['quantity']) ? (float)$product['quantity'] : 0; $inventory[] = array( 'name' => $this->validateString($name, self::INVENTORY_ITEM_NAME_MAX_LENGTH), @@ -541,16 +539,12 @@ class ControllerExtensionPaymentPayanyway extends Controller { } /** - * @param string $quantity + * @param float $quantity * @return string */ private function formatQuantity($quantity) { - $quantity = str_replace(',', '.', $quantity); - if (strpos($quantity, '.') === false && ctype_digit($quantity)) { - return (string)(int)$quantity; - } - - return number_format((float)$quantity, 3, '.', ''); + $quantityString = number_format($quantity, 3, '.', ''); + return rtrim(rtrim($quantityString, '0'), '.'); } /** @@ -601,7 +595,8 @@ class ControllerExtensionPaymentPayanyway extends Controller { } } - return $dom->saveXML(); + $xml = $dom->saveXML(); + return (false !== $xml) ? $xml : 'FAIL'; } /**