From 6e38a88ca6bd7ea7530483c229a555537e954d5c Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Sun, 3 Sep 2023 05:48:02 +0000 Subject: [PATCH] Apply fixes from StyleCI --- src/Contracts/Gateway.php | 76 +++++----- src/Exceptions/LyraErrorCode.php | 9 +- src/Exceptions/LyraException.php | 38 ++--- src/Gateways/Payir.php | 230 +++++++++++++++---------------- src/Gateways/Zarinpal.php | 222 ++++++++++++++--------------- src/LyraService.php | 98 ++++++------- 6 files changed, 340 insertions(+), 333 deletions(-) diff --git a/src/Contracts/Gateway.php b/src/Contracts/Gateway.php index 3d8d310..b184e82 100644 --- a/src/Contracts/Gateway.php +++ b/src/Contracts/Gateway.php @@ -2,51 +2,51 @@ namespace Hans\Lyra\Contracts; - use GuzzleHttp\Client; - - abstract class Gateway - { - protected readonly array $settings; - protected readonly Client $client; - protected readonly string $mode; - - public function __construct( - protected readonly int $amount, - string $mode = null - ) { - $this->settings = lyra_config('gateways.'.static::class); - $this->client = new Client(['http_errors' => false]); - if ($mode and key_exists($mode, $this->settings['modes'])) { - $this->mode = $mode; - } else { - $this->mode = $this->settings['mode'] ?? 'normal'; - } +use GuzzleHttp\Client; + +abstract class Gateway +{ + protected readonly array $settings; + protected readonly Client $client; + protected readonly string $mode; + + public function __construct( + protected readonly int $amount, + string $mode = null + ) { + $this->settings = lyra_config('gateways.'.static::class); + $this->client = new Client(['http_errors' => false]); + if ($mode and key_exists($mode, $this->settings['modes'])) { + $this->mode = $mode; + } else { + $this->mode = $this->settings['mode'] ?? 'normal'; } + } - abstract public function request(): string; - - abstract public function pay(string $token): string; + abstract public function request(): string; - abstract public function verify(): bool; + abstract public function pay(string $token): string; - abstract public function errorsList(): array; + abstract public function verify(): bool; - protected function apis(): array - { - return $this->settings['modes'][$this->mode] ?? []; - } + abstract public function errorsList(): array; - public function isSandboxEnabled(): bool - { - return $this->mode == 'sandbox'; - } + protected function apis(): array + { + return $this->settings['modes'][$this->mode] ?? []; + } - protected function translateError(int $code, string $default = 'Failed to process the request!'): string - { - if (key_exists($code, $this->errorsList())) { - return $this->errorsList()[$code]; - } + public function isSandboxEnabled(): bool + { + return $this->mode == 'sandbox'; + } - return $default; + protected function translateError(int $code, string $default = 'Failed to process the request!'): string + { + if (key_exists($code, $this->errorsList())) { + return $this->errorsList()[$code]; } + + return $default; } +} diff --git a/src/Exceptions/LyraErrorCode.php b/src/Exceptions/LyraErrorCode.php index 04345b2..aeb3278 100644 --- a/src/Exceptions/LyraErrorCode.php +++ b/src/Exceptions/LyraErrorCode.php @@ -1,7 +1,8 @@ errorCode = $errorCode; - } + public function __construct(string $message, int|string $errorCode, int $responseCode = 500, Throwable $previous = null) + { + parent::__construct($message, $responseCode, $previous); + $this->errorCode = $errorCode; + } - public static function make( string $message, int|string $errorCode, int $responseCode = 500, Throwable $previous = null ):self { - return new self( $message,$errorCode, $responseCode, $previous ); - } + public static function make(string $message, int|string $errorCode, int $responseCode = 500, Throwable $previous = null): self + { + return new self($message, $errorCode, $responseCode, $previous); + } - public function getErrorCode(): int|string - { - return $this->errorCode; - } - } \ No newline at end of file + public function getErrorCode(): int|string + { + return $this->errorCode; + } + } diff --git a/src/Gateways/Payir.php b/src/Gateways/Payir.php index 51df978..3d0a1f8 100644 --- a/src/Gateways/Payir.php +++ b/src/Gateways/Payir.php @@ -2,130 +2,130 @@ namespace Hans\Lyra\Gateways; - use Hans\Lyra\Contracts\Gateway; +use Hans\Lyra\Contracts\Gateway; - class Payir extends Gateway +class Payir extends Gateway +{ + public function request(): string { - public function request(): string - { - $data = array_diff_key( - $this->settings, - array_flip(['mode', 'modes']) - ); - $data['amount'] = $this->amount; - $data = array_filter($data, fn ($item) => !empty($item)); - - if ($this->isSandboxEnabled()) { - $data['api'] = 'test'; - } - - $response = $this->client->post( - $this->apis()['purchase'], - [ - 'json' => $data, - 'headers' => [ - 'Content-Type' => 'application/json', - ], - ] - ) - ->getBody() - ->getContents(); - $result = json_decode($response, true); - - if ($result['status'] == 1) { - return $result['token']; - } - - throw new \Exception($this->translateError($result['errorCode'])); + $data = array_diff_key( + $this->settings, + array_flip(['mode', 'modes']) + ); + $data['amount'] = $this->amount; + $data = array_filter($data, fn ($item) => !empty($item)); + + if ($this->isSandboxEnabled()) { + $data['api'] = 'test'; } - public function pay(string $token): string - { - return str_replace( - ':token', - $token, - $this->apis()['payment'] - ); + $response = $this->client->post( + $this->apis()['purchase'], + [ + 'json' => $data, + 'headers' => [ + 'Content-Type' => 'application/json', + ], + ] + ) + ->getBody() + ->getContents(); + $result = json_decode($response, true); + + if ($result['status'] == 1) { + return $result['token']; } - public function verify(): bool - { - $status = request('status'); - $token = request('token'); - - if ($status != 1) { - // User canceled the purchase - return false; - } - - if ($this->isSandboxEnabled()) { - return true; - } - - // TODO: Compare $token with stored token on pay stage - - $data = [ - 'api' => $this->settings['api'], - 'token' => $token, - ]; - - $response = $this->client->post( - $this->apis()['verification'], - [ - 'json' => $data, - 'headers' => [ - 'Accept' => 'application/json', - ], - ] - ) - ->getBody() - ->getContents(); - $result = json_decode($response, true); - - if ($result['status'] !== 1) { - return false; - } - - // TransactionIdReceived - - // TODO: If transId exists on DB, throw an error: -6 - // TODO: Store transId on DB + throw new \Exception($this->translateError($result['errorCode'])); + } + + public function pay(string $token): string + { + return str_replace( + ':token', + $token, + $this->apis()['payment'] + ); + } + + public function verify(): bool + { + $status = request('status'); + $token = request('token'); + + if ($status != 1) { + // User canceled the purchase + return false; + } + if ($this->isSandboxEnabled()) { return true; } - public function errorsList(): array - { - return [ - '0' => 'درحال حاضر درگاه بانکی قطع شده و مشکل بزودی برطرف می شود', - '-1' => 'API Key ارسال نمی شود', - '-2' => 'Token ارسال نمی شود', - '-3' => 'API Key ارسال شده اشتباه است', - '-4' => 'امکان انجام تراکنش برای این پذیرنده وجود ندارد', - '-5' => 'تراکنش با خطا مواجه شده است', - '-6' => 'تراکنش تکراریست یا قبلا انجام شده', - '-7' => 'مقدار Token ارسالی اشتباه است', - '-8' => 'شماره تراکنش ارسالی اشتباه است', - '-9' => 'زمان مجاز برای انجام تراکنش تمام شده', - '-10' => 'مبلغ تراکنش ارسال نمی شود', - '-11' => 'مبلغ تراکنش باید به صورت عددی و با کاراکترهای لاتین باشد', - '-12' => 'مبلغ تراکنش می بایست عددی بین 10,000 و 500,000,000 ریال باشد', - '-13' => 'مقدار آدرس بازگشتی ارسال نمی شود', - '-14' => 'آدرس بازگشتی ارسالی با آدرس درگاه ثبت شده در شبکه پرداخت پی یکسان نیست', - '-15' => 'امکان وریفای وجود ندارد. این تراکنش پرداخت نشده است', - '-16' => 'یک یا چند شماره موبایل از اطلاعات پذیرندگان ارسال شده اشتباه است', - '-17' => 'میزان سهم ارسالی باید بصورت عددی و بین 1 تا 100 باشد', - '-18' => 'فرمت پذیرندگان صحیح نمی باشد', - '-19' => 'هر پذیرنده فقط یک سهم میتواند داشته باشد', - '-20' => 'مجموع سهم پذیرنده ها باید 100 درصد باشد', - '-21' => 'Reseller ID ارسالی اشتباه است', - '-22' => 'فرمت یا طول مقادیر ارسالی به درگاه اشتباه است', - '-23' => 'سوییچ PSP ( درگاه بانک ) قادر به پردازش درخواست نیست. لطفا لحظاتی بعد مجددا تلاش کنید', - '-24' => 'شماره کارت باید بصورت 16 رقمی، لاتین و چسبیده بهم باشد', - '-25' => 'امکان استفاده از سرویس در کشور مبدا شما وجود نداره', - '-26' => 'امکان انجام تراکنش برای این درگاه وجود ندارد', - '-27' => 'در انتظار تایید درگاه توسط شاپرک', - '-28' => 'امکان تسهیم تراکنش برای این درگاه وجود ندارد', - ]; + // TODO: Compare $token with stored token on pay stage + + $data = [ + 'api' => $this->settings['api'], + 'token' => $token, + ]; + + $response = $this->client->post( + $this->apis()['verification'], + [ + 'json' => $data, + 'headers' => [ + 'Accept' => 'application/json', + ], + ] + ) + ->getBody() + ->getContents(); + $result = json_decode($response, true); + + if ($result['status'] !== 1) { + return false; } + + // TransactionIdReceived + + // TODO: If transId exists on DB, throw an error: -6 + // TODO: Store transId on DB + + return true; + } + + public function errorsList(): array + { + return [ + '0' => 'درحال حاضر درگاه بانکی قطع شده و مشکل بزودی برطرف می شود', + '-1' => 'API Key ارسال نمی شود', + '-2' => 'Token ارسال نمی شود', + '-3' => 'API Key ارسال شده اشتباه است', + '-4' => 'امکان انجام تراکنش برای این پذیرنده وجود ندارد', + '-5' => 'تراکنش با خطا مواجه شده است', + '-6' => 'تراکنش تکراریست یا قبلا انجام شده', + '-7' => 'مقدار Token ارسالی اشتباه است', + '-8' => 'شماره تراکنش ارسالی اشتباه است', + '-9' => 'زمان مجاز برای انجام تراکنش تمام شده', + '-10' => 'مبلغ تراکنش ارسال نمی شود', + '-11' => 'مبلغ تراکنش باید به صورت عددی و با کاراکترهای لاتین باشد', + '-12' => 'مبلغ تراکنش می بایست عددی بین 10,000 و 500,000,000 ریال باشد', + '-13' => 'مقدار آدرس بازگشتی ارسال نمی شود', + '-14' => 'آدرس بازگشتی ارسالی با آدرس درگاه ثبت شده در شبکه پرداخت پی یکسان نیست', + '-15' => 'امکان وریفای وجود ندارد. این تراکنش پرداخت نشده است', + '-16' => 'یک یا چند شماره موبایل از اطلاعات پذیرندگان ارسال شده اشتباه است', + '-17' => 'میزان سهم ارسالی باید بصورت عددی و بین 1 تا 100 باشد', + '-18' => 'فرمت پذیرندگان صحیح نمی باشد', + '-19' => 'هر پذیرنده فقط یک سهم میتواند داشته باشد', + '-20' => 'مجموع سهم پذیرنده ها باید 100 درصد باشد', + '-21' => 'Reseller ID ارسالی اشتباه است', + '-22' => 'فرمت یا طول مقادیر ارسالی به درگاه اشتباه است', + '-23' => 'سوییچ PSP ( درگاه بانک ) قادر به پردازش درخواست نیست. لطفا لحظاتی بعد مجددا تلاش کنید', + '-24' => 'شماره کارت باید بصورت 16 رقمی، لاتین و چسبیده بهم باشد', + '-25' => 'امکان استفاده از سرویس در کشور مبدا شما وجود نداره', + '-26' => 'امکان انجام تراکنش برای این درگاه وجود ندارد', + '-27' => 'در انتظار تایید درگاه توسط شاپرک', + '-28' => 'امکان تسهیم تراکنش برای این درگاه وجود ندارد', + ]; } +} diff --git a/src/Gateways/Zarinpal.php b/src/Gateways/Zarinpal.php index 913a322..93d119e 100644 --- a/src/Gateways/Zarinpal.php +++ b/src/Gateways/Zarinpal.php @@ -2,126 +2,126 @@ namespace Hans\Lyra\Gateways; - use Exception; - use Hans\Lyra\Contracts\Gateway; +use Exception; +use Hans\Lyra\Contracts\Gateway; - class Zarinpal extends Gateway +class Zarinpal extends Gateway +{ + public function request(): string { - public function request(): string - { - $data = array_diff_key( - $this->settings, - array_flip(['mode', 'modes']) - ); - $data['amount'] = $this->amount; - if ($this->isSandboxEnabled()) { - $data['merchant_id'] = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'; - } - - $response = $this->client->post( - $this->apis()['purchase'], - [ - 'json' => $data, - 'headers' => [ - 'Content-Type' => 'application/json', - ], - ] - ) - ->getBody() - ->getContents(); - $result = json_decode($response, true); - if (empty($result['errors']) and $result['data']['code'] == 100) { - return $result['data']['authority']; - } - - throw new Exception($this->translateError($result['errors']['code'])); + $data = array_diff_key( + $this->settings, + array_flip(['mode', 'modes']) + ); + $data['amount'] = $this->amount; + if ($this->isSandboxEnabled()) { + $data['merchant_id'] = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'; } - public function pay(string $token): string - { - return str_replace( - ':authority', - $token, - $this->apis()['payment'] - ); + $response = $this->client->post( + $this->apis()['purchase'], + [ + 'json' => $data, + 'headers' => [ + 'Content-Type' => 'application/json', + ], + ] + ) + ->getBody() + ->getContents(); + $result = json_decode($response, true); + if (empty($result['errors']) and $result['data']['code'] == 100) { + return $result['data']['authority']; } - public function verify(): bool - { - $status = request('Status'); - $authority = request('Authority'); - - if ($status !== 'OK') { - // User canceled the purchase - return false; - } - - if ($this->isSandboxEnabled()) { - return true; - } - - // TODO: Compare authority with stored authority on DB - - $data = [ - 'merchant_id' => $this->settings['merchant_id'], - 'amount' => 1000, // TODO: fetch from DB - 'authority' => $authority, - ]; - - $response = $this->client->post( - $this->apis()['verification'], - [ - 'json' => $data, - 'headers' => [ - 'Accept' => 'application/json', - ], - ] - ) - ->getBody() - ->getContents(); - $result = json_decode($response, true); - - if (!empty($result['errors'])) { - return false; - } - - if ($result['data']['code'] == 101) { - throw new Exception($this->translateError(101)); - } - - // TODO: Store ref_id on DB + throw new Exception($this->translateError($result['errors']['code'])); + } + + public function pay(string $token): string + { + return str_replace( + ':authority', + $token, + $this->apis()['payment'] + ); + } + + public function verify(): bool + { + $status = request('Status'); + $authority = request('Authority'); + + if ($status !== 'OK') { + // User canceled the purchase + return false; + } + if ($this->isSandboxEnabled()) { return true; } - public function errorsList(): array - { - return [ - '-9' => 'خطای اعتبار سنجی', - '-10' => 'ای پی و يا مرچنت كد پذيرنده صحيح نمی باشد.', - '-11' => 'مرچنت کد فعال نیست لطفا با تیم پشتیبانی ما تماس بگیرید.', - '-12' => 'تلاش بیش از حد در یک بازه زمانی کوتاه', - '-15' => 'درگاه پرداخت به حالت تعلیق در آمده است، پذیرنده مشکل خود را به امور مشتریان زرین‌پال ارجاع دهد.', - '-16' => 'سطح تاييد پذيرنده پايين تر از سطح نقره ای می باشد.', - '-17' => 'محدودیت پذیرنده در سطح آبی', - '100' => 'تراکنش با موفقیت انجام گردید.', - '-30' => 'اجازه دسترسی به تسویه اشتراکی شناور ندارید.', - '-31' => 'حساب بانکی تسویه را به پنل اضافه کنید. مقادیر وارد شده برای تسهیم درست نیست. پذیرنده جهت استفاده از خدمات سرویس تسویه اشتراکی شناور، باید حساب بانکی معتبری به پنل کاربری خود اضافه نماید.', - '-32' => 'مبلغ وارد شده از مبلغ کل تراکنش بیشتر است.', - '-33' => 'درصد های وارد شده صحيح نمی باشد.', - '-34' => 'مبلغ از کل تراکنش بیشتر است.', - '-35' => 'تعداد افراد دریافت کننده تسهیم بیش از حد مجاز است.', - '-36' => 'حداقل مبلغ جهت تسهیم باید ۱۰۰۰۰ ریال باشد.', - '-37' => 'یک یا چند شماره شبای وارد شده برای تسهیم از سمت بانک غیر فعال است.', - '-38' => 'خطا٬عدم تعریف صحیح شبا٬لطفا دقایقی دیگر تلاش کنید.', - '-39' => 'خطایی رخ داده است به امور مشتریان زرین پال اطلاع دهید.', - '-40' => 'پارامترهای اضافی نامعتبر، expire_in معتبر نیست.', - '-50' => 'مبلغ پرداخت شده با مقدار مبلغ در وریفای متفاوت است.', - '-51' => 'پرداخت ناموفق', - '-52' => 'خطای غیر منتظره‌ای رخ داده است. پذیرنده مشکل خود را به امور مشتریان زرین‌پال ارجاع دهد.', - '-53' => 'پرداخت متعلق به این مرچنت کد نیست.', - '-54' => 'اتوریتی نامعتبر است.', - '101' => 'عمليات پرداخت موفق بوده و قبلا عملیات وریفای تراكنش انجام شده است.', - ]; + // TODO: Compare authority with stored authority on DB + + $data = [ + 'merchant_id' => $this->settings['merchant_id'], + 'amount' => 1000, // TODO: fetch from DB + 'authority' => $authority, + ]; + + $response = $this->client->post( + $this->apis()['verification'], + [ + 'json' => $data, + 'headers' => [ + 'Accept' => 'application/json', + ], + ] + ) + ->getBody() + ->getContents(); + $result = json_decode($response, true); + + if (!empty($result['errors'])) { + return false; } + + if ($result['data']['code'] == 101) { + throw new Exception($this->translateError(101)); + } + + // TODO: Store ref_id on DB + + return true; + } + + public function errorsList(): array + { + return [ + '-9' => 'خطای اعتبار سنجی', + '-10' => 'ای پی و يا مرچنت كد پذيرنده صحيح نمی باشد.', + '-11' => 'مرچنت کد فعال نیست لطفا با تیم پشتیبانی ما تماس بگیرید.', + '-12' => 'تلاش بیش از حد در یک بازه زمانی کوتاه', + '-15' => 'درگاه پرداخت به حالت تعلیق در آمده است، پذیرنده مشکل خود را به امور مشتریان زرین‌پال ارجاع دهد.', + '-16' => 'سطح تاييد پذيرنده پايين تر از سطح نقره ای می باشد.', + '-17' => 'محدودیت پذیرنده در سطح آبی', + '100' => 'تراکنش با موفقیت انجام گردید.', + '-30' => 'اجازه دسترسی به تسویه اشتراکی شناور ندارید.', + '-31' => 'حساب بانکی تسویه را به پنل اضافه کنید. مقادیر وارد شده برای تسهیم درست نیست. پذیرنده جهت استفاده از خدمات سرویس تسویه اشتراکی شناور، باید حساب بانکی معتبری به پنل کاربری خود اضافه نماید.', + '-32' => 'مبلغ وارد شده از مبلغ کل تراکنش بیشتر است.', + '-33' => 'درصد های وارد شده صحيح نمی باشد.', + '-34' => 'مبلغ از کل تراکنش بیشتر است.', + '-35' => 'تعداد افراد دریافت کننده تسهیم بیش از حد مجاز است.', + '-36' => 'حداقل مبلغ جهت تسهیم باید ۱۰۰۰۰ ریال باشد.', + '-37' => 'یک یا چند شماره شبای وارد شده برای تسهیم از سمت بانک غیر فعال است.', + '-38' => 'خطا٬عدم تعریف صحیح شبا٬لطفا دقایقی دیگر تلاش کنید.', + '-39' => 'خطایی رخ داده است به امور مشتریان زرین پال اطلاع دهید.', + '-40' => 'پارامترهای اضافی نامعتبر، expire_in معتبر نیست.', + '-50' => 'مبلغ پرداخت شده با مقدار مبلغ در وریفای متفاوت است.', + '-51' => 'پرداخت ناموفق', + '-52' => 'خطای غیر منتظره‌ای رخ داده است. پذیرنده مشکل خود را به امور مشتریان زرین‌پال ارجاع دهد.', + '-53' => 'پرداخت متعلق به این مرچنت کد نیست.', + '-54' => 'اتوریتی نامعتبر است.', + '101' => 'عمليات پرداخت موفق بوده و قبلا عملیات وریفای تراكنش انجام شده است.', + ]; } +} diff --git a/src/LyraService.php b/src/LyraService.php index dbf2a04..5770069 100644 --- a/src/LyraService.php +++ b/src/LyraService.php @@ -1,49 +1,53 @@ gateway = $defaultGateway; - $this->invoice = new Invoice(); - } - - public function pay(): self { - $token = $this->gateway->request(); - $this->invoice->token = $token; - $this->gatewayRedirectUrl = $this->gateway->pay( $token ); - - return $this; - } - - public function getRedirectUrl(): string { - return $this->gatewayRedirectUrl; - } - - public function redirect(): RedirectResponse { - return redirect()->away( $this->gatewayRedirectUrl ); - } - - public function __destruct() { - $this->invoice->save(); - } - - } \ No newline at end of file +namespace Hans\Lyra; + + use Hans\Lyra\Contracts\Gateway; + use Hans\Lyra\Exceptions\LyraErrorCode; + use Hans\Lyra\Exceptions\LyraException; + use Hans\Lyra\Models\Invoice; + use Illuminate\Http\RedirectResponse; + + class LyraService + { + private Gateway $gateway; + private Invoice $invoice; + private string $gatewayRedirectUrl; + + public function __construct() + { + throw_unless( + $defaultGateway = lyra_config('default', false) and class_exists($defaultGateway), + LyraException::make( + 'Default gateway class is not set!', + LyraErrorCode::DEFAULT_GATEWAY_NOT_FOUNT + ) + ); + $this->gateway = $defaultGateway; + $this->invoice = new Invoice(); + } + + public function pay(): self + { + $token = $this->gateway->request(); + $this->invoice->token = $token; + $this->gatewayRedirectUrl = $this->gateway->pay($token); + + return $this; + } + + public function getRedirectUrl(): string + { + return $this->gatewayRedirectUrl; + } + + public function redirect(): RedirectResponse + { + return redirect()->away($this->gatewayRedirectUrl); + } + + public function __destruct() + { + $this->invoice->save(); + } + }