MOON
Server: Apache
System: Linux server.royaltuning.hu 4.18.0-425.13.1.el8_7.x86_64 #1 SMP Tue Feb 21 04:20:52 EST 2023 x86_64
User: royaltuning (1001)
PHP: 8.2.32
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //var/www/html/Modules/Payment/Gateways/BarionPay.php
<?php

namespace Modules\Payment\Gateways;

use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use LaravelHungary\Barion\Barion;
use LaravelHungary\Barion\Enums\Currency;
use LaravelHungary\Barion\Enums\FundingSource;
use LaravelHungary\Barion\Enums\Locale;
use LaravelHungary\Barion\Enums\PaymentType;
use Modules\Order\Entities\Order;
use Modules\Payment\GatewayInterface;
use Modules\Payment\Responses\BarionResponse;

class BarionPay implements GatewayInterface
{
    public $label;
    public $description;

    public function __construct()
    {
        $this->label = setting('barion_label');
        $this->description = setting('barion_description');
    }

    public function buildRequestBody($order)
    {
        $reference = 'ref' . time();
        $items = $this->prepareItems($order);
        return [
            'PaymentType' => PaymentType::IMMEDIATE,
            'GuestCheckOut' => true,
            'FundingSources' => [FundingSource::ALL],
            'RedirectUrl' => $this->getRedirectUrl($order, $reference),
            'Locale' => Locale::HU,
            'Currency' => Currency::HUF,
            'Transactions' => [
                [
                    'POSTransactionId' => "ROYAL-" . $order->id,
                    'Payee' => env("BARION_EMAIL"),
                    'Total' => $order->total->round()->amount(),
                    'Items' => $items
                ]
            ]
        ];

    }

    public function purchase(Order $order, Request $request)
    {

        $data = $this->buildRequestBody($order);
        Storage::disk('apilogsBarion')->put('payment-request.json', json_encode($data));
        $payment = call_user_func(['Barion', 'paymentStart'], $data);
        Storage::disk('apilogsBarion')->put('payment-response.json', json_encode($payment));

        return new BarionResponse($order, $payment);
    }

    public function prepareItems($order): array
    {
        $items = $this->prepareProductItems($order->products);

        $discountItem = $this->prepareDiscountItem($order);

        if (!empty($discountItem["UnitPrice"])) {
            $items[] = $this->prepareDiscountItem($order);
        }

        if (!empty($discountItem["UnitPrice"])) {
            $items[] = $this->prepareDiscountItem($order);
        }

        if (!empty($order->shipping_cost->round()->amount())) {
            $items[] = $this->prepareShippingItem($order);
        }

        return $items;
    }

    public function prepareShippingItem($order): array
    {
        $item = [];
        $item["Name"] = $order->shipping_method;
        $item["Description"] = "Szállítás";
        $item["Quantity"] = 1;
        $item["Unit"] = "db";
        $item["UnitPrice"] = (float)$order->shipping_cost->round()->amount();
        $item["ItemTotal"] = $order->shipping_cost->round()->amount();

        return $item;
    }

    public function prepareProductItems($orderProducts): array
    {
        $productItems = [];

        $orderProducts->each(function ($product) use (&$productItems) {
            $productItem = $this->prepareProductItem($product);
            if (!empty($productItem->unit_price)) {
                $productItems[] = $productItem;
            }
        });

        return $productItems;
    }


    public function prepareProductItem($orderProduct)
    {
        $item = [];
        $item["Name"] = $orderProduct->product->name;
        $item["Description"] = $orderProduct->qty . "x " . $orderProduct->product->name;
        $item["Quantity"] = $orderProduct->qty;
        $item["Unit"] = "db";
        $item["UnitPrice"] = (float)$orderProduct->unit_price->convertToCurrentCurrency()->amount();
        $item["ItemTotal"] = $orderProduct->qty * (float)$orderProduct->unit_price->convertToCurrentCurrency()->amount();

        return $item;
    }

    public function prepareDiscountItem($order)
    {
        $item = [];
        $item["Name"] = trans('payment::order.discount');
        $item["Description"] = trans('payment::order.discount');
        $item["Quantity"] = 1;
        $item["Unit"] = "db";
        $item["UnitPrice"] = (float)(-1 * $order->discount->convertToCurrentCurrency()->amount());
        $item["ItemTotal"] = (float)(-1 * $order->discount->convertToCurrentCurrency()->amount());

        return $item;
    }

    private function getRedirectUrl($order, $reference)
    {
        return route('checkout.complete.store', ['orderId' => $order->id, 'paymentMethod' => 'barion']);
    }

    public function complete(Order $order)
    {
        return new BarionResponse($order, request()->all());
    }

}