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


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

Интеграция с платёжной системой Сбербанка


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

#1 Irina

Irina

Отправлено 03 May 2017 - 07:07

Version: 2.2.7 Pro rev3148

 

Здравствуйте, помогите с интеграцией платежной системы Сбербанка.

Пытаюсь написать модуль, возникает следующие проблемы

1) public function getRedirectUrl - вызывается 12 раз и не переходит на платежную форму Сбербанка. Первый раз запрос к Себрбанку проходит корректно, остальные Сбербанк отвечает, что такой заказ уже обработан. Данная проблема уже обсуждалась на форуме http://forum.jbzoo.c...ma-troekratnog/ , но решение так и не было найдено. Для решения этой проблемы были добавлены сессионные переменные $_SESSION['SberbankOrderId'] и $_SESSION['SberbankFormUrl']. Я понимаю, что это "костыли", но ничего другого не придумала. Теперь public function getRedirectUrl все равно вызывается 12 раз, но переход на платежную форму Сбербанка с необходимыми параметрами происходит корректно.

 

2) Но теперь встала другая проблема - после того, как пользователь произвел оплату на сайте Сбербанка, Сбербанк редиректит на сайт магазина, вызывается public function getRequestOrderId(), но не вызываются функции public function getRequestOrderSum() и public function isValid. При этом в функции getRequestOrderId() делается запрос на страницу проверки состояния оплаты, возвращается корректный номер заказа. Но после этого статус оплаты не меняется на оплачено. В контексте этой функции я не могу обратиться к заказу, он просто не видит текущий заказ.

$order = $this->getOrder();
$orderId = $this->getOrderId();

 

Как-нибудь можно принудительно поменять статус на оплачено после проверки статуса вот здесь?

 

if ($orderStatus == '1' || $orderStatus == '2')

        {
            $this->logInfo("getRequestOrderId:1 " . $action_adr, "| " . $orderNumber, "| " . $this->isDebug());
            return $orderNumber;
        }

 

Или есть иные, стандартные способы смены статуса?

 

Во вложении архив с модулем оплаты (sberbank.zip), простейший пример, который даёт Сбербанк (rest.php), пример модуля оплаты для Виртуемарт (Плагин joomla (Vm_3.0.20).rar), инструкция от Сбербанка.

<?php
/**
 * JBZoo App is universal Joomla CCK, application for YooTheme Zoo component
 *
 * @package     jbzoo
 * @version     2.x Pro
 * @author      JBZoo App http://jbzoo.com
 * @copyright   Copyright (C) JBZoo.com,  All rights reserved.
 * @license     http://jbzoo.com/license-pro.php JBZoo Licence
 * @coder       Denis Smetannikov <denis@jbzoo.com>
 */

// no direct access
defined('_JEXEC') or die('Restricted access');

/**
 * Class JBCartElementPaymentSberbank
 */

