Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/modules/sale/lib/paysystem/robokassa/
Upload File :
Current File : /var/www/homesaver/www/bitrix/modules/sale/lib/paysystem/robokassa/registerservice.php

<?php

namespace Bitrix\Sale\PaySystem\Robokassa;

use Bitrix\Main;
use Bitrix\Sale;

final class RegisterService
{
	private const SIGN_PART = 'bitrix';
	private const CREATE_ACTION = 'rk_reg_created';

	public function processRequest(Main\Request $request): Sale\PaySystem\ServiceResult
	{
		$result = new Sale\PaySystem\ServiceResult();

		$action = $request->get('act');
		if ($action === self::CREATE_ACTION)
		{
			$checkRequiredFieldsResult = $this->checkRequiredFields($request);
			if (!$checkRequiredFieldsResult->isSuccess())
			{
				$result->addErrors($checkRequiredFieldsResult->getErrors());
				return $result;
			}

			$signedDomain = $request->get('signed_domain') ?? '';
			if (!$this->isValidDomain($signedDomain))
			{
				$result->addError(new Main\Error('Signed domain not valid'));
				return $result;
			}

			$shopId = $request->get('shopId');
			$sign = $request->get('sign');
			$key1 = $request->get('key_1');
			$key2 = $request->get('key_2');

			if (!$this->isSignValid($shopId, $sign))
			{
				$result->addError(new Main\Error('Bad sign'));
				return $result;
			}

			try
			{
				$saveResult = self::save($shopId, $key1, $key2);
			}
			catch (\Exception $exception)
			{
				$saveResult = new Main\Result();
				$saveResult->addError(new Main\Error($exception->getMessage()));
			}

			if (!$saveResult->isSuccess())
			{
				$result->addErrors($saveResult->getErrors());
			}
		}

		return $result;
	}

	/**
	 * Saves new shop settings
	 *
	 * @param string $shopId
	 * @param string $key1
	 * @param string $key2
	 * @return Main\ORM\Data\Result
	 */
	private static function save(string $shopId, string $key1, string $key2): Main\Result
	{
		$settingsFields = self::prepareSettings($shopId, $key1, $key2);

		$shopSettings = new Sale\PaySystem\Robokassa\ShopSettings();

		$currentSettings = $shopSettings->get();
		if ($currentSettings)
		{
			return $shopSettings->update($settingsFields);
		}

		return $shopSettings->add($settingsFields);
	}

	private static function prepareSettings(string $shopId, string $key1, string $key2): array
	{
		return [
			'ROBOXCHANGE_SHOPLOGIN' => $shopId,
			'ROBOXCHANGE_SHOPPASSWORD' => $key1,
			'ROBOXCHANGE_SHOPPASSWORD2' => $key2,
		];
	}

	private function isSignValid(string $shopId, string $sign): bool
	{
		$calculatedSign = md5(sprintf('%s.%s', self::SIGN_PART, $shopId));
		return strcasecmp($calculatedSign, $sign) === 0;
	}

	private function checkRequiredFields(Main\Request $request): Main\Result
	{
		$result = new Main\Result();

		$requireFields = [
			'shopId',
			'sign',
			'key_1',
			'key_2',
			'signed_domain',
		];

		foreach ($requireFields as $field)
		{
			if (!$request->get($field))
			{
				$result->addError(new Main\Error("{$field} not found"));
			}
		}

		return $result;
	}

	public function isValidDomain(string $signedDomain): bool
	{
		$request = Main\Application::getInstance()->getContext()->getRequest();
		$protocol = $request->isHttps() ? 'https' : 'http';
		$domain = "{$protocol}://{$request->getHttpHost()}";

		return (new Sale\PaySystem\Robokassa\DomainSigner($domain))->isValidDomain($signedDomain);
	}
}