feat: add fiscalization settings, POST callbacks and fix callback issues
This commit is contained in:
@@ -9,7 +9,6 @@ use Opencart\Catalog\Model\Account\Order as ModelAccountOrder;
|
||||
use Opencart\Catalog\Model\Checkout\Order as ModelCheckoutOrder;
|
||||
use Opencart\System\Engine\Config;
|
||||
use Opencart\System\Engine\Loader;
|
||||
use Opencart\System\Library\Cart\Currency;
|
||||
use Opencart\System\Library\Cart\Customer;
|
||||
use Opencart\System\Library\Document;
|
||||
use Opencart\System\Library\Language;
|
||||
@@ -29,11 +28,11 @@ require_once DIR_EXTENSION . '/payanyway/catalog/library/payanyway/traits/payany
|
||||
* @property Session $session
|
||||
* @property Language $language
|
||||
* @property Url $url
|
||||
* @property Currency $currency
|
||||
* @property ModelCheckoutOrder $model_checkout_order
|
||||
* @property ModelAccountOrder $model_account_order
|
||||
* @property ModelAccountCustomer $model_account_customer
|
||||
* @property Customer $customer
|
||||
* @property \Opencart\Catalog\Model\Extension\PayAnyWay\Payment\PayAnyWay $model_extension_payanyway_payment_payanyway
|
||||
*/
|
||||
|
||||
class PayAnyWay extends \Opencart\System\Engine\Controller
|
||||
@@ -46,30 +45,12 @@ class PayAnyWay extends \Opencart\System\Engine\Controller
|
||||
|
||||
public const DESCRIPTION_MAX_LENGTH = 500;
|
||||
|
||||
private int $mntId;
|
||||
private string $integrityCode;
|
||||
private string $server;
|
||||
private string $vatRate;
|
||||
private string $currency;
|
||||
private int $pendingOrderStatusId;
|
||||
private int $successOrderStatusId;
|
||||
private int $errorOrderStatusId;
|
||||
private int $geoZoneId;
|
||||
private int $sortOrder;
|
||||
private string $cmsModuleVersion;
|
||||
|
||||
private array $orderInfo;
|
||||
private ?int $orderId;
|
||||
|
||||
public function __construct(\Opencart\System\Engine\Registry $registry)
|
||||
{
|
||||
parent::__construct($registry);
|
||||
|
||||
if (!$this->validateOrder()) {
|
||||
$this->response->redirect($this->url->link('account/login', '', true));
|
||||
}
|
||||
|
||||
$this->initializeModule();
|
||||
$this->loadOrder($this->getOrderIdFromSession());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -77,6 +58,13 @@ class PayAnyWay extends \Opencart\System\Engine\Controller
|
||||
*/
|
||||
public function index(): string
|
||||
{
|
||||
if (([] === $this->orderInfo)
|
||||
|| !$this->isPaidWithModule()
|
||||
|| !$this->isAwaitingPayment((int)($this->orderInfo['order_status_id'] ?? 0))
|
||||
) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$this->load->language('extension/payanyway/payment/payanyway');
|
||||
$this->document->setTitle($this->language->get('heading_title'));
|
||||
|
||||
@@ -85,14 +73,34 @@ class PayAnyWay extends \Opencart\System\Engine\Controller
|
||||
: self::PAYMENT_URL_DEMO;
|
||||
|
||||
$data['MNT_ID'] = $this->mntId;
|
||||
$data['MNT_TRANSACTION_ID'] = $this->createTransactionId($this->orderId);
|
||||
$data['MNT_AMOUNT'] = $this->formatPrice((float)($this->orderInfo['total'] ?? 0));
|
||||
$data['MNT_AMOUNT'] = $this->getOrderAmount();
|
||||
$data['MNT_TRANSACTION_ID'] = $this->createTransactionId($this->orderId, $data['MNT_AMOUNT']);
|
||||
$data['MNT_CURRENCY_CODE'] = $this->currency;
|
||||
$data['MNT_TEST_MODE'] = '0';
|
||||
$data['MNT_TEST_MODE'] = $this->testMode ? '1' : '0';
|
||||
$data['MNT_DESCRIPTION'] = $this->getDescription();
|
||||
$data['MNT_SUBSCRIBER_ID'] = $this->getSubscriberId();
|
||||
|
||||
$signature = md5(
|
||||
$data['MNT_SIGNATURE'] = $this->buildFormSignature($data);
|
||||
$urlArgs = $this->getUrlArgs($this->session->data['customer_token'] ?? null);
|
||||
$data['MNT_SUCCESS_URL'] = $this->url->link('extension/payanyway/payment/payanyway.success', $urlArgs, true);
|
||||
$data['MNT_FAIL_URL'] = $this->url->link('extension/payanyway/payment/payanyway.fail', $urlArgs, true);
|
||||
$data['MNT_RETURN_URL'] = $this->url->link('checkout/checkout', $urlArgs, true);
|
||||
$data['moneta_locale'] = $this->language->get('text_locale');
|
||||
$data['MNT_CMS'] = $this->getCms();
|
||||
|
||||
$data['btn_confirm'] = $this->language->get('text_paw_pay');
|
||||
|
||||
$data['confirm_url'] = $this->url->link('extension/payanyway/payment/payanyway.confirm', $urlArgs, true);
|
||||
|
||||
return $this->load->view('extension/payanyway/payment/payanyway', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array<string, mixed> $data
|
||||
*/
|
||||
private function buildFormSignature(array $data): string
|
||||
{
|
||||
return md5(
|
||||
$data['MNT_ID'] .
|
||||
$data['MNT_TRANSACTION_ID'] .
|
||||
$data['MNT_AMOUNT'] .
|
||||
@@ -101,31 +109,13 @@ class PayAnyWay extends \Opencart\System\Engine\Controller
|
||||
$data['MNT_TEST_MODE'] .
|
||||
$this->integrityCode,
|
||||
);
|
||||
$data['MNT_SIGNATURE'] = $signature;
|
||||
$customerToken = $this->session->data['customer_token'];
|
||||
$data['MNT_SUCCESS_URL'] = $this->url->link('extension/payanyway/payment/payanyway.success', 'customer_token=' . $customerToken, true);
|
||||
$data['MNT_FAIL_URL'] = $this->url->link('extension/payanyway/payment/payanyway.fail', 'customer_token=' . $customerToken, true);
|
||||
$data['MNT_RETURN_URL'] = $this->url->link('checkout/checkout', 'customer_token=' . $customerToken, true);
|
||||
$data['moneta_locale'] = $this->language->get('text_locale');
|
||||
$data['MNT_CMS'] = $this->cmsModuleVersion;
|
||||
|
||||
$data['btn_confirm'] = $this->language->get('text_paw_pay');
|
||||
|
||||
$data['confirm_url'] = $this->url->link('extension/payanyway/payment/payanyway.confirm', 'customer_token=' . $customerToken, true,);
|
||||
|
||||
return $this->load->view('extension/payanyway/payment/payanyway', $data);
|
||||
}
|
||||
|
||||
public function confirm(): void
|
||||
{
|
||||
$this->load->language('extension/payanyway/payment/payanyway');
|
||||
|
||||
$orderStatusId = isset($this->orderInfo['order_status_id']) ? (int)$this->orderInfo['order_status_id'] : null;
|
||||
if ((null !== $orderStatusId) && ($orderStatusId !== $this->successOrderStatusId)) {
|
||||
$this->addOrderHistory($this->orderId, $this->pendingOrderStatusId, $this->language->get('text_order_confirmed'),);
|
||||
}
|
||||
|
||||
$json['success'] = true;
|
||||
$json['success'] = $this->changeStatusUnderOrderLock(true, $this->pendingOrderStatusId, $this->language->get('text_order_confirmed'));
|
||||
|
||||
$this->response->addHeader('Content-Type: application/json');
|
||||
$this->response->setOutput(json_encode($json));
|
||||
@@ -135,36 +125,73 @@ class PayAnyWay extends \Opencart\System\Engine\Controller
|
||||
{
|
||||
$this->load->language('extension/payanyway/payment/payanyway');
|
||||
|
||||
$orderStatusId = isset($this->orderInfo['order_status_id']) ? (int)$this->orderInfo['order_status_id'] : null;
|
||||
if ((null !== $orderStatusId) && ($orderStatusId !== $this->successOrderStatusId)) {
|
||||
$this->addOrderHistory($this->orderId, $this->pendingOrderStatusId, $this->language->get('text_payment_processing'));
|
||||
}
|
||||
$this->changeStatusUnderOrderLock(false, $this->pendingOrderStatusId, $this->language->get('text_payment_processing'));
|
||||
|
||||
$customerToken = $this->request->get['customer_token'] ?? '';
|
||||
|
||||
$this->response->redirect($this->url->link('checkout/success', 'customer_token=' . $customerToken, true));
|
||||
$this->response->redirect($this->url->link('checkout/success', $this->getUrlArgs($this->request->get['customer_token'] ?? null), true));
|
||||
}
|
||||
|
||||
public function fail(): void
|
||||
{
|
||||
$this->load->language('extension/payanyway/payment/payanyway');
|
||||
|
||||
$orderStatusId = isset($this->orderInfo['order_status_id']) ? (int)$this->orderInfo['order_status_id'] : null;
|
||||
if ((null !== $orderStatusId) && ($orderStatusId !== $this->successOrderStatusId)) {
|
||||
$this->addOrderHistory($this->orderId, $this->errorOrderStatusId, $this->language->get('text_payment_error'));
|
||||
}
|
||||
$this->changeStatusUnderOrderLock(false, $this->errorOrderStatusId, $this->language->get('text_payment_error'));
|
||||
|
||||
$this->response->redirect($this->url->link('checkout/failure', '', true));
|
||||
}
|
||||
|
||||
/**
|
||||
* Смена статуса со страницы покупателя — под блокировкой заказа, как в Pay URL: заказ
|
||||
* перечитывается, оплаченный (сейчас или по истории) не трогается. Возврат с MONETA.RU
|
||||
* приходит параллельно с уведомлением об оплате.
|
||||
*
|
||||
* @param bool $allowFailed подтверждение формы допускает повторную попытку после «Неуспешного»
|
||||
* @throws \Exception
|
||||
*/
|
||||
private function changeStatusUnderOrderLock(bool $allowFailed, int $orderStatusId, string $comment): bool
|
||||
{
|
||||
if (!$this->isStatusChangeableByCustomer($allowFailed)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->load->model('extension/payanyway/payment/payanyway');
|
||||
if (!$this->model_extension_payanyway_payment_payanyway->acquireOrderLock((int)$this->orderId, self::$orderLockTimeoutSeconds)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->loadOrder($this->orderId);
|
||||
$changeable = $this->isStatusChangeableByCustomer($allowFailed)
|
||||
&& !$this->model_extension_payanyway_payment_payanyway->hasOrderStatusInHistory((int)$this->orderId, $this->successOrderStatusId);
|
||||
if ($changeable) {
|
||||
$this->addOrderHistory($this->orderId, $orderStatusId, $comment);
|
||||
}
|
||||
$this->model_extension_payanyway_payment_payanyway->releaseOrderLock((int)$this->orderId);
|
||||
|
||||
return $changeable;
|
||||
}
|
||||
|
||||
/** Заказ модуля, ещё не ушедший дальше «Обрабатываемого» (или «Неуспешного» — для повторной попытки). */
|
||||
private function isStatusChangeableByCustomer(bool $allowFailed): bool
|
||||
{
|
||||
if (([] === $this->orderInfo) || !$this->isPaidWithModule()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$orderStatusId = (int)$this->orderInfo['order_status_id'];
|
||||
|
||||
return $allowFailed ? $this->isAwaitingPayment($orderStatusId) : in_array($orderStatusId, [0, $this->pendingOrderStatusId], true);
|
||||
}
|
||||
|
||||
private function getDescription(): string
|
||||
{
|
||||
$orderId = $this->orderInfo['order_id'] ?? null;
|
||||
$description = "Оплата заказа" . (!empty($orderId) ? " №{$orderId}" : '');
|
||||
$description = $this->language->get('text_description');
|
||||
if (!empty($orderId)) {
|
||||
$description .= ' ' . sprintf($this->language->get('text_description_number'), $orderId);
|
||||
}
|
||||
|
||||
$name = $this->getClientName();
|
||||
if (null !== $name) {
|
||||
$description .= " от {$name}";
|
||||
$description .= ' ' . sprintf($this->language->get('text_description_customer'), $name);
|
||||
}
|
||||
|
||||
$comment = $this->orderInfo['comment'] ?? '';
|
||||
@@ -175,6 +202,16 @@ class PayAnyWay extends \Opencart\System\Engine\Controller
|
||||
return $this->validateString($description, self::DESCRIPTION_MAX_LENGTH);
|
||||
}
|
||||
|
||||
private function getUrlArgs(mixed $customerToken): string
|
||||
{
|
||||
$args = 'language=' . $this->config->get('config_language');
|
||||
if (is_string($customerToken) && ('' !== $customerToken)) {
|
||||
$args .= '&customer_token=' . urlencode($customerToken);
|
||||
}
|
||||
|
||||
return $args;
|
||||
}
|
||||
|
||||
private function getSubscriberId(): string
|
||||
{
|
||||
return $this->getClientEmail() ?? $this->getClientPhone() ?? '';
|
||||
|
||||
Reference in New Issue
Block a user