class JBCartElementPaymentSberbank extends JBCartElementPayment
{
	public function getRedirectUrl()
	{
		$method_step = $this->config->get('method_step');
		
		$order = $this->getOrder();
		$orderId = $this->getOrderId();
		$payCurrency = $this->getDefaultCurrency();
		$orderAmount = $this->_order->val($this->getOrderSumm(), $order->getCurrency())->convert($payCurrency);
		$orderAmount = $orderAmount->val() * 100;
		
		if (!session_id()) 
		{
			session_start();
		}
		if (!isset($_SESSION['SberbankOrderId']))
		{
			$_SESSION['SberbankOrderId'] = 0;
			$_SESSION['SberbankFormUrl'] = "";
		}
		if ($_SESSION['SberbankOrderId'] != $orderId)
		{
			$_SESSION['SberbankOrderId'] = $orderId;
			$fields = array
			(
				'userName' => JString::trim($this->config->get('merchant')),
				'password' => JString::trim($this->config->get('password')),
				'amount' => $orderAmount,
				'orderNumber' => $orderId, //$this->getOrderId(),
				'returnUrl' => $this->_jbrouter->payment('success'), //'http://мойсайт/index.php?option=com_zoo&controller=payment&task=paymentSuccess',
				'failUrl' => $this->_jbrouter->payment('fail') //'http://мойсайт/index.php?option=com_zoo&controller=payment&task=paymentFail'
			);
			
			if($this->isDebug())
			{
				$action_adr = $this->config->get('API_URL_TEST');
			}
			else
			{
				$action_adr = $this->config->get('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);
	
			//if($this->isDebug())
			//{
				$this->logInfo("getRedirectUrl: " . $action_adr, http_build_query($fields), $response);
			//}
			
			$response = json_decode($response, true);
			$errorCode = $response['errorCode'];
			if ($errorCode > 0)
			{
				echo 'ошибка #'.$errorCode.': '.$response['errorMessage'];
			}
			$_SESSION['SberbankFormUrl'] = $response['formUrl'];
			return $response['formUrl'];
			
		}
		else
		{
			return $_SESSION['SberbankFormUrl'];
		}
	}
	
	public function isValid($params = array())
	{
		$this->logInfo("getRequestOrderId:3 " . $action_adr, "", "");
		return true;
	}
	
	public function getRequestOrderId()
	{
		$method_step = $this->config->get('method_step');
		
		$fields = array(
		'userName' => $this->config->get('merchant'),
		'password' => $this->config->get('password'),
		'orderId' => $_GET['orderId']
		);
	
		if ($this->isDebug())
		{
			$action_adr = $this->config->get('API_URL_TEST');
		}
		else
		{
			$action_adr = $this->config->get('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);
		
		//if($this->isDebug())
		//{
			$this->logInfo("getRequestOrderId: " . $action_adr, http_build_query($fields), $response);
		//}
		
		$response = json_decode($response, true);
		$orderStatus = $response['OrderStatus'];
		$orderNumber = $response['OrderNumber'];
		
		if ($orderStatus == '1' || $orderStatus == '2') 
		{
			$this->logInfo("getRequestOrderId:1 " . $action_adr, "| " . $orderNumber, "| " . $this->isDebug());
			return $orderNumber;
		}
		else
		{
			$this->logInfo("getRequestOrderId:2 " . $action_adr, "", "");
			return 0;
		}
		//return $this->app->jbrequest->get('OrderNumber');	

	}
	
	public function getRequestOrderSum()
	{
		/*
		$method_step = $this->config->get('method_step');
		
		$fields = array(
		'userName' => $this->config->get('merchant'),
		'password' => $this->config->get('password'),
		'orderId' => $_GET['orderId']
		);
	
		if ($this->isDebug())
		{
			$action_adr = $this->config->get('API_URL_TEST');
		}
		else
		{
			$action_adr = $this->config->get('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);

		//if($this->isDebug())
		//{
			$this->logInfo("getRequestOrderSum: " . $action_adr, http_build_query($fields), $response);
		//}

		$response = json_decode($response, true);

	        $order  = $this->getOrder();
	        $amount = $this->_order->val($response['Amount'], $order->getCurrency());

	        return $amount;
		*/
		
		$this->logInfo("getRequestOrderId:4 " . $action_adr, "", "");
		$order = $this->getOrder();
		$orderId = $this->getOrderId();
		$payCurrency = $this->getDefaultCurrency();
		$orderAmount = $this->_order->val($this->getOrderSumm(), $order->getCurrency())->convert($payCurrency);
		$amount = $orderAmount->val();
		return $amount;
		
	}

	public function logInfo ($action, $request, $response) {
		$file = JPATH_ROOT . "/logs/rbs_payment.log";
		$date = JFactory::getDate ();
		$fp = fopen ($file, 'a');
		fwrite ($fp, "\n" . $date->Format ('%Y-%m-%d %H:%M:%S') . " " . $action . "\nrequest: " . $request . "\nresponse: " . $response);
		fclose ($fp);
	}

}

Прикрепленные файлы


Сообщение отредактировал Irina: 18 January 2018 - 09:52

  • 0

#2 dalwebmaster

dalwebmaster

Отправлено 03 May 2017 - 09:12

Подписываюсь, готов сложится на доработку, т.к. насколько я понимаю, готового решения в маркетплейсе или на форуме нет?
Мне нужно подключение эквайринга Сбербанка на сайт, как платежной системы (оплата картами).

Всю документацию по API от Сбербанка готов предоставить и доступы.


Сообщение отредактировал dalwebmaster: 03 May 2017 - 09:14

  • 0

Все что делал www.dalweb.su и делаю www.dalweb.studio


#3 SmetDenis

SmetDenis

Отправлено 04 May 2017 - 10:00

public function getRedirectUrl - вызывается 12 раз и не переходит на платежную форму Сбербанка.


1. Честно говоря, не знаю почему у вас вызывается редирект 12 раз. Может у вас 12 одинаковых элементов на странице?
Он срабатывает только раз при сабмите формы заказа.


Функция getRequestOrderId должна бывать простейшей.
Что-то вроде этого, не более.

    /**
     * Detect order id from merchant's robot request
     * @return int
     */
    public function getRequestOrderId()
    {
        return $this->app->jbrequest->get('order_id');
    } 
Она по сути вернет значение $_REQUEST['order_id'] так JBZoo узнает какой именно заказ был оплачен.

Функция getRequestOrderSum вернет сумму заказа, которая пришла от платежной системы.
Так JBZoo будет уверен что сумма заказа в базе сайта и сумма реальной оплаты совпадают один к одному.

Если все стандартные проверки прошли, то останется лишь одна проверка - isValid().
Это валидация уже именно платежной системы, например сверка подписей, хешей, сигнатур итд.
По сути именно тут будет больше всего кода.


Посмотрите элемент робокассы. Он очень простой и наглядный.
  • 0
JBZoo v4.0 и новый чудный мир Open Source GPL
Отключайте проверку лицензий как моно скорее!


— Есть два типа людей: Кто еще не делает бекапы и кто уже делает бекапы.


#4 Irina

Irina

Отправлено 05 May 2017 - 07:17

В общем вот, что у меня получилось (рабочая версия), предлагаю всем протестировать и добавить свои "5 копеек".

Прикрепленные файлы

  • Прикрепленный файл  sberbank.zip   17.57К   24 Количество загрузок:

  • 2

#5 dalwebmaster

dalwebmaster

Отправлено 08 May 2017 - 06:12

В общем вот, что у меня получилось (рабочая версия), предлагаю всем протестировать и добавить свои "5 копеек".

 

А адрес рабочего сервера вам выдали после удачного тестового платежа?

 

Для теста он не нужен, насколько я понимаю. И нужно ли ставить "Режим отладки"?

Прикрепленный файл  2017-05-08_15-08-54.png   11.47К   6 Количество загрузок:


  • 0

Все что делал www.dalweb.su и делаю www.dalweb.studio


#6 Irina

Irina

Отправлено 08 May 2017 - 06:40

Адреса рабочего и тестового серверов прислала техподдержка Сбербанка. Режим отладки необходимо установить, если Вы собираетесь работать с тестовым сервером.

 

А адрес рабочего сервера вам выдали после удачного тестового платежа?

 

Для теста он не нужен, насколько я понимаю. И нужно ли ставить "Режим отладки"?

attachicon.gif2017-05-08_15-08-54.png


  • 0

#7 Irina

Irina

Отправлено 08 May 2017 - 06:43

Чтобы работать даже с тестовым сервером, Сбербанк должен создать Вам мерчант.

 

А адрес рабочего сервера вам выдали после удачного тестового платежа?

 

Для теста он не нужен, насколько я понимаю. И нужно ли ставить "Режим отладки"?

attachicon.gif2017-05-08_15-08-54.png


  • 0

#8 nick

nick

Отправлено 16 May 2017 - 09:56

В общем вот, что у меня получилось (рабочая версия), предлагаю всем протестировать и добавить свои "5 копеек".

Здравствуйте, на тестовом сервере после успешного платежа - не выставляется статус платежа на "Оплачено" - и в лог выводится - Заказ с таким номером уже обработан.

Что-то дополнительно нужно сделать?


  • 0

Joomla: 3.6.2 JBZoo: 2.2.9 Pro rev3184 Zoo: 3.3.20 WidgetKit: 1.5.9


#9 dalwebmaster

dalwebmaster

Отправлено 22 May 2017 - 08:45

Ввел все данные - при оформлении заказа - "Заказ успешно создан" и все


  • 0

Все что делал www.dalweb.su и делаю www.dalweb.studio


#10 Sandmansss

Sandmansss

Отправлено 05 July 2017 - 15:53

Таже самая проблема. 

Ввел адрес тестового сервера -  https://3dsec.sberba...-uat/index.html 

Включил режим отладки.

 

При оформлении заказа выбираю заказать и оплатить. После нажатия кнопки. Получаю сообщение что заказ успешно создан, перехода на сайт ссбера не происходит. Что я могу делать не так?


  • 0




Click to return to top of page in style!