File: //home/armgroup/libs/vendor/shetabit/multipay/src/Drivers/Local/Local.php
<?php
namespace Shetabit\Multipay\Drivers\Local;
use Shetabit\Multipay\Abstracts\Driver;
use Shetabit\Multipay\Exceptions\InvalidPaymentException;
use Shetabit\Multipay\Exceptions\PurchaseFailedException;
use Shetabit\Multipay\Contracts\ReceiptInterface;
use Shetabit\Multipay\Invoice;
use Shetabit\Multipay\Receipt;
use Shetabit\Multipay\RedirectionForm;
use Shetabit\Multipay\Request;
class Local extends Driver
{
/**
* Invoice
*
* @var Invoice
*/
protected $invoice;
/**
* Driver settings
*
* @var object
*/
protected $settings;
/**
* Local constructor.
* Construct the class with the relevant settings.
*
* @param Invoice $invoice
* @param $settings
*/
public function __construct(Invoice $invoice, $settings)
{
$this->invoice($invoice);
$this->settings = (object) $settings;
}
/**
* Purchase Invoice.
*
* @return string
*
* @throws PurchaseFailedException
*/
public function purchase(): string
{
// throw PurchaseFailedException if set in invoice message
if ($message = $this->invoice->getDetail('failedPurchase')) {
throw new PurchaseFailedException($message);
}
// set a randomly grenerated transactionId
$transactionId = mt_rand(1000000, 9999999);
$this->invoice->transactionId($transactionId);
return $this->invoice->getTransactionId();
}
/**
* Pay the Invoice
*
* @return RedirectionForm
*/
public function pay(): RedirectionForm
{
RedirectionForm::setViewPath(dirname(__DIR__).'/../../resources/views/local-form.php');
return new RedirectionForm('', $this->getFormData(), 'POST');
}
/**
* Verify payment
*
* @return ReceiptInterface
*
* @throws InvalidPaymentException
*/
public function verify(): ReceiptInterface
{
$data = array(
'transactionId' => Request::input('transactionId'),
'cancel' => Request::input('cancel')
);
$success = $data['transactionId'] && !$data['cancel'];
if (!$success) {
$this->notVerified(0);
}
$receipt = $this->createReceipt($data['transactionId']);
$receipt->detail([
'orderId' => $this->invoice->getDetail('orderId') ?? mt_rand(1111, 9999),
'traceNo' => $this->invoice->getDetail('traceNo') ?? mt_rand(11111, 99999),
'referenceNo' => $data['transactionId'],
'cardNo' => $this->invoice->getDetail('cartNo') ?? mt_rand(1111, 9999),
]);
return $receipt;
}
/**
* Generate the payment's receipt
*
* @param $referenceId
*
* @return Receipt
*/
protected function createReceipt($referenceId): Receipt
{
return new Receipt('local', $referenceId);
}
/**
* Populate payment form data
*
*
* @return array
*/
protected function getFormData(): array
{
return [
'orderId' => $this->invoice->getDetail('orderId'),
'price' => number_format($this->invoice->getAmount()),
'successUrl' => $this->addUrlQuery($this->settings->callbackUrl, [
'transactionId' => $this->invoice->getTransactionId(),
]),
'cancelUrl' => $this->addUrlQuery($this->settings->callbackUrl, [
'transactionId' => $this->invoice->getTransactionId(),
'cancel' => 'true',
]),
'title' => $this->settings->title,
'description' => $this->settings->description,
'orderLabel' => $this->settings->orderLabel,
'amountLabel' => $this->settings->amountLabel,
'payButton' => $this->settings->payButton,
'cancelButton' => $this->settings->cancelButton,
];
}
/**
* Add array parameters as url query
*
* @param $url
* @param $params
*
* @return string
*/
protected function addUrlQuery($url, $params): string
{
$urlWithQuery = $url;
foreach ($params as $key => $value) {
$urlWithQuery .= (parse_url($urlWithQuery, PHP_URL_QUERY) ? '&' : '?') . "{$key}={$value}";
}
return $urlWithQuery;
}
/**
* Trigger an exception
*
* @param $status
*
* @throws InvalidPaymentException
*/
private function notVerified($status)
{
$translations = array(
0 => 'تراکنش توسط خریدار لغو شده است.',
);
if (array_key_exists($status, $translations)) {
throw new InvalidPaymentException($translations[$status], (int)$status);
} else {
throw new InvalidPaymentException('تراکنش با خطا مواجه شد.', (int)$status);
}
}
}