diff --git a/src/Drivers/Asanpardakht/Asanpardakht.php b/src/Drivers/Asanpardakht/Asanpardakht.php index ab71e050..940b97bc 100644 --- a/src/Drivers/Asanpardakht/Asanpardakht.php +++ b/src/Drivers/Asanpardakht/Asanpardakht.php @@ -70,8 +70,6 @@ public function __construct(Invoice $invoice, $settings) */ public function purchase() { - $this->invoice->uuid(crc32($this->invoice->getUuid())); - $result = $this->token(); if (!isset($result['status_code']) or $result['status_code'] != 200) { @@ -190,16 +188,17 @@ protected function createReceipt($referenceId): Receipt */ public function token(): array { + $this->invoice->convertUuidToNumeric(); if (strpos($this->settings->callbackUrl, '?') !== false) { - $query = '&' . http_build_query(['invoice' => $this->invoice->getUuid()]); + $query = '&' . http_build_query(['invoice' => $this->invoice->getNumericUuid()]); } else { - $query = '?' . http_build_query(['invoice' => $this->invoice->getUuid()]); + $query = '?' . http_build_query(['invoice' => $this->invoice->getNumericUuid()]); } return $this->callApi('POST', self::TokenURL, [ 'serviceTypeId' => 1, 'merchantConfigurationId' => $this->settings->merchantConfigID, - 'localInvoiceId' => $this->invoice->getUuid(), + 'localInvoiceId' => $this->invoice->getNumericUuid(), 'amountInRials' => $this->invoice->getAmount() * ($this->settings->currency == 'T' ? 10 : 1), // convert to rial 'localDate' => $this->getTime()['content'], 'callbackURL' => $this->settings->callbackUrl . $query, diff --git a/src/Drivers/Behpardakht/Behpardakht.php b/src/Drivers/Behpardakht/Behpardakht.php index 14ebcca7..3773070f 100644 --- a/src/Drivers/Behpardakht/Behpardakht.php +++ b/src/Drivers/Behpardakht/Behpardakht.php @@ -239,7 +239,7 @@ protected function preparePurchaseData() 'amount' => $this->invoice->getAmount() * ($this->settings->currency == 'T' ? 10 : 1), // convert to rial 'localDate' => Carbon::now()->format('Ymd'), 'localTime' => Carbon::now()->format('Gis'), - 'orderId' => crc32($this->invoice->getUuid()), + 'orderId' => $this->invoice->getNumericUuid(), 'additionalData' => $description, 'payerId' => $payerId ); diff --git a/src/Drivers/Etebarino/Etebarino.php b/src/Drivers/Etebarino/Etebarino.php index 04c3f126..565b3f96 100644 --- a/src/Drivers/Etebarino/Etebarino.php +++ b/src/Drivers/Etebarino/Etebarino.php @@ -48,8 +48,6 @@ public function __construct(Invoice $invoice, $settings) */ public function purchase() { - $this->invoice->uuid(crc32($this->invoice->getUuid())); - $result = $this->token(); if (!isset($result['status_code']) or $result['status_code'] != 200) { @@ -149,7 +147,7 @@ public function token(): array 'terminalUser' => $this->settings->username, 'merchantCode' => $this->settings->merchantId, 'terminalPass' => $this->settings->password, - 'merchantRefCode' => $this->invoice->getUuid(), + 'merchantRefCode' => $this->invoice->getNumericUuid(), "description" => $this->invoice->getDetail('description'), "returnUrl" => $this->settings->callbackUrl, 'paymentItems' => $this->getItems(), diff --git a/src/Drivers/Fanavacard/Fanavacard.php b/src/Drivers/Fanavacard/Fanavacard.php index c0a6cd96..c5e49c58 100644 --- a/src/Drivers/Fanavacard/Fanavacard.php +++ b/src/Drivers/Fanavacard/Fanavacard.php @@ -59,7 +59,7 @@ public function __construct(Invoice $invoice, $settings) */ public function purchase() { - $this->invoice->uuid(crc32($this->invoice->getUuid())); + $this->invoice->uuid($this->invoice->getNumericUuid()); $token = $this->getToken(); $this->invoice->transactionId($token['Token']); @@ -158,7 +158,7 @@ public function getToken(): array 'json'=>[ 'WSContext'=> $this->getWsContext(), 'TransType'=>'EN_GOODS', - 'ReserveNum'=>$this->invoice->getDetail('invoice_number') ?? crc32($this->invoice->getUuid()), + 'ReserveNum'=>$this->invoice->getDetail('invoice_number') ?? $this->invoice->getNumericUuid(), 'Amount'=> $this->invoice->getAmount() * ($this->settings->currency == 'T' ? 10 : 1), // convert to rial 'RedirectUrl'=>$this->settings->callbackUrl, ]]); diff --git a/src/Drivers/Nextpay/Nextpay.php b/src/Drivers/Nextpay/Nextpay.php index ea83e9bb..d830b580 100644 --- a/src/Drivers/Nextpay/Nextpay.php +++ b/src/Drivers/Nextpay/Nextpay.php @@ -59,9 +59,10 @@ public function __construct(Invoice $invoice, $settings) */ public function purchase() { + $this->invoice->uuid(intval(1, time()) . $this->invoice->getNumericUuid()); $data = [ 'api_key' => $this->settings->merchantId, - 'order_id' => intval(1, time()) . crc32($this->invoice->getUuid()), + 'order_id' => $this->invoice->getUuid(), 'amount' => $this->invoice->getAmount() / ($this->settings->currency == 'T' ? 1 : 10), // convert to toman 'callback_uri' => $this->settings->callbackUrl, ]; diff --git a/src/Drivers/Parsian/Parsian.php b/src/Drivers/Parsian/Parsian.php index d0de6247..cd162397 100644 --- a/src/Drivers/Parsian/Parsian.php +++ b/src/Drivers/Parsian/Parsian.php @@ -178,7 +178,7 @@ protected function preparePurchaseData() return [ 'LoginAccount' => $this->settings->merchantId, 'Amount' => $this->invoice->getAmount() * ($this->settings->currency == 'T' ? 10 : 1), // convert to rial - 'OrderId' => crc32($this->invoice->getUuid()), + 'OrderId' => $this->invoice->getNumericUuid(), 'CallBackUrl' => $this->settings->callbackUrl, 'Originator' => $phone, 'AdditionalData' => $description, diff --git a/src/Drivers/Pasargad/Pasargad.php b/src/Drivers/Pasargad/Pasargad.php index 28567a69..3f863639 100644 --- a/src/Drivers/Pasargad/Pasargad.php +++ b/src/Drivers/Pasargad/Pasargad.php @@ -194,12 +194,13 @@ protected function getPreparedInvoiceData() */ protected function prepareInvoiceData(): array { + $this->invoice->uuid($this->invoice->getNumericUuid() . rand(0, time())); $action = 1003; // 1003 : for buy request (bank standard) $merchantCode = $this->settings->merchantId; $terminalCode = $this->settings->terminalCode; $amount = $this->invoice->getAmount() * ($this->settings->currency == 'T' ? 10 : 1); // convert to rial $redirectAddress = $this->settings->callbackUrl; - $invoiceNumber = crc32($this->invoice->getUuid()) . rand(0, time()); + $invoiceNumber = $this->invoice->getNumericUuid(); $iranTime = new DateTime('now', new DateTimeZone('Asia/Tehran')); $timeStamp = $iranTime->format("Y/m/d H:i:s"); diff --git a/src/Drivers/Sadad/Sadad.php b/src/Drivers/Sadad/Sadad.php index 5bf6e312..9efafba2 100644 --- a/src/Drivers/Sadad/Sadad.php +++ b/src/Drivers/Sadad/Sadad.php @@ -62,7 +62,7 @@ public function __construct(Invoice $invoice, $settings) public function purchase() { $terminalId = $this->settings->terminalId; - $orderId = crc32($this->invoice->getUuid()); + $orderId = $this->invoice->getNumericUuid(); $amount = $this->invoice->getAmount() * ($this->settings->currency == 'T' ? 10 : 1); // convert to rial $key = $this->settings->key; diff --git a/src/Drivers/Yekpay/Yekpay.php b/src/Drivers/Yekpay/Yekpay.php index 387d11a1..8d7a404c 100644 --- a/src/Drivers/Yekpay/Yekpay.php +++ b/src/Drivers/Yekpay/Yekpay.php @@ -71,11 +71,12 @@ public function purchase() } else { $description = $this->settings->description; } + $this->invoice->uuid(intval(1, time()) . $this->invoice->getNumericUuid()); $data->merchantId = $this->settings->merchantId; $data->amount = $this->invoice->getAmount(); $data->callback = $this->settings->callbackUrl; - $data->orderNumber = intval(1, time()).crc32($this->invoice->getUuid()); + $data->orderNumber = $this->invoice->getUuid(); $data->fromCurrencyCode = (int) $this->settings->fromCurrencyCode; $data->toCurrencyCode = (int) $this->settings->toCurrencyCode; diff --git a/src/Drivers/Zibal/Zibal.php b/src/Drivers/Zibal/Zibal.php index 080d7999..28a9a97e 100644 --- a/src/Drivers/Zibal/Zibal.php +++ b/src/Drivers/Zibal/Zibal.php @@ -58,11 +58,12 @@ public function __construct(Invoice $invoice, $settings) */ public function purchase() { + $this->invoice->uuid($this->invoice->getNumericUuid() . time()); $details = $this->invoice->getDetails(); $amount = $this->invoice->getAmount() * ($this->settings->currency == 'T' ? 10 : 1); // convert to rial - $orderId = crc32($this->invoice->getUuid()).time(); + $orderId = $this->invoice->getNumericUuid(); if (!empty($details['orderId'])) { $orderId = $details['orderId']; } elseif (!empty($details['order_id'])) { diff --git a/src/Invoice.php b/src/Invoice.php index ae96f52e..a6dee76c 100644 --- a/src/Invoice.php +++ b/src/Invoice.php @@ -35,6 +35,8 @@ class Invoice */ protected $driver; + protected $uuidIsProvidedByUser = false; + /** * Invoice constructor. * @@ -46,19 +48,21 @@ public function __construct() } /** - * Set invoice uuid + * Set invoice uuid. this method wouldn't allow to modify uuid if it's provided by user. * * @param $uuid|null - * - * @throws \Exception + * @return self */ public function uuid($uuid = null) { - if (empty($uuid)) { - $uuid = Uuid::uuid4()->toString(); + if (empty($this->uuid)) { + $this->uuidIsProvidedByUser = true; + $this->uuid = $uuid; + } elseif (!$this->uuidIsProvidedByUser) { + $this->uuid = $uuid; } - $this->uuid = $uuid; + return $this; } /** @@ -68,9 +72,38 @@ public function uuid($uuid = null) */ public function getUuid() { + if (empty($this->uuid)) { + $this->uuid = Uuid::uuid4()->toString(); + } + return $this->uuid; + } + + /** + * Convert invoice uuid to numeric when needed and get it. + * + * @return string + */ + public function getNumericUuid() + { + if (is_numeric($this->uuid)) { + return $this->uuid; + } + + $this->convertUuidToNumeric(); + return $this->uuid; } + + /** + * Convert uuid value to numeric if its not provided by user. + * @return self + */ + public function convertUuidToNumeric() + { + return $this->uuid(crc32($this->getUuid())); + } + /** * Set the amount of invoice *