diff --git a/README.md b/README.md index b1c78643..7d019108 100644 --- a/README.md +++ b/README.md @@ -1,128 +1,189 @@ +
+سایت مرجع پکیج: [larabook.ir](http://larabook.ir/اتصال-درگاه-بانک-لاراول/) +پکیج اتصال به تمامی IPG ها و بانک های ایرانی. +این پکیج با ورژن های +( ۴ و ۵ و ۶ لاراول ) + لاراول سازگار می باشد -package's home : [larabook.ir](http://larabook.ir/اتصال-درگاه-بانک-لاراول/) -by this package we are able to connect to all Iranian bank with one unique API. - -( This Package is now compatible with both **4.\* and 5.\* versions of Laravel** ) - -Please inform us once you've encountered [bug](https://github.com/larabook/gateway/issues) or [issue](https://github.com/larabook/gateway/issues) . - -Available Banks: +پشتیبانی تنها از درگاهای زیر می باشد: 1. MELLAT 2. SADAD (MELLI) 3. SAMAN 4. PARSIAN 5. PASARGAD 6. ZARINPAL - 7. PAYPAL (**New**) - 8. ASAN PARDAKHT (**New**) - 9. PAY.IR (**New**) (to use : new \Payir()) + 7. PAYPAL + 8. ASAN PARDAKHT + 9. PAY.IR ( برای فراخوانی از 'payir' استفاده نمایید) + 10. Irankish (**جدید** - برای فراخوانی از 'irankish' استفاده نمایید) ---------- -**Installation**: +**نصب**: -Run below statements on your terminal : +دستورات زیر را جهت نصب دنبال کنید : -STEP 1 : +**مرحله ۱)** composer require larabook/gateway -STEP 2 : Add `provider` and `facade` in config/app.php - 'providers' => [ - ... - Larabookir\Gateway\GatewayServiceProvider::class, // <-- add this line at the end of provider array - ], +**مرحله ۲)** + + تغییرات زیر را در فایل config/app.php اعمال نمایید: + +**توجه برای نسخه های لاراول ۶ به بعد این مرحله نیاز به انجام نمی باشد** + +
+ +```php + +'providers' => [ + ... + Larabookir\Gateway\GatewayServiceProvider::class, // <-- add this line at the end of provider array +], + + +'aliases' => [ + ... + 'Gateway' => Larabookir\Gateway\Gateway::class, // <-- add this line at the end of aliases array +] + +``` + + + +
+ +**مرحله ۳) - انتقال فایل های مورد نیاز** +برای لاراول ۵ : +
- 'aliases' => [ - ... - 'Gateway' => Larabookir\Gateway\Gateway::class, // <-- add this line at the end of aliases array - ] + php artisan vendor:publish --provider=Larabookir\Gateway\GatewayServiceProviderLaravel5 -Step 3: - php artisan vendor:publish --provider=Larabookir\Gateway\GatewayServiceProvider +
+برای لاراول ۶ به بعد : +
-Step 4: + php artisan vendor:publish + + +
+سپس این گزینه را انتخاب کنید : "Larabookir\Gateway\GatewayServiceProviderLaravel6" + + + +**مرحله ۴) - ایجاد جداول** php artisan migrate -Configuration file is placed in config/gateway.php , open it and enter your banks credential: - -You can make connection to bank by several way (Facade , Service container): - - try { - - $gateway = \Gateway::make(new \Mellat()); - - // $gateway->setCallback(url('/path/to/callback/route')); You can also change the callback - $gateway - ->price(1000) - // setShipmentPrice(10) // optional - just for paypal - // setProductName("My Product") // optional - just for paypal - ->ready(); - - $refId = $gateway->refId(); // شماره ارجاع بانک - $transID = $gateway->transactionId(); // شماره تراکنش - - // در اینجا - // شماره تراکنش بانک را با توجه به نوع ساختار دیتابیس تان - // در جداول مورد نیاز و بسته به نیاز سیستم تان - // ذخیره کنید . - - return $gateway->redirect(); - - } catch (\Exception $e) { - - echo $e->getMessage(); - } - -you can call the gateway by these ways : - 1. Gateway::make(new Mellat()); - 1. Gateway::mellat() - 2. app('gateway')->make(new Mellat()); - 3. app('gateway')->mellat(); - -Instead of MELLAT you can enter other banks Name as we introduced above . - -In `price` method you should enter the price in IRR (RIAL) - -and in your callback : - - try { - - $gateway = \Gateway::verify(); - $trackingCode = $gateway->trackingCode(); - $refId = $gateway->refId(); - $cardNumber = $gateway->cardNumber(); - - // تراکنش با موفقیت سمت بانک تایید گردید - // در این مرحله عملیات خرید کاربر را تکمیل میکنیم - - } catch (\Larabookir\Gateway\Exceptions\RetryException $e) { - - // تراکنش قبلا سمت بانک تاییده شده است و - // کاربر احتمالا صفحه را مجددا رفرش کرده است - // لذا تنها فاکتور خرید قبل را مجدد به کاربر نمایش میدهیم - - echo $e->getMessage() . "
"; - - } catch (\Exception $e) { - - // نمایش خطای بانک - echo $e->getMessage(); - } - -If you are intrested to developing this package you can help us by these ways : - - 1. Improving documents. - 2. Reporting issue or bugs. - 3. Collaboration in writing codes and other banks modules. - -This package is extended from PoolPort but we've changed some functionality and improved it . + +**مرحله ۵)** + +عملیات نصب پایان یافته است حال فایل gateway.php را در مسیر app/ را باز نموده و تنظیمات مربوط به درگاه بانکی مورد نظر خود را در آن وارد نمایید . + +حال میتوایند برای اتصال به api بانک از یکی از روش های زیر به انتخاب خودتان استفاده نمایید . (Facade , Service container): +
+ + 1. Gateway::make(new Mellat()) + 2. Gateway::make('mellat') + 3. Gateway::mellat() + 4. app('gateway')->make(new Mellat()); + 5. app('gateway')->mellat(); + +
+ + مثال :‌اتصال به بانک ملت (درخواست توکن و انتقال کاربر به درگاه بانک) +توجه :‌ مقدار متد price به ریال وارد شده است و معادل یکصد تومان می باشد + +یک روت از نوع GET با آدرس /bank/request ایجاد نمایید و کد های زیر را در آن قرار دهید . + +
+ + +```php + +try { + + $gateway = \Gateway::make('mellat'); + + $gateway->setCallback(url('/bank/response')); // You can also change the callback + $gateway->price(1000) + // setShipmentPrice(10) // optional - just for paypal + // setProductName("My Product") // optional - just for paypal + ->ready(); + + $refId = $gateway->refId(); // شماره ارجاع بانک + $transID = $gateway->transactionId(); // شماره تراکنش + + // در اینجا + // شماره تراکنش بانک را با توجه به نوع ساختار دیتابیس تان + // در جداول مورد نیاز و بسته به نیاز سیستم تان + // ذخیره کنید . + + return $gateway->redirect(); + +} catch (\Exception $e) { + + echo $e->getMessage(); +} + +``` + +
+ + و سپس روت با مسیر /bank/response و از نوع post ایجاد نمایید و کد های زیر را در آن قرار دهید : + +
+ + +```php + +try { + + $gateway = \Gateway::verify(); + $trackingCode = $gateway->trackingCode(); + $refId = $gateway->refId(); + $cardNumber = $gateway->cardNumber(); + + // تراکنش با موفقیت سمت بانک تایید گردید + // در این مرحله عملیات خرید کاربر را تکمیل میکنیم + +} catch (\Larabookir\Gateway\Exceptions\RetryException $e) { + + // تراکنش قبلا سمت بانک تاییده شده است و + // کاربر احتمالا صفحه را مجددا رفرش کرده است + // لذا تنها فاکتور خرید قبل را مجدد به کاربر نمایش میدهیم + + echo $e->getMessage() . "
"; + +} catch (\Exception $e) { + + // نمایش خطای بانک + echo $e->getMessage(); +} + +``` + +
+ +در صورت تمایل جهت همکاری در توسعه : + + 1. توسعه مستندات پکیج. + 2. گزارش باگ و خطا. + 3. همکاری در نوشتن ماژول دیگر بانک ها برای این پکیج . + + +درصورت بروز هر گونه + [باگ](https://github.com/larabook/gateway/issues) یا [خطا](https://github.com/larabook/gateway/issues) . + ما را آگاه سازید . + +این پکیج از پکیج دیگری بنام poolport مشتق شده است اما برخی از عملیات آن متناسب با فریموورک لارول تغییر کرده است +
diff --git a/config/gateway.php b/config/gateway.php index ed135c7c..fffe3d7e 100644 --- a/config/gateway.php +++ b/config/gateway.php @@ -48,6 +48,15 @@ 'callback-url' => '/' ], + //-------------------------------- + // IranKish gateway + //-------------------------------- + 'irankish' => [ + 'merchantId' => 'xxxxxxxxxxxxxxxxxxxx', + 'sha1key' => 'xxxxxxxxxxxxxxxxxxxx', + 'callback-url' => '/' + ], + //-------------------------------- // Sadad gateway //-------------------------------- @@ -57,7 +66,7 @@ 'terminalId' => 000000000, 'callback-url' => '/' ], - + //-------------------------------- // Parsian gateway //-------------------------------- diff --git a/migrations/2016_05_02_193213_create_gateway_transactions_table.php b/migrations/2016_05_02_193213_create_gateway_transactions_table.php index 16464561..f87a50d6 100644 --- a/migrations/2016_05_02_193213_create_gateway_transactions_table.php +++ b/migrations/2016_05_02_193213_create_gateway_transactions_table.php @@ -20,22 +20,12 @@ function getTable() */ public function up() { + + Schema::create($this->getTable(), function (Blueprint $table) { $table->engine = "innoDB"; $table->unsignedBigInteger('id', true); - $table->enum('port', [ - Enum::MELLAT, - Enum::SADAD, - Enum::ZARINPAL, - Enum::PAYLINE, - Enum::JAHANPAY, - Enum::PARSIAN, - Enum::PASARGAD, - Enum::SAMAN, - Enum::ASANPARDAKHT, - Enum::PAYPAL, - Enum::PAYIR - ]); + $table->enum('port', (array) Enum::getIPGs()); $table->decimal('price', 15, 2); $table->string('ref_id', 100)->nullable(); $table->string('tracking_code', 50)->nullable(); diff --git a/src/Asanpardakht/Asanpardakht.php b/src/Asanpardakht/Asanpardakht.php index 52c5a161..89363b0b 100644 --- a/src/Asanpardakht/Asanpardakht.php +++ b/src/Asanpardakht/Asanpardakht.php @@ -2,7 +2,7 @@ namespace Larabookir\Gateway\Asanpardakht; -use Illuminate\Support\Facades\Input; +use Illuminate\Support\Facades\Request; use SoapClient; use Larabookir\Gateway\PortAbstract; use Larabookir\Gateway\PortInterface; @@ -141,7 +141,7 @@ protected function sendPayRequest() */ protected function userPayment() { - $ReturningParams = Input::get('ReturningParams'); + $ReturningParams = Request::input('ReturningParams'); $ReturningParams = $this->decrypt($ReturningParams); $paramsArray = explode(",", $ReturningParams); diff --git a/src/Asanpardakht/AsanpardakhtException.php b/src/Asanpardakht/AsanpardakhtException.php index 42af6af8..1a8c55b4 100644 --- a/src/Asanpardakht/AsanpardakhtException.php +++ b/src/Asanpardakht/AsanpardakhtException.php @@ -145,8 +145,7 @@ class AsanpardakhtException extends BankException 1101 => "هویت درخواست کننده نامعتبر است", 1102 => "خطا در پردازش", 1103 => "تراکنشی یافت نشد" - - + ); public function __construct($errorRef) diff --git a/src/Enum.php b/src/Enum.php index cf431e7e..266f0a6e 100644 --- a/src/Enum.php +++ b/src/Enum.php @@ -1,37 +1,58 @@ -getConstants(),$excepts)); + else + return array_values(\Illuminate\Support\Arr::except($reflect->getConstants(),$excepts)); + } + + /** + * Status code for status field in poolport_transactions table + */ + const TRANSACTION_INIT = 'INIT'; + const TRANSACTION_INIT_TEXT = 'تراکنش ایجاد شد.'; + + /** + * Status code for status field in poolport_transactions table + */ + const TRANSACTION_SUCCEED = 'SUCCEED'; + const TRANSACTION_SUCCEED_TEXT = 'پرداخت با موفقیت انجام شد.'; + + /** + * Status code for status field in poolport_transactions table + */ + const TRANSACTION_FAILED = 'FAILED'; + const TRANSACTION_FAILED_TEXT = 'عملیات پرداخت با خطا مواجه شد.'; + +} diff --git a/src/GatewayResolver.php b/src/GatewayResolver.php index c7d7184b..53071630 100644 --- a/src/GatewayResolver.php +++ b/src/GatewayResolver.php @@ -2,6 +2,7 @@ namespace Larabookir\Gateway; +use Larabookir\Gateway\Irankish\Irankish; use Larabookir\Gateway\Parsian\Parsian; use Larabookir\Gateway\Paypal\Paypal; use Larabookir\Gateway\Sadad\Sadad; @@ -57,17 +58,7 @@ public function __construct($config = null, $port = null) */ public function getSupportedPorts() { - return [ - Enum::MELLAT, - Enum::SADAD, - Enum::ZARINPAL, - Enum::PARSIAN, - Enum::PASARGAD, - Enum::SAMAN, - Enum::PAYPAL, - Enum::ASANPARDAKHT, - Enum::PAYIR - ]; + return (array) Enum::getIPGs(); } /** @@ -136,36 +127,40 @@ public function verify() * @throws PortNotFoundException */ function make($port) - { - if ($port InstanceOf Mellat) { - $name = Enum::MELLAT; - } elseif ($port InstanceOf Parsian) { - $name = Enum::PARSIAN; - } elseif ($port InstanceOf Saman) { - $name = Enum::SAMAN; - } elseif ($port InstanceOf Zarinpal) { - $name = Enum::ZARINPAL; - } elseif ($port InstanceOf Sadad) { - $name = Enum::SADAD; - } elseif ($port InstanceOf Asanpardakht) { - $name = Enum::ASANPARDAKHT; - } elseif ($port InstanceOf Paypal) { - $name = Enum::PAYPAL; - } elseif ($port InstanceOf Payir) { - $name = Enum::PAYIR; - } elseif(in_array(strtoupper($port),$this->getSupportedPorts())){ - $port=ucfirst(strtolower($port)); - $name=strtoupper($port); - $class=__NAMESPACE__.'\\'.$port.'\\'.$port; - $port=new $class; - } else - throw new PortNotFoundException; - - $this->port = $port; - $this->port->setConfig($this->config); // injects config - $this->port->setPortName($name); // injects config - $this->port->boot(); - - return $this; - } + { + if ($port InstanceOf Mellat) { + $name = Enum::MELLAT; + } elseif ($port InstanceOf Parsian) { + $name = Enum::PARSIAN; + } elseif ($port InstanceOf Saman) { + $name = Enum::SAMAN; + } elseif ($port InstanceOf Zarinpal) { + $name = Enum::ZARINPAL; + } elseif ($port InstanceOf Sadad) { + $name = Enum::SADAD; + } elseif ($port InstanceOf Asanpardakht) { + $name = Enum::ASANPARDAKHT; + } elseif ($port InstanceOf Paypal) { + $name = Enum::PAYPAL; + } elseif ($port InstanceOf Payir) { + $name = Enum::PAYIR; + } elseif ($port InstanceOf Pasargad) { + $name = Enum::PASARGAD; + } elseif ($port InstanceOf Irankish) { + $name = Enum::IRANKISH; + } elseif (in_array(strtoupper($port), $this->getSupportedPorts())) { + $port = ucfirst(strtolower($port)); + $name = strtoupper($port); + $class = __NAMESPACE__ . '\\' . $port . '\\' . $port; + $port = new $class; + } else + throw new PortNotFoundException; + + $this->port = $port; + $this->port->setConfig($this->config); // injects config + $this->port->setPortName($name); // injects config + $this->port->boot(); + + return $this; + } } diff --git a/src/GatewayServiceProvider.php b/src/GatewayServiceProvider.php index b8c2e236..f51e4ae5 100644 --- a/src/GatewayServiceProvider.php +++ b/src/GatewayServiceProvider.php @@ -55,8 +55,10 @@ private function getProvider() { if (version_compare(\Illuminate\Foundation\Application::VERSION, '5.0', '<')) { $provider = 'Larabookir\Gateway\GatewayServiceProviderLaravel4'; - } else { + }elseif (version_compare(\Illuminate\Foundation\Application::VERSION, '5.0', '>=') && version_compare(\Illuminate\Foundation\Application::VERSION, '6.0', '<')) { $provider = 'Larabookir\Gateway\GatewayServiceProviderLaravel5'; + }else { + $provider = 'Larabookir\Gateway\GatewayServiceProviderLaravel6'; } return new $provider($this->app); diff --git a/src/GatewayServiceProviderLaravel5.php b/src/GatewayServiceProviderLaravel5.php index 26f593aa..a075b3f1 100644 --- a/src/GatewayServiceProviderLaravel5.php +++ b/src/GatewayServiceProviderLaravel5.php @@ -36,15 +36,6 @@ public function boot() ], 'migrations'); - - if ( - File::glob(base_path('/database/migrations/*create_gateway_status_log_table\.php')) - && !File::exists(base_path('/database/migrations/2017_04_05_103357_alter_id_in_transactions_table.php')) - ) { - @File::copy($migrations.'/2017_04_05_103357_alter_id_in_transactions_table.php',base_path('database/migrations/2017_04_05_103357_alter_id_in_transactions_table.php')); - } - - $this->loadViewsFrom($views, 'gateway'); // php artisan vendor:publish --provider=Larabookir\Gateway\GatewayServiceProvider --tag=views diff --git a/src/GatewayServiceProviderLaravel6.php b/src/GatewayServiceProviderLaravel6.php new file mode 100644 index 00000000..b3df8082 --- /dev/null +++ b/src/GatewayServiceProviderLaravel6.php @@ -0,0 +1,62 @@ +publishes([ + $config => config_path('gateway.php'), + ], 'config') + ; + + // php artisan vendor:publish --provider=Larabookir\Gateway\GatewayServiceProvider --tag=migrations + $this->publishes([ + $migrations => base_path('database/migrations') + ], 'migrations'); + + + $this->loadViewsFrom($views, 'gateway'); + + // php artisan vendor:publish --provider=Larabookir\Gateway\GatewayServiceProvider --tag=views + $this->publishes([ + $views => base_path('resources/views/vendor/gateway'), + ], 'views'); + + //$this->mergeConfigFrom( $config,'gateway') + } + + /** + * Register the application services. + * + * @return void + */ + public function register() + { + $this->app->singleton('gateway', function () { + return new GatewayResolver(); + }); + + } +} diff --git a/src/Irankish/Irankish.php b/src/Irankish/Irankish.php new file mode 100644 index 00000000..e6a61be6 --- /dev/null +++ b/src/Irankish/Irankish.php @@ -0,0 +1,202 @@ +amount = $amount; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function ready() + { + $this->sendPayRequest(); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function redirect() + { + $gateUrl = $this->gateUrl; + $token = $this->refId; + $merchantId = $this->config->get('gateway.irankish.merchantId'); + + return view('gateway::irankish-redirector')->with(compact('token', 'merchantId','gateUrl')); + } + + /** + * {@inheritdoc} + */ + public function verify($transaction) + { + parent::verify($transaction); + + $this->userPayment(); + $this->verifyPayment(); + return $this; + } + + /** + * Sets callback url + * + * @param $url + */ + function setCallback($url) + { + $this->callbackUrl = $url; + + return $this; + } + + /** + * Gets callback url + * @return string + */ + function getCallback() + { + if (!$this->callbackUrl) { + $this->callbackUrl = $this->config->get('gateway.irankish.callback-url'); + } + + return $this->makeCallback($this->callbackUrl, ['transaction_id' => $this->transactionId()]); + } + + /** + * Send pay request to server + * + * @return void + * + * @throws IranKishException + */ + protected function sendPayRequest() + { + $dateTime = new DateTime(); + + $this->newTransaction(); + + $fields = [ + 'amount' => $this->amount, + 'merchantId' => $this->config->get('gateway.irankish.merchantId'), + 'invoiceNo' => $this->transactionId(), + 'paymentId' => $this->getCustomInvoiceNo(), + 'revertURL' => $this->getCallback(), + 'description' => $this->getCustomDesc(), + ]; + + try { + $soap = new SoapClient($this->serverUrl, ['soap_version' => SOAP_1_1]); + $response = $soap->MakeToken($fields); + + } catch (\SoapFault $e) { + $this->transactionFailed(); + $this->newLog('SoapFault', $e->getMessage()); + throw $e; + } + + if ($response->MakeTokenResult->result != true) { + $this->transactionFailed(); + $this->newLog($response->MakeTokenResult->message, IrankishException::$errors[$response[0]]); + throw new IranKishException($response[0]); + } + $this->refId = $response->MakeTokenResult->token; + $this->transactionSetRefId(); + } + + /** + * Check user payment + * + * @return bool + * + * @throws IranKishException + */ + protected function userPayment() + { + + $this->refId = Request::input('token'); + $this->trackingCode = Request::input('referenceId'); + if(Request::has('cardNo')) + $this->cardNumber = Request::input('cardNo'); + $payRequestResCode = Request::input('resultCode'); + + if ($payRequestResCode == '100') { + return true; + } + + $this->transactionFailed(); + $this->newLog($payRequestResCode, @IrankishException::$errors[$payRequestResCode]); + throw new IrankishException($payRequestResCode); + } + + /** + * Verify user payment from bank server + * + * @return bool + * + * @throws IranKishException + * @throws SoapFault + */ + protected function verifyPayment() + { + $fields = [ + 'token' => $this->refId(), + 'merchantId' => $this->config->get('gateway.irankish.merchantId'), + 'referenceNumber' => $this->trackingCode(), + 'sha1key' => $this->config->get('gateway.irankish.sha1key') + ]; + + try { + $soap = new SoapClient($this->serverVerifyUrl); + $response = $soap->KicccPaymentsVerification($fields); + + } catch (\SoapFault $e) { + $this->transactionFailed(); + $this->newLog('SoapFault', $e->getMessage()); + throw $e; + } + + if ($response->KicccPaymentsVerificationResult != $this->amount) { + $this->transactionFailed(); + $this->newLog($response->KicccPaymentsVerificationResult, IrankishException::$errors[$response->KicccPaymentsVerificationResult]); + throw new IrankishException($response->KicccPaymentsVerificationResult); + } + + $this->transactionSucceed(); + $this->newLog($response->KicccPaymentsVerificationResult, Enum::TRANSACTION_SUCCEED_TEXT); + + + return true; + } + +} diff --git a/src/Irankish/IrankishException.php b/src/Irankish/IrankishException.php new file mode 100644 index 00000000..449778f2 --- /dev/null +++ b/src/Irankish/IrankishException.php @@ -0,0 +1,41 @@ + 'انصراف دارنده کارت.', + 120 => 'موجودی کافی نیست. ', + 130 => 'اطلاعات کارت اشتباه است.', + 131 => 'رمز کارت اشتباه است.', + 132 => 'کارت مسدود شده است.', + 133 => 'کارت منقضی شده است.', + 140 => 'زمان مورد نظر به پایان رسیده است.', + 150 => 'خطای داخل بانکی.', + 160 => 'خطای CVV2 یا EXPDATE.', + 166 => 'بانک صادر کننده شما مجوز تراکنش را صادر نکرده است.', + 200 => 'مبلغ تراکنش بیش حد از مجاز برای هر تراکنش می باشد.', + 201 => 'مبلغ تراکنش بیش حد از مجاز برای تراکنش در روز می باشد.', + 202 => 'مبلغ تراکنش بیش حد از مجاز برای تراکنش در ماه می باشد.', + -20 => 'وجود کاراکتر های غیر مجاز در درخواست.', + -30 => 'تراکنش قبلا برگشت خورده است.', + -50 => 'طول رشته درخواست غیر مجاز است.', + -51 => 'خطا در درخواست.', + -80 => 'تراکنش مورد نظر یافت نشد.', + -81 => 'خطای داخل بانکی.', + -90 => 'تراکنش قبلا تایید شده.', + + + ]; + + public function __construct($errorId) + { + $this->errorId = intval($errorId); + + parent::__construct(@self::$errors[$this->errorId] . ' #' . $this->errorId, $this->errorId); + } +} diff --git a/src/JahanPay/JahanPay.php b/src/JahanPay/JahanPay.php index 0f641463..200c19b0 100644 --- a/src/JahanPay/JahanPay.php +++ b/src/JahanPay/JahanPay.php @@ -2,7 +2,7 @@ namespace Larabookir\Gateway\JahanPay; -use Illuminate\Support\Facades\Input; +use Illuminate\Support\Facades\Request; use Larabookir\Gateway\Enum; use SoapClient; use Larabookir\Gateway\PortAbstract; @@ -134,7 +134,7 @@ protected function sendPayRequest() */ protected function userPayment() { - $refId = Input::get('au'); + $refId = Request::input('au'); if ($this->refId() != $refId) { $this->transactionFailed(); diff --git a/src/Maskan/Maskan.php b/src/Maskan/Maskan.php new file mode 100644 index 00000000..4821797a --- /dev/null +++ b/src/Maskan/Maskan.php @@ -0,0 +1,233 @@ +amount = $amount ; + return $this; + } + + /** + * {@inheritdoc} + */ + public function ready() + { + $this->sendPayRequest(); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function redirect() + { + $url = $this->bankGateUrl; + + return view('gateway::maskan-redirector', compact('url')); + } + + /** + * {@inheritdoc} + */ + public function verify($transaction) + { + parent::verify($transaction); + $this->verifyPayment(); + + return $this; + } + + /** + * Sets callback url + * + * @param $url + */ + function setCallback($url) + { + $this->callbackUrl = $url; + + return $this; + } + + /** + * Gets callback url + * @return string + */ + function getCallback() + { + return $this->makeCallback($this->callbackUrl, ['transaction_id' => $this->transactionId()]); + } + + /** + * Send pay request to server + * + * @return void + * + * @throws MaskanException + */ + protected function sendPayRequest() + { + $this->newTransaction(); + $terminalId = $this->config->get("gateway.maskan.terminal_id"); // Terminal ID + $userName = $this->config->get("gateway.maskan.USERNAME"); // Username + $userPassword = $this->config->get("gateway.maskan.USERPASSWORD"); // Password + $orderId = $this->transactionId(); // Order ID + $amount = $this->getPrice(); // Price / Rial + $callBackUrl = $this->getCallback(); // Callback URL + + $parameters = [ + "PAYMENTID" => $orderId, + "CALLBACKURL" => $callBackUrl, + "AMOUNT" => $amount, + "USERNAME" => $userName, + "USERPASSWORD" => $userPassword, + "CARDACCEPTORCODE" => $terminalId, + ]; + + $curl = curl_init(); + + curl_setopt($curl, CURLOPT_POST, 1); + curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($parameters)); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl, CURLOPT_URL, $this->serverUrl); + curl_setopt($curl, CURLOPT_HTTPHEADER, ["Content-Type: application/json"]); + $result = curl_exec($curl); + curl_close($curl); + + if ($result == null || $result == "" || !isset($result)) { + $is_error = 'yes'; + $error_code = 505; + $this->transactionFailed(); + $this->newLog($error_code, MaskanException::$errors[$error_code]); + + } else { + $confirm = json_decode($result, false); + $ActionCode = strval($confirm->ActionCode); + $RedirectUrl = strval($confirm->RedirectUrl); + $RefCode = strval($confirm->RedirectUrl); + if ($ActionCode == "0") { + $this->refId = $RefCode; + $this->transactionSetRefId(); + $this->bankGateUrl = $RedirectUrl; + + return true; + } + $this->transactionFailed(); + $this->newLog($ActionCode, MaskanException::$errors[$ActionCode]); + throw new MaskanException($ActionCode); + } + } + + /** + * Check user payment with GET data + * + * @return bool + * + * @throws MaskanException + */ + + /** + * Verify user payment from zarinpal server + * + * @return bool + * + * @throws MaskanException + */ + protected function verifyPayment() + { + $json = stripslashes($_POST['Data']); + $Res = json_decode($json); + $transaction_id = strval($Res->RRN); + $orderId = strval($Res->PaymentID); + $fault = strval($Res->ActionCode); + + $terminalId = $this->config->get("gateway.maskan.terminal_id"); // Terminal ID + $userName = $this->config->get("gateway.maskan.USERNAME"); // Username + $userPassword = $this->config->get("gateway.maskan.USERPASSWORD"); // Password + + if ($fault == 511 || $fault == 519) { + $this->transactionFailed(); + $this->newLog($fault, MaskanException::$errors[$fault]); + throw new MaskanException($fault); + } else { + if ($fault != 0) { + $this->transactionFailed(); + $this->newLog($fault, MaskanException::$errors[$fault]); + throw new MaskanException($fault); + } else { + $parameters = [ + "PAYMENTID" => $orderId, + "CARDACCEPTORCODE" => $terminalId, + "RRN" => $transaction_id, + "USERNAME" => $userName, + "USERPASSWORD" => $userPassword, + ]; + + $curl = curl_init(); + curl_setopt($curl, CURLOPT_POST, 1); + curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($parameters)); + curl_setopt($curl, CURLOPT_URL, "https://fcp.shaparak.ir/NvcService/Api/v2/Confirm"); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl, CURLOPT_HTTPHEADER, ["Content-Type: application/json"]); + $result = curl_exec($curl); + curl_close($curl); + $result = iconv('UTF-8', 'UTF-8//IGNORE', utf8_encode($result)); + $confirm = json_decode($result, false); + $ActionCode = strval($confirm->ActionCode); + if (json_last_error() != 0 || $confirm == null || $ActionCode == null) { + $error_code = 505; + $this->transactionFailed(); + $this->newLog($error_code, MaskanException::$errors[$error_code]); + throw new MaskanException($ActionCode); + } else { + if ($ActionCode == "511" || $ActionCode == "519") { + $this->transactionFailed(); + $this->newLog($ActionCode, MaskanException::$errors[$ActionCode]); + throw new MaskanException($ActionCode); + } else { + if ($ActionCode != "0") { + $this->transactionFailed(); + $this->newLog($ActionCode, MaskanException::$errors[$ActionCode]); + throw new MaskanException($ActionCode); + } else { + $this->trackingCode = $confirm->RRN; + $this->transactionSucceed(); + $this->newLog(1, Enum::TRANSACTION_SUCCEED_TEXT); + + return true; + } + } + } + } + } + } +} diff --git a/src/Maskan/MaskanException.php b/src/Maskan/MaskanException.php new file mode 100644 index 00000000..c339358e --- /dev/null +++ b/src/Maskan/MaskanException.php @@ -0,0 +1,107 @@ +errorId = $errorId; + + parent::__construct(@self::$errors[$errorId] . ' #' . $errorId, $errorId); + } + + public static $errors = [ + '505' => 'خطای نامشخص', + '-1' => 'کلید نامعتبر است', + '0' => 'Success موفقیت ', + '1' => 'صادرکننده ی کارت از انجام تراکنش صرف نظر کرد.', + '2' => 'عملیات تاییدیه این تراکنش قبلا با موفقیت صورت پذیرفته است.', + '3' => 'پذیرنده ی فروشگاهی نامعتبر است.', + '5' => 'از انجام تراکنش صرف نظر شد.', + '6' => 'بروز خطا', + '7' => 'به دلیل شرایط خاص کارت توسط دستگاه ضبط شود.', + '8' => 'باتشخیص هویت دارنده ی کارت، تراکنش موفق می باشد.', + '9' => 'در حال حاضر امکان پاسخ دهی وجود ندارد', + '12' => 'تراکنش نامعتبر است.', + '13' => 'مبلغ تراکنش اصلاحیه نادرست است.', + '14' => 'شماره کارت ارسالی نامعتبر است. (وجود ندارد)', + '15' => 'صادرکننده ی کارت نامعتبراست.(وجود ندارد)', + '16' => 'تراکنش مورد تایید است و اطلاعات شیار سوم کارت به روز رسانی شود.', + '19' => 'تراکنش مجدداً ارسال شود.', + '20' => 'خطای ناشناخته از سامانه مقصد', + '23' => 'کارمزد ارسالی پذیرنده غیر قابل قبول است.', + '25' => 'شماره شناسایی صادرکننده غیر معتبر', + '30' => 'قالب پیام دارای اشکال است.', + '31' => 'پذیرنده توسط سوئیچ پشتیبانی نمی شود.', + '33' => 'تاریخ انقضای کارت سپری شده است.', + '34' => 'دارنده کارت مظنون به تقلب است.', + '36' => 'کارت محدود شده است.کارت توسط دستگاه ضبط شود. ', + '38' => 'تعداد دفعات ورود رمز غلط بیش از حدمجاز است. ', + '39' => 'کارت حساب اعتباری ندارد. ', + '40' => ' عملیات درخواستی پشتیبانی نمی گردد. ', + '41' => 'کارت مفقودی می باشد. ', + '42' => 'کارت حساب عمومی ندارد. ', + '43' => 'کارت مسروقه می باشد. ', + '44' => ' کارت حساب سرمایه گذاری ندارد. ', + '48' => 'تراکنش پرداخت قبض قبلا انجام پذیرفته', + '51' => ' موجودی کافی نیست. ', + '52' => ' کارت حساب جاری ندارد. ', + '53' => ' کارت حساب قرض الحسنه ندارد. ', + '56' => ' تاریخ انقضای کارت سپری شده است. 54 55 Pin -Error کارت نا معتبر است.', + '57' => 'انجام تراکنش مربوطه توسط دارنده ی کارت مجاز نمی باشد. ', + '58' => 'انجام تراکنش مربوطه توسط پایانه ی انجام دهنده مجاز نمی باشد. ', + '59' => 'کارت مظنون به تقلب است. ', + '61' => 'مبلغ تراکنش بیش از حد مجاز است. ', + '62' => ' کارت محدود شده است. ', + '63' => ' تمهیدات امنیتی نقض گردیده است. ', + '64' => 'مبلغ تراکنش اصلی نامعتبر است.(تراکنش مالی اصلی با این مبلغ نمی باشد) ', + '65' => 'تعداد درخواست تراکنش بیش از حد مجاز است. ', + '67' => 'کارت توسط دستگاه ضبط شود. ', + '75' => ' تعداد دفعات ورود رمزغلط بیش از حد مجاز است.', + '77' => 'روز مالی تراکنش نا معتبر است.', + '78' => 'کارت فعال نیست. ', + '79' => ' حساب متصل به کارت نامعتبر است یا دارای اشکال است. ', + '80' => ' خطای داخلی سوییچ رخ داده است ', + '81' => 'خطای پردازش سوییچ ', + '83' => ' نموده است.Sign Offارائه دهنده خدمات پرداخت یا سامانه شاپرک اعلام ', + '84' => ' Host -Down ', + '86' => 'Sign offموسسه ارسال کننده، شاپرک یا مقصد تراکنش در حالت ', + '90' => 'سامانه مقصد تراکنش درحال انجام عملیات پایان روز می باشد. ', + '91' => 'پاسخی از سامانه مقصد دریافت نشد ', + '92' => 'مسیری برای ارسال تراکنش به مقصد یافت نشد. (موسسه های اعلامی معتبر نیستند) ', + '93' => 'پیام دوباره ارسال گردد. (درپیام های تاییدیه) ', + '94' => ' پیام تکراری است ', + '96' => ' بروز خطای سیستمی در انجام تراکنش ', + '97' => ' مبلغ تراکنش غیر معتبر است ', + '98' => ' شارژ وجود ندارد. ', + '99' => ' تراکنش غیر معتبر است یا کلید ها هماهنگ نیستند ', + '100' => 'خطای نامشخص', + '500' => ' کدپذیرندگی معتبر نمی باشد ', + '501' => 'مبلغ بیشتر از حد مجاز است ', + '502' => ' نام کاربری و یا رمز ورود اشتباه است ', + '503' => ' آی پی دامنه کار بر نا معتبر است ', + '504' => ' آدرس صفحه برگشت نا معتبر است ', + '506' => 'شماره سفارش تکراری است - و یا مشکلی دیگر در درج اطلاعات ', + '507' => 'خطای اعتبارسنجی مقادیر ', + '508' => 'فرمت درخواست ارسالی نا معتبر است', + '509' => 'قطع سرویس های شاپرک', + '510' => 'لغو درخواست توسط خود کاربر', + '511' => 'طولانی شدن زمان تراکنش و عدم انجام در زمان مقرر توسط کاربر', + '512' => ' کارتCvv2خطا اطلاعات', + '513' => 'خطای اطلاعات تاریخ انقضاء کارت', + '514' => ' خطا در رایانامه درج شده', + '515' => ' خطا در کاراکترهای کپچا', + '516' => ' اطلاعات درخواست نامعتبر میباشد', + '517' => 'خطا در شماره کارت', + '518' => 'تراکنش مورد نظر وجود ندارد.', + '519' => 'مشتری از پرداخت منصرف شده است', + '520' => 'مشتری در زمان مقرر پرداخت را انجام نداده است', + '521' => 'قبلا درخواست تائید با موفقیت ثبت شده است', + '522' => ' قبلا درخواست اصلاح تراکنش با موفقیت ثبت شده است', + '600' => 'لغو تراکنش', + + ]; +} diff --git a/src/Mellat/Mellat.php b/src/Mellat/Mellat.php index 8b2d3a3f..341c534b 100644 --- a/src/Mellat/Mellat.php +++ b/src/Mellat/Mellat.php @@ -3,7 +3,7 @@ namespace Larabookir\Gateway\Mellat; use DateTime; -use Illuminate\Support\Facades\Input; +use Illuminate\Support\Facades\Request; use Larabookir\Gateway\Enum; use SoapClient; use Larabookir\Gateway\PortAbstract; @@ -140,10 +140,10 @@ protected function sendPayRequest() */ protected function userPayment() { - $this->refId = Input::get('RefId'); - $this->trackingCode = Input::get('SaleReferenceId'); - $this->cardNumber = Input::get('CardHolderPan'); - $payRequestResCode = Input::get('ResCode'); + $this->refId = Request::input('RefId'); + $this->trackingCode = Request::input('SaleReferenceId'); + $this->cardNumber = Request::input('CardHolderPan'); + $payRequestResCode = Request::input('ResCode'); if ($payRequestResCode == '0') { return true; diff --git a/src/Parsian/Parsian.php b/src/Parsian/Parsian.php index 7fa337bd..cd2e93fb 100644 --- a/src/Parsian/Parsian.php +++ b/src/Parsian/Parsian.php @@ -2,7 +2,8 @@ namespace Larabookir\Gateway\Parsian; -use Illuminate\Support\Facades\Input; +use Illuminate\Support\Facades\Request; +use Illuminate\Validation\Rules\In; use SoapClient; use Larabookir\Gateway\PortAbstract; use Larabookir\Gateway\PortInterface; @@ -14,10 +15,11 @@ class Parsian extends PortAbstract implements PortInterface * * @var string */ - protected $serverUrl = 'https://pec.shaparak.ir/NewIPGServices/Sale/SaleService.asmx?wsdl'; - protected $serverUrlConfirm = 'https://pec.shaparak.ir/NewIPGServices/Confirm/ConfirmService.asmx?wsdl'; + protected $serverUrl = 'https://pec.shaparak.ir/NewIPGServices/Sale/SaleService.asmx?wsdl'; + protected $serverUrlConfirm = "https://pec.shaparak.ir/NewIPGServices/Confirm/ConfirmService.asmx?WSDL"; - /** + + /** * Address of gate for redirect * * @var string @@ -89,7 +91,7 @@ function getCallback() /** * Send pay request to parsian gateway - * + * * authority === Token * @return bool * @@ -100,20 +102,16 @@ protected function sendPayRequest() $this->newTransaction(); $params = array( - "requestData" => array( - 'LoginAccount' => $this->config->get('gateway.parsian.pin'), - 'Amount' => $this->amount, - 'OrderId' => $this->transactionId(), - 'CallBackUrl' => $this->getCallback(), - 'AdditionalData' => '', - // 'authority' => 0, - // 'status' => 1 - ) + 'LoginAccount' => $this->config->get('gateway.parsian.pin'), + 'Amount' => $this->amount . "", + 'OrderId' => $this->transactionId(), + 'CallBackUrl' => $this->getCallback(), + 'AdditionalData' => "" ); try { $soap = new SoapClient($this->serverUrl); - $response = $soap->SalePaymentRequest($params); + $response = $soap->SalePaymentRequest(["requestData" => $params]); } catch (\SoapFault $e) { $this->transactionFailed(); @@ -154,18 +152,15 @@ protected function sendPayRequest() /** * Verify payment - * @authority == Token * @throws ParsianErrorException */ protected function verifyPayment() { - if (!Input::has('status') && !Input::has('Token') - || Input::has('status') && Input::get('status') == 0 - || Input::has('Token') && Input::get('Token') == "") - throw new ParsianErrorException('درخواست غیر معتبر', -1); + if (!Request::has('Token') && !Request::has('status')) + throw new ParsianErrorException('درخواست غیر معتبر', -1); - $authority = Input::get('Token'); - $status = Input::get('status'); + $authority = Request::input('Token'); + $status = Request::input('status'); if ($status != 0) { $errorMessage = ParsianResult::errorMessage($status); @@ -177,38 +172,34 @@ protected function verifyPayment() throw new ParsianErrorException('تراکنشی یافت نشد', -1); $params = array( - "requestData" => array( - 'LoginAccount' => $this->config->get('gateway.parsian.pin'), - 'Token' => $authority, - // 'status' => 1 - ) + 'LoginAccount' => $this->config->get('gateway.parsian.pin'), + 'Token' => $authority, ); try { - $soap = new SoapClient($this->serverUrlConfirm); - $result = $soap->ConfirmPayment($params); + $soap = new SoapClient($this->serverUrlConfirm); + $result = $soap->ConfirmPayment([ + "requestData" => $params + ]); } catch (\SoapFault $e) { throw new ParsianErrorException($e->getMessage(), -1); } - if ($result === false || !isset($result->ConfirmPaymentResult) || $result->ConfirmPaymentResult == "") + if ($result === false || !isset($result->ConfirmPaymentResult->Status)) throw new ParsianErrorException('پاسخ دریافتی از بانک نامعتبر است.', -1); - if (!isset($result->ConfirmPaymentResult->status) - || isset($result->ConfirmPaymentResult->status) - && $result->ConfirmPaymentResult->status != 0 - || !isset($result->ConfirmPaymentResult->RRN) - || $result->ConfirmPaymentResult->RRN == 0) { - $errorMessage = ParsianResult::errorMessage($result->ConfirmPaymentResult->status); + + if ($result->ConfirmPaymentResult->Status != 0) { + $errorMessage = ParsianResult::errorMessage($result->ConfirmPaymentResult->Status); $this->transactionFailed(); - $this->newLog($result->status, $errorMessage); - throw new ParsianErrorException($errorMessage, $result->ConfirmPaymentResult->status); + $this->newLog($result->ConfirmPaymentResult->Status, $errorMessage); + throw new ParsianErrorException($errorMessage, $result->ConfirmPaymentResult->Status); } $this->trackingCode = $result->ConfirmPaymentResult->RRN; $this->cardNumber = $result->ConfirmPaymentResult->CardNumberMasked; $this->transactionSucceed(); - $this->newLog($result->status, ParsianResult::errorMessage($result->status)); + $this->newLog($result->ConfirmPaymentResult->Status, ParsianResult::errorMessage($result->ConfirmPaymentResult->Status)); } } diff --git a/src/Parsian/ParsianResult.php b/src/Parsian/ParsianResult.php index 58bd7b40..0ea4b38c 100644 --- a/src/Parsian/ParsianResult.php +++ b/src/Parsian/ParsianResult.php @@ -5,41 +5,29 @@ class ParsianResult { - - public static $errors = array( - 0 => 'تراکنش با موفقیت انجام شد.', - 1 => 'خطا در انجام تراکنش', - 2 => 'بین عملیات وقفه افتاده است.', - 10 => 'شماره کارت نامعتبر است.', - 11 => 'کارت شما منقضی شده است', - 12 => 'رمز کارت وارد شده اشتباه است', - 13 => 'موجودی کارت شما کافی نیست', - 14 => 'مبلغ تراکنش بیش از سقف مجاز پذیرنده است.', - 15 => 'سقف مجاز روزانه شما کامل شده است.', - 18 => 'این تراکنش قبلا تایید شده است', - 20 => 'اطلاعات پذیرنده صحیح نیست.', - 21 => 'invalid authority', - 22 => 'اطلاعات پذیرنده صحیح نیست.', - 30 => 'عملیات قبلا با موفقیت انجام شده است.', - 34 => 'شماره تراکنش فروشنده درست نمی باشد.', - -113 => 'پارامتر ورودی و یا برخی از خصوصیات آن خالی است و یا مقداردهی نشده است', - -127 => 'آدرس IP معتبر نمی باشد', - -32768 => 'خطای ناشناخته رخ داده است.', - -1552 => 'برگشت تراکنش مجاز نمی باشد', - -1551 => 'برگشت تراکنش قبلا انجام شده است.', - -1550 => 'برگشت تراکنش در وضعیت جاری امکان پذیر نمی باشد.', - -1549 => 'زمان مجاز برای درخواست برگشت تراکنش به تمام رسیده است.', - -1540 => 'تایید تراکنش ناموفق می باشد.', - -1533 => 'تراکنش قبلا تایید شده است.', - -1532 => 'تراکنش از سوی پذیرنده تایید شد.', - -1531 => 'تایید تراکنش ناموفق امکان پذیر نمی باشد.', - -1530 => 'پذیرنده مجاز به تایید این تراکنش نمی باشد.', - -1528 => 'اطلاعات پرداخت یافت نشد.', - -1527 => 'انجام عملیات درخواست پرداخت تراکنش.', - -138 => 'عملیات پرداخت توسط کاربر لغو شد.', - -131 => 'توکن نامعتبر می باشد.', - -130 => 'زمان توکن منقضی شده است', - ); + public static $errors + = [ + -32768 => "خطاي ناشناخته رخ داده است", + -32768 => "خطاي ناشناخته رخ داده است", + -1552 => "برگشت تراکنش مجاز نمی باشد", + -1551 => "برگشت تراکنش قب ًلا انجام شده است", + -138 => "عملیات پرداخت توسط کاربر لغو شد", + 0 => 'تراکنش با موفقیت انجام شد.', + 1 => 'خطا در انجام تراکنش', + 2 => 'بین عملیات وقفه افتاده است.', + 10 => 'شماره کارت نامعتبر است.', + 11 => 'کارت شما منقضی شده است', + 12 => 'رمز کارت وارد شده اشتباه است', + 13 => 'موجودی کارت شما کافی نیست', + 14 => 'مبلغ تراکنش بیش از سقف مجاز پذیرنده است.', + 15 => 'سقف مجاز روزانه شما کامل شده است.', + 18 => 'این تراکنش قبلا تایید شده است', + 20 => 'اطلاعات پذیرنده صحیح نیست.', + 21 => 'invalid authority', + 22 => 'اطلاعات پذیرنده صحیح نیست.', + 30 => 'عملیات قبلا با موفقیت انجام شده است.', + 34 => 'شماره تراکنش فروشنده درست نمی باشد.', + ]; public static function errorMessage($errorId) { diff --git a/src/Pasargad/Parser.php b/src/Pasargad/Parser.php index fc8b2021..3e944720 100644 --- a/src/Pasargad/Parser.php +++ b/src/Pasargad/Parser.php @@ -1,7 +1,7 @@ Input::get('iN'), - "invoiceDate" => Input::get('iD') + "invoiceNumber" => Request::input('iN'), + "invoiceDate" => Request::input('iD') ]; foreach ($values as $key => $val) { diff --git a/src/Pasargad/Pasargad.php b/src/Pasargad/Pasargad.php index c6c9a861..792c2160 100644 --- a/src/Pasargad/Pasargad.php +++ b/src/Pasargad/Pasargad.php @@ -2,7 +2,7 @@ namespace Larabookir\Gateway\Pasargad; -use Illuminate\Support\Facades\Input; +use Illuminate\Support\Facades\Request; use Larabookir\Gateway\Enum; use Larabookir\Gateway\Parsian\ParsianErrorException; use Larabookir\Gateway\PortAbstract; @@ -126,7 +126,7 @@ protected function sendPayRequest($payment_id, $callback_url) protected function verifyPayment() { $fields = array( - 'invoiceUID' => Input::get('tref'), + 'invoiceUID' => Request::input('tref'), ); $result = Parser::post2https($fields, $this->checkTransactionUrl); diff --git a/src/Payir/Payir.php b/src/Payir/Payir.php index 1f8e1d31..66328230 100644 --- a/src/Payir/Payir.php +++ b/src/Payir/Payir.php @@ -1,7 +1,7 @@ cardNumber = Input::get('cardNumber'); - $message = Input::get('message'); + $status = Request::input('status'); + $transId = Request::input('transId'); + $this->cardNumber = Request::input('cardNumber'); + $message = Request::input('message'); if (is_numeric($status) && $status > 0) { $this->trackingCode = $transId; return true; diff --git a/src/Payline/Payline.php b/src/Payline/Payline.php index b10f4fa0..7ea98146 100644 --- a/src/Payline/Payline.php +++ b/src/Payline/Payline.php @@ -2,7 +2,7 @@ namespace Larabookir\Gateway\Payline; -use Illuminate\Support\Facades\Input; +use Illuminate\Support\Facades\Request; use Larabookir\Gateway\Enum; use Larabookir\Gateway\PortAbstract; use Larabookir\Gateway\PortInterface; @@ -141,8 +141,8 @@ protected function sendPayRequest() */ protected function userPayment() { - $this->refIf = Input::get('id_get'); - $trackingCode = Input::get('trans_id'); + $this->refIf = Request::input('id_get'); + $trackingCode = Request::input('trans_id'); if (is_numeric($trackingCode) && $trackingCode > 0) { $this->trackingCode = $trackingCode; diff --git a/src/Paypal/Paypal.php b/src/Paypal/Paypal.php index d5d46391..fbf3bc5f 100644 --- a/src/Paypal/Paypal.php +++ b/src/Paypal/Paypal.php @@ -5,7 +5,7 @@ use Larabookir\Gateway\Mellat\MellatException; use Larabookir\Gateway\Enum; use Larabookir\Gateway\Paypal\PaypalException; -use Illuminate\Support\Facades\Input; +use Illuminate\Support\Facades\Request; use Larabookir\Gateway\PortAbstract; use Larabookir\Gateway\PortInterface; use PayPal\Api\Amount; @@ -186,9 +186,9 @@ public function sendPayRequest() */ protected function userPayment() { - $this->refId = Input::get('PayerID'); + $this->refId = Request::input('PayerID'); $this->transactionSetRefId(); - $this->trackingCode = Input::get('token'); + $this->trackingCode = Request::input('token'); } /** diff --git a/src/PortAbstract.php b/src/PortAbstract.php index e5d42e44..bccbf060 100644 --- a/src/PortAbstract.php +++ b/src/PortAbstract.php @@ -59,6 +59,13 @@ abstract class PortAbstract */ protected $description; + /** + * Custom Invoice Number of transaction + * + * @var string + */ + protected $customInvoiceNo; + /** * callback URL * @@ -98,7 +105,7 @@ function setConfig($config) /** * @return mixed */ - function getTable() + function getTable() { return $this->db->table($this->config->get('gateway.table')); } @@ -153,6 +160,28 @@ function getCustomDesc () return $this->description; } + /** + * Set custom Invoice number on current transaction + * + * @param string $description + * + * @return void + */ + function setCustomInvoiceNo ($invoiceNo) + { + $this->customInvoiceNo = $invoiceNo; + } + + /** + * Get custom Invoice number of current transaction + * + * @return string | null + */ + function getCustomInvoiceNo () + { + return $this->customInvoiceNo; + } + /** * Return card number * @@ -362,6 +391,7 @@ protected function url_modify($changes, $url) return (!empty($url_array['scheme']) ? $url_array['scheme'] . '://' : null) . (!empty($url_array['host']) ? $url_array['host'] : null) . (!empty($url_array['port']) ? ':' . $url_array['port'] : null) . - $url_array['path'] . '?' . http_build_query($query_array); + (!empty($url_array['path']) ? $url_array['path'] : null) . + '?' . http_build_query($query_array); } } diff --git a/src/Saman/Saman.php b/src/Saman/Saman.php index 0a9ec02f..5fa9ccdf 100644 --- a/src/Saman/Saman.php +++ b/src/Saman/Saman.php @@ -2,7 +2,8 @@ namespace Larabookir\Gateway\Saman; -use Illuminate\Support\Facades\Input; +use Carbon\Carbon; +use Illuminate\Support\Facades\Request; use SoapClient; use Larabookir\Gateway\PortAbstract; use Larabookir\Gateway\PortInterface; @@ -22,7 +23,12 @@ class Saman extends PortAbstract implements PortInterface * * @var string */ - protected $serverUrl = 'https://sep.shaparak.ir/payments/referencepayment.asmx?wsdl'; + +// protected $serverVerifyUrl = "https://sep.shaparak.ir/payments/referencepayment.asmx?WSDL"; + protected $serverVerifyUrl = "http://banktest.ir/gateway/saman/payments/referencepayment?wsdl"; + +// protected $gateUrl = "https://sep.shaparak.ir/Payment.aspx"; + protected $gateUrl = "http://banktest.ir/gateway/saman/gate"; /** * {@inheritdoc} @@ -55,7 +61,7 @@ function setOptionalData (Array $data) { $this->optional_data = $data; } - + /** * {@inheritdoc} @@ -70,8 +76,8 @@ public function redirect() ]; $data = array_merge($main_data, $this->optional_data); - - return \View::make('gateway::saman-redirector')->with($data); + + return \View::make('gateway::saman-redirector')->with($data)->with('gateUrl',$this->gateUrl); } /** @@ -121,11 +127,18 @@ function getCallback() */ protected function userPayment() { - $this->refId = Input::get('RefNum'); - $this->trackingCode = Input::get('TRACENO'); - $this->cardNumber = Input::get('SecurePan'); - $payRequestRes = Input::get('State'); - $payRequestResCode = Input::get('StateCode'); + $this->trackingCode = Request::input('TRACENO'); + // $this->cardNumber = Request::input('SecurePan'); , will cause mysql error : Data too long for column 'card_number' ! + $payRequestRes = Request::input('State'); + $payRequestResCode = Request::input('Status'); + + $this->refId = Request::input('RefNum'); + $this->getTable()->whereId($this->transactionId)->update([ + 'ref_id' => $this->refId, + 'tracking_code' => $this->trackingCode, + // 'card_number' => $this->cardNumber, will cause mysql error : Data too long for column 'card_number' ! + 'updated_at' => Carbon::now(), + ]); if ($payRequestRes == 'OK') { return true; @@ -153,9 +166,8 @@ protected function verifyPayment() "password" => $this->config->get('gateway.saman.password'), ); - try { - $soap = new SoapClient($this->serverUrl); + $soap = new SoapClient($this->serverVerifyUrl); $response = $soap->VerifyTransaction($fields["RefNum"], $fields["merchantID"]); } catch (\SoapFault $e) { @@ -167,18 +179,14 @@ protected function verifyPayment() $response = intval($response); if ($response == $this->amount) { - $this->transactionSucceed([ - 'ref_id' => $this->refId, - 'tracking_code' => $this->trackingCode, - 'card_number' => $this->cardNumber - ]); + $this->transactionSucceed(); return true; } //Reverse Transaction if($response>0){ try { - $soap = new SoapClient($this->serverUrl); + $soap = new SoapClient($this->serverVerifyUrl); $response = $soap->ReverseTransaction($fields["RefNum"], $fields["merchantID"], $fields["password"], $response); } catch (\SoapFault $e) { @@ -193,7 +201,7 @@ protected function verifyPayment() $this->transactionFailed(); $this->newLog($response, SamanException::$errors[$response]); throw new SamanException($response); - + } diff --git a/src/Saman/SamanException.php b/src/Saman/SamanException.php index 6d52bd37..d8663f80 100644 --- a/src/Saman/SamanException.php +++ b/src/Saman/SamanException.php @@ -11,6 +11,9 @@ class SamanException extends BankException "OK" => "پرداخت با موفقیت انجام شد", 'Canceled By User' => 'تراکنش توسط خریدار کنسل شد', 'Invalid Amount' => 'مبلغ سند برگشتی از مبلغ تراکنش اصلی بیشتر است', + 'Merchant Invalid' => 'پذیرنده فروشگاهی نامعتبر است', + 'Do Not Honour' => 'از انجام تراکنش صرف نظر شد', + 'Honour With Identification' => 'با تشخیص هویت دارنده کارت،تراکنش موفق می باشد', 'Invalid Transaction' => 'درخواست برگشت تراکنش رسیده است در حالی که تراکنش اصلی پیدا نمی شود', 'Invalid Card Number' => 'شماره کارت اشتباه است', 'No Such Issuer' => 'چنین صادر کننده کارتی وجود ندارد', diff --git a/src/Zarinpal/Zarinpal.php b/src/Zarinpal/Zarinpal.php index dc70f22a..7b436110 100644 --- a/src/Zarinpal/Zarinpal.php +++ b/src/Zarinpal/Zarinpal.php @@ -3,7 +3,7 @@ namespace Larabookir\Gateway\Zarinpal; use DateTime; -use Illuminate\Support\Facades\Input; +use Illuminate\Support\Facades\Request; use Larabookir\Gateway\Enum; use SoapClient; use Larabookir\Gateway\PortAbstract; @@ -207,8 +207,8 @@ protected function sendPayRequest() */ protected function userPayment() { - $this->authority = Input::get('Authority'); - $status = Input::get('Status'); + $this->authority = Request::input('Authority'); + $status = Request::input('Status'); if ($status == 'OK') { return true; diff --git a/views/irankish-redirector.blade.php b/views/irankish-redirector.blade.php new file mode 100644 index 00000000..09e20318 --- /dev/null +++ b/views/irankish-redirector.blade.php @@ -0,0 +1,206 @@ += 1000) + { + if(!empty($_POST['fullname'])) + { + $_SESSION['merchantId'] = $MerchantId; + $_SESSION['sha1Key'] = $sha1Key; + $_SESSION['admin_email'] = $admin_email; + $_SESSION['amount'] =$_POST['PayAmount'] ; + $_SESSION['PayOrderId'] =$_POST['PayOrderId']; + $_SESSION['fullname'] =$_POST['fullname']; + $_SESSION['email'] =$_POST['email']; + $revertURL = 'http://'.$_SERVER[HTTP_HOST].dirname($_SERVER[PHP_SELF]).'/back.php'; + + $client = new SoapClient('https://ikc.shaparak.ir/XToken/Tokens.xml', array('soap_version' => SOAP_1_1)); + + $params['amount'] = $_SESSION['amount']; + $params['merchantId'] = $MerchantId; + $params['invoiceNo'] = $_POST['PayOrderId']; + $params['paymentId'] = $_POST['PayOrderId']; + $params['specialPaymentId'] = $_POST['PayOrderId']; + $params['revertURL'] = $revertURL; + $params['description'] = ""; + $result = $client->__soapCall("MakeToken", array($params)); + $_SESSION['token'] = $result->MakeTokenResult->token; + $data['token'] = $_SESSION['token']; + $data['merchantId'] = $_SESSION['merchantId']; + redirect_post('https://ikc.shaparak.ir/TPayment/Payment/index',$data); + } + else + { + $Err .='نام را وارد کنید
'; + } + }else + { + $Err .='مبلغ صحیح نیست
'; + } + +} +function redirect_post($url, array $data) +{ + + echo ' + + در حال اتصال ... + + + + + '; + echo '
'; + + if ( !is_null($data) ) { + foreach ($data as $k => $v) { + echo ' '; + } + } + + echo'
+

درحال اتصال به درگاه بانک

+ + '; + + exit; +} +?> + + + + + پرداخت ساده ایرانکیش + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+ + نام پرداخت کننده
+ + شماره سفارش
+ +  ریال + مبلغ
ایمیل
+ + +  
+
+
+ www.softiran.org +
+ + + + + + + + + + + +