Документация для разработчиков
Темная тема

Подготовка платёжной системы

Подготовка платёжной системы

Интерфейс \Bitrix\Sale\PaySystem\Cashbox\ISupportPrintCheck

Необходимо указать, что Ваша платёжная система поддерживает печать чеков.

Для этого нужно реализовать интерфейс ISupportPrintCheck, который имеет 1 метод getCashboxClass:

public static function getCashboxClass(): string;

Метод должен вернуть строку с названием класса кассы, через которую будет выполняться печать чеков.

Пример:

class RoboxchangeHandler extends PaySystem\ServiceHandler implements PaySystem\Cashbox\ISupportPrintCheck
{
	//...
	public static function getCashboxClass(): string
	{
		return '\\'.Cashbox\CashboxRobokassa::class;
	}
}

Трейт \Bitrix\Sale\PaySystem\Cashbox\CheckTrait

Для удобства работы с товарами, которые должны быть переданы в запросе при создании платежа во внешней системе, существует трейт CheckTrait.

Трейт имеет метод buildCheckQuery:

private function buildCheckQuery(Sale\Payment $payment): Sale\PaySystem\ServiceResult

Использование данного метода делегирует сборку товаров кассе. Это гарантирует, что переданные в платёжную систему товары и товары, по которым будет напечатан закрывающий чек, будут одними и теми же.

Пример

class RoboxchangeHandler extends PaySystem\ServiceHandler implements PaySystem\Cashbox\ISupportPrintCheck
{
	// Используем трейт
	use PaySystem\Cashbox\CheckTrait;
	public function initiatePay(Payment $payment, Request $request = null)
	{
		$receipt = null;
		// Проверяем можно/нужно ли получать данные для чека
		if ($this->service->canPrintCheckSelf($payment))
		{
			$receiptResult = $this->getReceipt($payment);
			if (!$receiptResult->isSuccess())
			{
				$result = new PaySystem\ServiceResult();
				$result->addErrors($receiptResult->getErrors());
				return $result;
			}
			$receipt = self::encode($receiptResult->getData());
			PaySystem\Logger::addDebugInfo(__CLASS__.": receipt = {$receipt}");
		}
		// $receipt будет содержать данные для чека, которые нужно отправить в платёжный шлюз
	}
	private function getReceipt(Payment $payment): PaySystem\ServiceResult
	{
		$result = new PaySystem\ServiceResult();
		// Используем метод buildCheckQuery из трейта
		$checkQueryResult = $this->buildCheckQuery($payment);
		if ($checkQueryResult->isSuccess())
		{
			// $receiptData будет содержать данные по чеку, которые были получены от кассы
			$receiptData = $checkQueryResult->getData();
			if (!empty($receiptData['items']) && !empty($receiptData['sno']))
			{
				$result->setData
				(
					[
						'sno' => $receiptData['sno'],
						'items' => $receiptData['items'],
					]
				);
			}
			else
			{
				$result->addError(PaySystem\Error::create('Ошибка при формировании чека'));
			}
		}
		else
		{
			$result->addErrors($checkQueryResult->getErrors());
		}
		return $result;
	}
	//...
	// Возвращаем название кассы
	public static function getCashboxClass(): string
	{
		return '\\'.Cashbox\CashboxRobokassa::class;
	}
}



© «Битрикс», 2001-2024, «1С-Битрикс», 2024