HEX
Server: Apache/2.4.41 (Ubuntu)
System: Linux ip-172-31-42-149 5.15.0-1084-aws #91~20.04.1-Ubuntu SMP Fri May 2 07:00:04 UTC 2025 aarch64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/vhost/disk-apps/teamdemo.sports-crowd.com/app/Core/Payment/Methods/Onvo/OnvoStrategy.php
<?php

declare(strict_types=1);

namespace App\Core\Payment\Methods\Onvo;

use App\Core\Payment\Entities\Payment;
use App\Core\Payment\Entities\PaymentIntentResponse;
use App\Core\Payment\Entities\PaymentRetrieveResponse;
use App\Core\Payment\PaymentMethodInterface;
use App\Core\Payment\PaymentStatusEnum;
use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
use Illuminate\Http\Request;

class OnvoStrategy implements PaymentMethodInterface
{
    const PAYMENT_STATUS = [
        "succeeded" => PaymentStatusEnum::CONFIRMED,
        "payment_failed" => PaymentStatusEnum::DECLINED,
        "requires_payment_method" => PaymentStatusEnum::DECLINED,
        "processing" => PaymentStatusEnum::PENDING
    ];

    private $parameters;

    public function __construct(
        $parameters
    ) {
        $this->parameters = $parameters;
    }

    public function pay(Payment $payment): PaymentIntentResponse
    {
        $paymentIntent = $this->createPaymentIntent($payment);

        $paymentIntentResponse = new PaymentIntentResponse(
            PaymentIntentResponse::ACTION_SHOW,
            $paymentIntent->id
        );

        $returnUrl = $this->buildReturnUrl($paymentIntent);

        $data = [
            'paymentIntentId' => $paymentIntent->id,
            "pubKey" => $this->parameters->client_public,
            "returnUrl" => $returnUrl
        ];

        $paymentIntentResponse->setView("onvo.webcheckout");
        $paymentIntentResponse->setData($data);

        return $paymentIntentResponse;
    }

    public function retrieve(Payment $payment): PaymentRetrieveResponse
    {
        try {
            $client = new Client();
            $response = $client->get(
                $this->parameters->gw_url_prd . '/payment-intents/' . $payment->paymentGatewayTxId(),
                [
                    'headers' => [
                        'Authorization' => 'Bearer ' . $this->parameters->client_secret
                    ]
                ]
            );

            $body = $response->getBody()->getContents();
            $data = json_decode($body);

            $retrieveResponse = new PaymentRetrieveResponse(
                $data->id,
                self::PAYMENT_STATUS[$data->status],
                $data->status
            );

            $retrieveResponse->setRawData($data);
            return $retrieveResponse;
        } catch (\Throwable $th) {
            return new PaymentRetrieveResponse(
                $payment->paymentGatewayTxId(),
                PaymentStatusEnum::PENDING,
                $th->getMessage()
            );
        }
    }

    private function createPaymentIntent(Payment $payment)
    {
        $client = new Client();
        $data = [
            'amount' => (int) ($payment->amount()->total() * 100),
            'currency' => $this->parameters->currency,
            'metadata' => [
                'reference' => $payment->reference()
            ]
        ];

        if (!is_null($payment->student())) {
            $data['metadata']['student_document'] = $payment->student()->document();
            $data['metadata']['location'] = $payment->student()->locationName();
        }

        if (!is_null($this->parameters->marketplaceId)) {
            $data['onBehalfOf'] = $this->parameters->marketplaceId;
        }

        $response = $client->post(
            $this->parameters->gw_url_prd . '/payment-intents',
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->parameters->client_secret
                ],
                RequestOptions::JSON => $data
            ]
        );

        $body = $response->getBody()->getContents();
        return json_decode($body);
    }

    private function buildReturnUrl($paymentIntent)
    {
        $url = config('app.url') . '/store/payment';

        $queryString = [
            'paymentGatewayId' => $this->parameters->id,
            'reference' => $paymentIntent->metadata->reference
        ];

        $queryString = array_merge($queryString, $this->parameters->extraConfirmUrlData);

        return Request::create($url)->fullUrlWithQuery($queryString);
    }
}