Использую Joomla: 3.5.1 JBZoo: 2.2.8 Pro rev3167 Zoo: 3.3.20
Есть модуль оплаты Сбербанк (код ниже). Все прекрасно работает на другом сайте (единственное отличие - версия jbzoo 2.2.5 Pro rev3095.
При оформлении заказа после нажатия кнопки оплатить выдается ошибка, что заказ с таким номером уже обработан, а должна появляться стандартная страница оплаты картой сбера.
Как удалось выяснить происходит это из-за того, что сайт после оформления заказа отправляет API запрос три раза, на первый запрос приходит корректный ответ с ссылкой на оплату. На последующие как раз и приходит ответ, что такой заказ есть, т.к. он уже добавлен.
Повторюсь - на другом сайте все работает, отличается только версией jbzoo. Подскажите, где искать?..
Сам код плагина:
<?php
// no direct access
defined('_JEXEC') or die('Restricted access');
define('API_URL_PROD', 'https://securepaymen...u/payment/rest/'); // Продакшн/Бой
define('API_URL_TEST', 'https://3dsec.sberba...u/payment/rest/'); // Тест
class JBCartElementPaymentSberbank extends JBCartElementPayment
{
public function getRedirectUrl()
{
$method_test = $this->config->get('test');
$method_step = $this->config->get('step');
$order = $this->getOrder();
$orderId = $this->getOrderId();
$payCurrency = $this->getDefaultCurrency();
$orderAmount = $this->_order->val($this->getOrderSumm(), $order->getCurrency())->convert($payCurrency);
$orderAmount = $orderAmount->val() * 100;
$fields = array(
'userName' => $this->config->get('merchant'),
'password' => $this->config->get('password'),
'amount' => $orderAmount,
'orderNumber' => $this->getOrderId(),
'returnUrl' => 'http://мойсайт/index.php?option=com_zoo&controller=payment&task=paymentSuccess',
'failUrl' => 'http://мойсайт/index.php?option=com_zoo&controller=payment&task=paymentFail'
);
if($method_test == '1') {$action_adr = API_URL_TEST;}
else {$action_adr = API_URL_PROD;}
if($method_step == '1') {$action_adr .= 'register.do';}
else {$action_adr .= 'registerPreAuth.do';}
$rbsCurl = curl_init();
curl_setopt_array($rbsCurl, array(
CURLOPT_URL => $action_adr,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($fields)
));
$response = curl_exec($rbsCurl);
curl_close($rbsCurl);
$response = json_decode($response, true);
$errorCode = $response['errorCode'];
if ($errorCode > 0) {
echo 'Ошибка #'.$errorCode.': '.$response['errorMessage'];
}
return $response['formUrl'];
}
public function isValid($params = array())
{
return true;
}
public function getRequestOrderId()
{
$method_test = $this->config->get('test');
$method_step = $this->config->get('step');
$fields = array(
'userName' => $this->config->get('merchant'),
'password' => $this->config->get('password'),
'orderId' => $_GET['orderId']
);
if($method_test == '1') {$action_adr = API_URL_TEST;}
else {$action_adr = API_URL_PROD;}
$action_adr .= 'getOrderStatus.do';
$rbsCurl = curl_init();
curl_setopt_array($rbsCurl, array(
CURLOPT_URL => $action_adr,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($fields)
));
$response = curl_exec($rbsCurl);
curl_close($rbsCurl);
$response = json_decode($response, true);
return $response['OrderNumber'];
}
public function getRequestOrderSum()
{
$order = $this->getOrder();
$orderId = $this->getOrderId();
$payCurrency = $this->getDefaultCurrency();
$orderAmount = $this->_order->val($this->getOrderSumm(), $order->getCurrency())->convert($payCurrency);
$amount = $orderAmount->val();
return $amount;
}
}