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/alq-cali.bikenow.co/app/Core/Payment/Methods/WompiApi/WompiApiStrategy.php
<?php

declare(strict_types=1);

namespace App\Core\Payment\Methods\WompiApi;

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 App\Core\Payment\Methods\WompiApi\WompiApiClient;
use Illuminate\Http\Request;

class WompiApiStrategy implements PaymentMethodInterface
{
    const PAYMENT_STATUS = [
        'APPROVED' => PaymentStatusEnum::CONFIRMED,
        'DECLINED' => PaymentStatusEnum::DECLINED
    ];

    private $parameters;
    private $wompiApiClient;

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

    public function pay(Payment $payment): PaymentIntentResponse
    {
        $merchantData = $this->wompiApiClient->merchant();

        $pseIntitutionsData = $this->wompiApiClient->pseFinancialInstitutions();

        $amountInCents = $payment->amount()->total() * 100;
        $signature = self::generateSignature(
            $payment->reference(),
            $amountInCents,
            $this->parameters->currency,
            $this->parameters->client_signature
        );

        $paymentIntentResponse = new PaymentIntentResponse(
            PaymentIntentResponse::ACTION_SHOW,
            null
        );

        $confirmUrl = $this->buildConfirmUrl($payment);

        $data = [
            'gateway_data' => $this->parameters,
            'amountInCents' => $amountInCents,
            'reference' => $payment->reference(),
            'confirm_url' => $confirmUrl,
            'signature' => $signature,
            'accepted_payment_methods' => $merchantData->data->accepted_payment_methods,
            'presigned_acceptance' => $merchantData->data->presigned_acceptance,
            'pse_institutions' => $pseIntitutionsData->data,
            'customer_fullname' => $payment->customer()->fullName(),
            'customer_email' => $payment->customer()->email(),
            'customer_mobile' => $payment->customer()->mobile()
        ];

        $paymentIntentResponse->setView('wompiapi.webcheckout');
        $paymentIntentResponse->setData($data);

        return $paymentIntentResponse;
    }

    public function retrieve(Payment $payment): PaymentRetrieveResponse
    {
        try {
            $retrievePayment = $this->wompiApiClient->retrieve($payment);
            $data = reset($retrievePayment->data);

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

    public static function generateSignature(
        $reference,
        $price,
        $currency,
        $clientSignature
    ) {
        $signatureData = ($reference . '' . $price . '' . $currency . '' . $clientSignature);
        return hash('sha256', $signatureData);
    }

    private function buildConfirmUrl($payment)
    {
        $url = config('app.url') . '/store/wompi/confirm';
        $queryString = [
            'paymentGatewayId' => $this->parameters->id,
            'reference' => $payment->reference()
        ];

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

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