diff --git a/config/larapay.php b/config/larapay.php index 397c2e7..cee1c78 100644 --- a/config/larapay.php +++ b/config/larapay.php @@ -27,7 +27,7 @@ | the gateways list is comma separated | */ - 'gateways' => env('LARAPAY_GATES', 'Mellat,Saman,Pasargad,Parsian,ZarinPal,Payir,Saderat'), + 'gateways' => env('LARAPAY_GATES', 'Mellat,Saman,Pasargad,Parsian,ZarinPal,Idpay,Payir,Saderat'), /* |-------------------------------------------------------------------------- @@ -121,6 +121,24 @@ 'payir' => [ 'api' => env('PAY_IR_API_KEY', ''), ], + + /* + |-------------------------------------------------------------------------- + | Idpay gateway configuration + |-------------------------------------------------------------------------- + | + | types: acceptable values --- normal + | + */ + 'idpay' => [ + 'merchant_id' => env('IDPAY_MERCHANT_ID', ''), + 'type' => env('IDPAY_TYPE', 'normal'), + 'callback_url' => env('IDPAY_CALLBACK_URL', ''), + 'email' => env('IDPAY_EMAIL', ''), + 'mobile' => env('IDPAY_MOBILE', '09xxxxxxxxx'), + 'description' => env('IDPAY_DESCRIPTION', 'powered-by-Larapay'), + ], + /* |-------------------------------------------------------------------------- | SoapClient Options diff --git a/src/Adapter/Idpay.php b/src/Adapter/Idpay.php new file mode 100644 index 0000000..efe0def --- /dev/null +++ b/src/Adapter/Idpay.php @@ -0,0 +1,201 @@ +getTransaction()->checkForRequestToken() == false) { + throw new Exception('larapay::larapay.could_not_request_payment'); + } + + $this->checkRequiredParameters([ + 'order_id', + 'amount', + 'redirect_url', + ]); + + $sendParams = [ + 'order_id' => $this->getTransaction()->bank_order_id, + 'amount' => intval($this->amount), + 'desc' => $this->description ? $this->description : '', + 'mail' => $this->email ? $this->email : '', + 'phone' => $this->mobile ? $this->mobile : '', + 'callback' => $this->redirect_url, + ]; + + $header = [ + 'Content-Type: application/json', + 'X-API-KEY:' .$this->merchant_id, + 'X-SANDBOX:' .$this->getSandbox() + ]; + try { + XLog::debug('PaymentRequest call', $sendParams); + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $this->WSDL); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($sendParams)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); + curl_setopt($ch, CURLOPT_HTTPHEADER, $header); + $response = curl_exec($ch); + $ch_error = curl_error($ch); + curl_close($ch); + $result = json_decode($response); + + if (isset($result->error_code)) { + throw new Exception($result->error_code); + } + + XLog::info('PaymentRequest response', $this->obj2array($result)); + $this->getTransaction()->setGatewayToken(strval($result->id)); // update transaction reference id + return $result->id; + } catch(\Exception $e) { + throw new Exception($e->getMessage()); + }; + } + + + /** + * @return string + * @throws Exception + * @throws \Tartan\Larapay\Adapter\Exception + */ + protected function generateForm(): string + { + $authority = $this->requestToken(); + + $form = view('larapay::idpay-form', [ + 'endPoint' => strtr($this->getEndPoint(), ['{order-id}' => $authority]), + 'submitLabel' => !empty($this->submit_label) ? $this->submit_label : trans("larapay::larapay.goto_gate"), + 'autoSubmit' => boolval($this->auto_submit), + ]); + + return $form->__toString(); + } + + /** + * @return array + * @throws Exception + * @throws \Tartan\Larapay\Adapter\Exception + */ + public function formParams(): array + { + $authority = $this->requestToken(); + + return [ + 'endPoint' => strtr($this->getEndPoint(), ['{authority}' => $authority]), + ]; + } + + public function getSandbox(): string + { + if (config('larapay.mode') == 'production') { + return "0"; + } else { + return "1"; + } + } + + /** + * @return bool + * @throws Exception + * @throws \Tartan\Larapay\Adapter\Exception + */ + protected function verifyTransaction(): bool + { + + if ($this->getTransaction()->checkForVerify() == false) { + throw new Exception('larapay::larapay.could_not_verify_payment'); + } + + $this->checkRequiredParameters([ + 'merchant_id', + ]); + + $sendParams = [ + 'id' => $this->getTransaction()->gate_refid, + 'order_id' => $this->getTransaction()->bank_order_id, + ]; + + $header = [ + 'Content-Type: application/json', + 'X-API-KEY:' .$this->merchant_id, + 'X-SANDBOX:' .$this->getSandbox() + ]; + + try { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $this->endPointVerify); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($sendParams)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); + curl_setopt($ch, CURLOPT_HTTPHEADER, $header); + $response = curl_exec($ch); + $ch_error = curl_error($ch); + curl_close($ch); + XLog::debug('PaymentVerification call', $sendParams); + $result = json_decode($response); + XLog::info('PaymentVerification response', $this->obj2array($result)); + + if (isset($result->status)) { + + if ($result->status == 100 || $result->status == 101) { + $this->getTransaction()->setVerified(); + $this->getTransaction()->setReferenceId((string)$result->id); + return true; + } else { + throw new Exception($result->status); + } + } else { + throw new Exception($result->error_code); + } + + } catch(\Exception $e) { + throw new Exception($e->getMessage()); + } + } + + /** + * @return bool + */ + public function canContinueWithCallbackParameters(): bool + { + if (!empty($this->transaction['gate_refid'])) { + return true; + } + + return false; + } + + public function getGatewayReferenceId(): string + { + $this->checkRequiredParameters([ + 'merchant_id', + ]); + + return strval($this->transaction['gate_refid']); + } +} diff --git a/src/Adapter/Idpay/Exception.php b/src/Adapter/Idpay/Exception.php new file mode 100644 index 0000000..a1dded6 --- /dev/null +++ b/src/Adapter/Idpay/Exception.php @@ -0,0 +1,7 @@ + 'مدت زمان معتبر طول عمر شناسه پرداخت باید بین ۳۰ دقیقه تا ۴۵ روز باشد', 'error__54 '=> 'درخواست مورد نظر آرشیو شده است', ] - ] + ], + 'idpay' => [ + 'errors' => [ + "error_1" => "پرداخت انجام نشده است.", + "error_2" => "پرداخت ناموفق بوده است.", + "error_3" => "خطا رخ داده است.", + "error_4" => "بلوکه شده.", + "error_5" => "برگشت به پرداخت کننده.", + "error_6" => "برگشت خورده سیستمی.", + "error_10" => "در انتظار تایید پرداخت.", + "error_100" => "پرداخت تایید شده است.", + "error_101" => "پرداخت قبلا تایید شده است.", + "error_200" => "به دریافت کننده واریز شد.", + "error_11" => "کاربر مسدود شده است.", + "error_12" => "API Key یافت نشد.", + "error_13" => "درخواست شما از {ip} ارسال شده است. این IP با IP های ثبت شده در وب سرویس همخوانی ندارد.", + "error_14" => "وب سرویس تایید نشده است.", + "error_21" => "حساب بانکی متصل به وب سرویس تایید نشده است.", + "error_31" => "کد تراکنش id نباید خالی باشد.", + "error_32" => "شماره سفارش order_id نباید خالی باشد.", + "error_33" => "مبلغ amount نباید خالی باشد.", + "error_34" => "مبلغ amount باید بیشتر از {min-amount} ریال باشد.", + "error_35" => "مبلغ amount باید کمتر از {max-amount} ریال باشد.", + "error_36" => "مبلغ amount بیشتر از حد مجاز است.", + "error_37" => "آدرس بازگشت callback نباید خالی باشد.", + "error_38" => "درخواست شما از آدرس {domain} ارسال شده است. دامنه آدرس بازگشت callback با آدرس ثبت شده در وب سرویس همخوانی ندارد.", + "error_51" => "تراکنش ایجاد نشد.", + "error_52" => "استعلام نتیجه ای نداشت.", + "error_53" => "تایید پرداخت امکان پذیر نیست.", + "error_54" => "مدت زمان تایید پرداخت سپری شده است.", + ] + ] + ]; diff --git a/translations/fa/larapay.php b/translations/fa/larapay.php index 4cf3678..a6b3c74 100644 --- a/translations/fa/larapay.php +++ b/translations/fa/larapay.php @@ -133,5 +133,37 @@ 'error__42 '=> 'مدت زمان معتبر طول عمر شناسه پرداخت باید بین ۳۰ دقیقه تا ۴۵ روز باشد', 'error__54 '=> 'درخواست مورد نظر آرشیو شده است', ] - ] + ], + 'idpay' => [ + 'errors' => [ + "error_1" => "پرداخت انجام نشده است.", + "error_2" => "پرداخت ناموفق بوده است.", + "error_3" => "خطا رخ داده است.", + "error_4" => "بلوکه شده.", + "error_5" => "برگشت به پرداخت کننده.", + "error_6" => "برگشت خورده سیستمی.", + "error_10" => "در انتظار تایید پرداخت.", + "error_100" => "پرداخت تایید شده است.", + "error_101" => "پرداخت قبلا تایید شده است.", + "error_200" => "به دریافت کننده واریز شد.", + "error_11" => "کاربر مسدود شده است.", + "error_12" => "API Key یافت نشد.", + "error_13" => "درخواست شما از {ip} ارسال شده است. این IP با IP های ثبت شده در وب سرویس همخوانی ندارد.", + "error_14" => "وب سرویس تایید نشده است.", + "error_21" => "حساب بانکی متصل به وب سرویس تایید نشده است.", + "error_31" => "کد تراکنش id نباید خالی باشد.", + "error_32" => "شماره سفارش order_id نباید خالی باشد.", + "error_33" => "مبلغ amount نباید خالی باشد.", + "error_34" => "مبلغ amount باید بیشتر از {min-amount} ریال باشد.", + "error_35" => "مبلغ amount باید کمتر از {max-amount} ریال باشد.", + "error_36" => "مبلغ amount بیشتر از حد مجاز است.", + "error_37" => "آدرس بازگشت callback نباید خالی باشد.", + "error_38" => "درخواست شما از آدرس {domain} ارسال شده است. دامنه آدرس بازگشت callback با آدرس ثبت شده در وب سرویس همخوانی ندارد.", + "error_51" => "تراکنش ایجاد نشد.", + "error_52" => "استعلام نتیجه ای نداشت.", + "error_53" => "تایید پرداخت امکان پذیر نیست.", + "error_54" => "مدت زمان تایید پرداخت سپری شده است.", + ] + ] + ]; diff --git a/views/idpay-form.blade.php b/views/idpay-form.blade.php new file mode 100644 index 0000000..9affe16 --- /dev/null +++ b/views/idpay-form.blade.php @@ -0,0 +1,14 @@ +
+
+
+ +
+
+
+ +@if($autoSubmit === true) + +@endif