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());
}
}