Documentation

Payment system preparation

Payment system preparation

Interface \Bitrix\Sale\PaySystem\Cashbox\ISupportPrintCheck

You need to indicate that your payment system supports printing of receipts.

To do it, you need to implement the interface ISupportPrintCheck that has a 1 single method getCashboxClass:

public static function getCashboxClass(): string;

The method must return a string with the class name [link=13888374]cash registers[/link], using it to print receipts.

Example:

class RoboxchangeHandler extends PaySystem\ServiceHandler implements PaySystem\Cashbox\ISupportPrintCheck
{
    //...

    public static function getCashboxClass(): string
    {
        return '\\'.Cashbox\CashboxRobokassa::class;
    }
}

Trait \Bitrix\Sale\PaySystem\Cashbox\CheckTrait

For convenient handling of products to be passed in query when creating a payment in an external system, there is an available trait CheckTrait.

Trait has the method buildCheckQuery:

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

Using this method delegates the product retrieval to a [link=13888374]cash register[/link]. This guarantees that products and products with closing receipt to be printed - will be identical.

Example

class RoboxchangeHandler extends PaySystem\ServiceHandler implements PaySystem\Cashbox\ISupportPrintCheck
{
    // Use the trait
    use PaySystem\Cashbox\CheckTrait;

    public function initiatePay(Payment $payment, Request $request = null)
    {
        $receipt = null;
        
        // Check if receipt data can/must be retrieved
        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 will contain data for receipt to be sent to payment gate
    }

    private function getReceipt(Payment $payment): PaySystem\ServiceResult
    {
        $result = new PaySystem\ServiceResult();

        // Use the method buildCheckQuery from the trait
        $checkQueryResult = $this->buildCheckQuery($payment);
        if ($checkQueryResult->isSuccess())
        {
            // $receiptData will contain receipt data, retrieved from cash register
            $receiptData = $checkQueryResult->getData();
            if (!empty($receiptData['items']) && !empty($receiptData['sno']))
            {
                $result->setData([
                    'sno' => $receiptData['sno'],
                    'items' => $receiptData['items'],
                ]);
            }
            else
            {
                $result->addError(PaySystem\Error::create('Error generating the receipt'));
            }
        }
        else
        {
            $result->addErrors($checkQueryResult->getErrors());
        }

        return $result;
    }

    //...

    // Return cash register name
    public static function getCashboxClass(): string
    {
        return '\\'.Cashbox\CashboxRobokassa::class;
    }
}


© «Bitrix24», 2001-2024
Up