diff --git a/README.md b/README.md index 35e06d9..26beb53 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ Here are a few short examples of what you can do: - Zarinpal Gateway / درگاه پرداخت زرین پال - IDPay Gateway / درگاه آیدی پی - Zibal Gateway / درگاه زیبال +- nextpay Gateway / درگاه نکست پی - ... - Other gateways, coming soon... لطفا شما هم در تکمیل پکیج مشارکت کنید diff --git a/config/larapay.php b/config/larapay.php index fb86737..6629d50 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,Idpay,Payir,Saderat,Zibal'), + 'gateways' => env('LARAPAY_GATES', 'Mellat,Saman,Pasargad,Parsian,ZarinPal,Idpay,Payir,Saderat,Zibal,Nextpay'), /* |-------------------------------------------------------------------------- @@ -159,6 +159,21 @@ 'description' => env('ZIBAL_DESCRIPTION', 'powered-by-Larapay'), ], + /* + |-------------------------------------------------------------------------- + | Nextpay gateway configuration + |-------------------------------------------------------------------------- + | + */ + 'nextpay' => [ + 'api_key' => env('NEXTPAY_MERCHANT_ID', ''), + 'type' => env('NEXTPAY_TYPE', 'normal'), + 'callback_url' => env('NEXTPAY_CALLBACK_URL', ''), + 'email' => env('NEXTPAY_EMAIL', ''), + 'mobile' => env('NEXTPAY_MOBILE', '09xxxxxxxxx'), + 'description' => env('NEXTPAY_DESCRIPTION', 'powered-by-Larapay'), + ], + /* |-------------------------------------------------------------------------- | SoapClient Options diff --git a/src/Adapter/Nextpay.php b/src/Adapter/Nextpay.php new file mode 100644 index 0000000..2ee1d86 --- /dev/null +++ b/src/Adapter/Nextpay.php @@ -0,0 +1,174 @@ +getTransaction()->checkForRequestToken() == false) { + throw new Exception('larapay::larapay.could_not_request_payment'); + } + + $this->checkRequiredParameters([ + 'api_key', + 'amount', + 'redirect_url', + 'order_id', + ]); + + $sendParams = [ + 'api_key' => $this->api_key, + 'amount' => intval($this->amount), + 'order_id' => ($this->order_id), + 'payer_desc' => $this->description ? $this->description : '', + 'customer_phone' => $this->mobile ? $this->mobile : '', + 'callback_uri' => $this->redirect_url, + ]; + + try { + XLog::debug('PaymentRequest call', $sendParams); + $result = Helper::post2https($sendParams, $this->endPoint); + $resultObj = json_decode($result); + + XLog::info('PaymentRequest response', $this->obj2array($resultObj)); + + if (isset($resultObj->code)) { + + if ($resultObj->code == -1) { + $this->getTransaction()->setGatewayToken(strval($resultObj->trans_id)); // update transaction reference id + return $resultObj->trans_id; + } else { + throw new Exception('larapay::larapay.nextpay.errors.error_'.$resultObj->code); + } + } else { + throw new Exception('larapay::larapay.invalid_response'); + } + } catch (\Exception $e) { + throw new Exception('Nextpay Fault: ' . $e->getMessage() . ' #' . $e->getCode(), $e->getCode()); + } + } + + + /** + * @return string + * @throws Exception + * @throws \Tartan\Larapay\Adapter\Exception + */ + protected function generateForm(): string + { + $authority = $this->requestToken(); + + $form = view('larapay::nextpay-form', [ + 'endPoint' => strtr($this->endPointForm, ['{trans_id}' => $authority]), + 'submitLabel' => !empty($this->submit_label) ? $this->submit_label : trans("larapay::larapay.goto_gate"), + 'autoSubmit' => true, + ]); + return $form->__toString(); + } + + /** + * @return array + * @throws Exception + * @throws \Tartan\Larapay\Adapter\Exception + */ + public function formParams(): array + { + $authority = $this->requestToken(); + + return [ + 'endPoint' => strtr($this->endPointForm, ['{trans_id}' => $authority]), + ]; + } + + /** + * @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([ + 'api_key', + 'trans_id', + 'amount' + ]); + + $sendParams = [ + 'api_key' => $this->api_key, + 'trans_id' => $this->trans_id, + 'amount' => $this->amount, + ]; + + try { + XLog::debug('PaymentVerification call', $sendParams); + $result = Helper::post2https($sendParams, $this->endPointVerify); + $response = json_decode($result); + XLog::info('PaymentVerification response', $this->obj2array($response)); + if (isset($response->code , $response->Shaparak_Ref_Id)) { + if ($response->code == 0) { + $this->getTransaction()->setVerified(); + $this->getTransaction()->setReferenceId(strval($response->Shaparak_Ref_Id)); // update transaction reference id + return true; + } else { + throw new Exception('larapay::larapay.nextpay.errors.error_'.$response->code); + } + } else { + throw new Exception('larapay::larapay.invalid_response'); + } + } catch (\Exception $e) { + throw new Exception('Nextpay Fault: ' . $e->getMessage() . ' #' . $e->getCode(), $e->getCode()); + } + } + + /** + * @return bool + */ + public function canContinueWithCallbackParameters(): bool + { + if (!empty($this->parameters['trans_id'])) { + return true; + } + + return false; + } + + /** + * @return string + * @throws \Tartan\Larapay\Adapter\Exception + */ + public function getGatewayReferenceId(): string + { + $this->checkRequiredParameters([ + 'trans_id', + ]); + + return strval($this->trans_id); + } +} diff --git a/src/Adapter/Nextpay/Exception.php b/src/Adapter/Nextpay/Exception.php new file mode 100644 index 0000000..256dea0 --- /dev/null +++ b/src/Adapter/Nextpay/Exception.php @@ -0,0 +1,7 @@ + 'در انتظار تایید درگاه توسط شاپرک', 'error_-28' => 'امکان تسهیم تراکنش برای این درگاه وجود ندارد', ] + ], + 'nextpay' => [ + 'errors' => [ + 'error_0' => "تراکنش تکمیل و موفق است", + 'error_-1' => "حالت پیش فرض تراکنش", + 'error_-2' => "خطای بانکی یا انصراف از پرداخت", + 'error_-3' => "در انتظار پرداخت بانکی", + 'error_-4' => "انصراف در درگاه بانک", + 'error_-20' => "کلید مجوزدهی ارسال نشده است", + 'error_-21' => "شماره تراکنش ارسال نشده است", + 'error_-22' => "مبلغ ارسال نشده است", + 'error_-23' => "مسیر بازگشت ارسال نشده است", + 'error_-24' => "مبلغ اشتباه است", + 'error_-25' => "شماره تراکنش تکراریست و قادر به ادامه کار نیستید", + 'error_-26' => "توکن ارسال نشده است", + 'error_-30' => "مقدار مبلغ کمتر از ۱۰۰ تومان است", + 'error_-32' => "مسیر بازگشت خطا دارد", + 'error_-33' => "ساختار کلید مجوز دهی صحیح نیست", + 'error_-34' => "شماره تراکنش صحیح نیست", + 'error_-35' => "نوع کلید مجوز دهی صحیح نیست", + 'error_-36' => "شماره سفارش ارسال نشده است", + 'error_-37' => "تراکنش یافت نشد", + 'error_-38' => "توکن یافت نشد", + 'error_-39' => "کلید مجوز دهی یافت نشد", + 'error_-40' => "کلید مجوز دهی مسدود شده است", + 'error_-41' => "پارامتر های ارسالی از بانک مورد تایید نیست", + 'error_-42' => "سیستم پرداخت دچار مشکل شده است", + 'error_-43' => "درگاهی برای پرداخت یافت نشد", + 'error_-44' => "پاسخ بانک صحیح نیست", + 'error_-45' => "سیستم پرداخت غیر فعال شده است", + 'error_-46' => "درخواست اشتباه", + 'error_-48' => "نرخ کمیسیون تعیین نشده است", + 'error_-49' => "تراکنش تکراریست", + 'error_-50' => "حساب کاربری یافت نشد", + 'error_-51' => "کاربر یافت نشد", + 'error_-60' => "ایمیل صحیح نیست", + 'error_-61' => "کد ملی صحیح نیست", + 'error_-62' => "کد پستی صحیح نیست", + 'error_-63' => "آدرس پستی صحیح نیست", + 'error_-64' => "توضیحات صحیح نیست", + 'error_-65' => "نام و نام خانوادگی صحیح نیست", + 'error_-66' => "شماره تلفن صحیح نیست", + 'error_-67' => "نام کاربری صحیح نیست", + 'error_-68' => "نام محصول صحیح نیست", + 'error_-69' => "مسیر بازگشت برای حالت موفق صحیح نیست", + 'error_-70' => "مسیر بازگشت برای حالت ناموفق صحیح نیست", + 'error_-71' => "شماره موبایل صحیح نیست", + 'error_-72' => "بانک عامل پاسخ گو نیست" + ] ] ]; diff --git a/translations/fa/larapay.php b/translations/fa/larapay.php index a32e64f..afc6bbe 100644 --- a/translations/fa/larapay.php +++ b/translations/fa/larapay.php @@ -220,6 +220,55 @@ 'error_-27' => 'در انتظار تایید درگاه توسط شاپرک', 'error_-28' => 'امکان تسهیم تراکنش برای این درگاه وجود ندارد', ] + ], + 'nextpay' => [ + 'errors' => [ + 'error_0' => "تراکنش تکمیل و موفق است", + 'error_-1' => "حالت پیش فرض تراکنش", + 'error_-2' => "خطای بانکی یا انصراف از پرداخت", + 'error_-3' => "در انتظار پرداخت بانکی", + 'error_-4' => "انصراف در درگاه بانک", + 'error_-20' => "کلید مجوزدهی ارسال نشده است", + 'error_-21' => "شماره تراکنش ارسال نشده است", + 'error_-22' => "مبلغ ارسال نشده است", + 'error_-23' => "مسیر بازگشت ارسال نشده است", + 'error_-24' => "مبلغ اشتباه است", + 'error_-25' => "شماره تراکنش تکراریست و قادر به ادامه کار نیستید", + 'error_-26' => "توکن ارسال نشده است", + 'error_-30' => "مقدار مبلغ کمتر از ۱۰۰ تومان است", + 'error_-32' => "مسیر بازگشت خطا دارد", + 'error_-33' => "ساختار کلید مجوز دهی صحیح نیست", + 'error_-34' => "شماره تراکنش صحیح نیست", + 'error_-35' => "نوع کلید مجوز دهی صحیح نیست", + 'error_-36' => "شماره سفارش ارسال نشده است", + 'error_-37' => "تراکنش یافت نشد", + 'error_-38' => "توکن یافت نشد", + 'error_-39' => "کلید مجوز دهی یافت نشد", + 'error_-40' => "کلید مجوز دهی مسدود شده است", + 'error_-41' => "پارامتر های ارسالی از بانک مورد تایید نیست", + 'error_-42' => "سیستم پرداخت دچار مشکل شده است", + 'error_-43' => "درگاهی برای پرداخت یافت نشد", + 'error_-44' => "پاسخ بانک صحیح نیست", + 'error_-45' => "سیستم پرداخت غیر فعال شده است", + 'error_-46' => "درخواست اشتباه", + 'error_-48' => "نرخ کمیسیون تعیین نشده است", + 'error_-49' => "تراکنش تکراریست", + 'error_-50' => "حساب کاربری یافت نشد", + 'error_-51' => "کاربر یافت نشد", + 'error_-60' => "ایمیل صحیح نیست", + 'error_-61' => "کد ملی صحیح نیست", + 'error_-62' => "کد پستی صحیح نیست", + 'error_-63' => "آدرس پستی صحیح نیست", + 'error_-64' => "توضیحات صحیح نیست", + 'error_-65' => "نام و نام خانوادگی صحیح نیست", + 'error_-66' => "شماره تلفن صحیح نیست", + 'error_-67' => "نام کاربری صحیح نیست", + 'error_-68' => "نام محصول صحیح نیست", + 'error_-69' => "مسیر بازگشت برای حالت موفق صحیح نیست", + 'error_-70' => "مسیر بازگشت برای حالت ناموفق صحیح نیست", + 'error_-71' => "شماره موبایل صحیح نیست", + 'error_-72' => "بانک عامل پاسخ گو نیست" + ] ] ]; diff --git a/views/nextpay-form.blade.php b/views/nextpay-form.blade.php new file mode 100644 index 0000000..0832a27 --- /dev/null +++ b/views/nextpay-form.blade.php @@ -0,0 +1,14 @@ +
+
+
+ +
+
+
+ +@if($autoSubmit === true) + +@endif