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