Перейти к содержимому


Фотография
- - - - -

Элемент оплаты Сбербанк. Проблема троекратного вызова API


Сообщений в теме: 4

#1 Константин Дудукалов

Константин Дудукалов

Отправлено 12 January 2017 - 17:07

Использую 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;
}

}



#2 Константин Дудукалов

Константин Дудукалов

Отправлено 16 January 2017 - 11:54

Раз сайты отличаются только версией jbzoo, значит дело в самом jbzoo? Денис, можете подсказать, куда копать хоть?...



#3 Константин Дудукалов

Константин Дудукалов

Отправлено 24 January 2017 - 12:04

Этот вопрос выходит за рамки техподдержки? На письмо в support тоже тишина (((



#4 Константин Дудукалов

Константин Дудукалов

Отправлено 29 January 2017 - 17:59

Выяснилось, что не работает, если установлено хоть 1 любое событие оповещения на любой статус (email или смс). Если удалить все оповещения, то работает.. Как бы это совместить?...



#5 Владимир Лозицкий

Владимир Лозицкий

Отправлено 24 May 2017 - 15:46

А можно спросить модуль сами писали или готовый где то прикупили?






Click to return to top of page in style!