commit 3521dca830f23ff90488793e5c6138050c515055 Author: Aditya Prima Date: Fri Sep 13 18:08:33 2024 +0700 Initial Commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..06b2c95 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/vendor +/.idea +/.DS_Store diff --git a/.phpunit.result.cache b/.phpunit.result.cache new file mode 100644 index 0000000..2f207f7 --- /dev/null +++ b/.phpunit.result.cache @@ -0,0 +1 @@ +{"version":1,"defects":{"Tests\\Unit\\AuthorizeDotNetPayTest::charge_amount_returns_amount_in_usd_if_currency_is_not_supported":4,"Tests\\Unit\\AuthorizeDotNetPayTest::view_returns_view_with_correct_data":4,"Xgenious\\Paymentgateway\\Tests\\Features\\ZitoPayTest::testChargeAmount":3,"Xgenious\\Paymentgateway\\Tests\\Features\\ZitoPayTest::testIpnResponseSuccess":3,"Xgenious\\Paymentgateway\\Tests\\Features\\ZitoPayTest::testChargeCustomer":4,"Xgenious\\Paymentgateway\\Tests\\Gateways\\ZitoPayTest::test_charge_amount_converts_to_usd_if_not_supported_currency":3,"Xgenious\\Paymentgateway\\Tests\\Gateways\\ZitoPayTest::test_ipn_response_returns_complete_if_transaction_is_successful":4},"times":{"Tests\\Unit\\AuthorizeDotNetPayTest::charge_amount_returns_amount_in_usd_if_currency_is_not_supported":0.003,"Tests\\Unit\\AuthorizeDotNetPayTest::charge_amount_returns_amount_if_currency_is_supported":0,"Tests\\Unit\\AuthorizeDotNetPayTest::view_returns_view_with_correct_data":0.001,"Xgenious\\Paymentgateway\\Tests\\Features\\ZitoPayTest::testGetUsername":0.051,"Xgenious\\Paymentgateway\\Tests\\Features\\ZitoPayTest::testChargeAmount":0.009,"Xgenious\\Paymentgateway\\Tests\\Features\\ZitoPayTest::testIpnResponseSuccess":0.011,"Xgenious\\Paymentgateway\\Tests\\Features\\ZitoPayTest::testIpnResponseFailure":0.008,"Xgenious\\Paymentgateway\\Tests\\Features\\ZitoPayTest::testChargeCustomer":0.015,"Xgenious\\Paymentgateway\\Tests\\Features\\ZitoPayTest::testSupportedCurrencyList":0.008,"Xgenious\\Paymentgateway\\Tests\\Gateways\\ZitoPayTest::test_charge_amount_returns_correct_amount":0.053,"Xgenious\\Paymentgateway\\Tests\\Gateways\\ZitoPayTest::test_charge_amount_converts_to_usd_if_not_supported_currency":0.008,"Xgenious\\Paymentgateway\\Tests\\Gateways\\ZitoPayTest::test_supported_currency_list_returns_array":0.008,"Xgenious\\Paymentgateway\\Tests\\Gateways\\ZitoPayTest::test_gateway_name_returns_zitopay":0.008,"Xgenious\\Paymentgateway\\Tests\\Gateways\\ZitoPayTest::test_ipn_response_returns_complete_if_transaction_is_successful":0.011,"Xgenious\\Paymentgateway\\Tests\\Gateways\\ZitoPayTest::test_ipn_response_returns_failed_if_transaction_is_not_successful":0.01}} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..ebc1113 --- /dev/null +++ b/README.md @@ -0,0 +1,2048 @@ +# paymentgateway + +> General information about this package. +## Installation For laravel 9x + +##### Configure Your Composer.json file to install this package +add below code to your ``composer.json`` file + +````shell + "repositories": [ + { + "type": "vcs", + "url": "https://github.com/Sharifur/paymentgateway.git" + } + ], +```` + +run below command to install this package from your command promt or terminal +````shell +composer require xgenious/paymentgateway +```` + +if this payment package asked you for username and password here is it or generate your own token. +```apacheconf + +``` + + +Information about the installation procedure for this package. +> use Version 3.x for laravel 9 +> all payment gateway is now support v2/v3 + +## Supported Payment Gateway List + +1. Paytm +2. PayPal +3. Stripe +4. Midtrans +5. Razorpay +6. Mollie +7. FlutterwaveRave +8. Paystack +9. Payfast +10. Cashfree +11. Instamojo +12. Mercado pago +13. Squareup +14. Cinetpay +15. PayTabs +16. BillPlz +17. Zitopay +18. Toyyibpay +19. Pagali +20. Autorize.Net +21. SitesWay +22. TransactionCloud +23. WiPay +24. KineticPay +25. Senangpay +26. SaltPay +27. Iyzipay +28. Paymob +29. PowertranzPay +* PayU (upcoming) +* PerfectMoney (upcoming) +* payumoney (upcoming) +* Paytr (upcoming) +* Pagseguro (upcoming) + + +## 2.0 Setup For Paytm +route and middleware code will be same as version ^1.0, version ^2.0 will change only customer_charge and ipn_response method + +#### charge_customer method example +```php + +$paytm = XgPaymentGateway::paytm(); +$paytm->setMerchantId('Digita57697814558795'); +$paytm->setMerchantKey('dv0XtmsPYpewNag&'); +$paytm->setMerchantWebsite('WEBSTAGING'); +$paytm->setChannel('WEB'); +$paytm->setIndustryType('Retail'); +$paytm->setCurrency("EUR"); +$paytm->setEnv(true); // this must be type of boolean , string will not work +$paytm->setExchangeRate(74); // if INR not set as currency + +$response = $paytm->charge_customer([ + 'amount' => 10, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('payment.paytm.ipn'), //get route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rhamna', + 'payment_type' => 'order', +]); +return $response; +``` +#### ipn_response method example + +```php +$paytm = XgPaymentGateway::paytm(); +$paytm->setMerchantId('Digita57697814558795'); +$paytm->setMerchantKey('dv0XtmsPYpewNag&'); +$paytm->setMerchantWebsite('WEBSTAGING'); +$paytm->setChannel('WEB'); +$paytm->setIndustryType('Retail'); +$paytm->setEnv(true); //env must set as boolean, string will not work +dd($paytm->ipn_response()); + +``` + + + +## CinetPay + +[Checkout CinetPay Setup Documentation](https://xgenious.com/docs/nexelit/payment-gateway-settings/cinetpay/) + + +#### Paytm ipn route example +````php +Route::post('/cinetpay-ipn', [\App\Http\Controllers\PaymentLogController::class,'cinetpay_ipn'] )->name('payment.cinetpay.ipn'); +```` +you must have to excluded cinetpay ipn route from csrf token verify, go to `app/Http/Middleware` ``VerifyCsrfToken`` Middleware add your route path here in ``$except`` array + +````php +namespace App\Http\Middleware; + +use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; + +class VerifyCsrfToken extends Middleware +{ + /** + * The URIs that should be excluded from CSRF verification. + * + * @var array + */ + protected $except = [ + 'cinetpay-ipn' + ]; +} +```` + + +## 2.0 Setup For Cinetpay +Cinetpay payment gateway is only supported in version > v2.x + +#### charge_customer method example +```php +$cinetpay = XgPaymentGateway::cinetpay(); +$cinetpay->setAppKey('LE9C12TNM5HAS'); +$cinetpay->setSiteId('EAAAEOuLQObrVwJvCvoio3H13b8Ssqz1ighmTBKZvIENW9qxirHGHkqsGcPBC1uN'); +$cinetpay->setCurrency("USD"); +$cinetpay->setEnv(true); +$cinetpay->setExchangeRate(74); // if ['XOF', 'XAF', 'CDF', 'GNF', 'USD'] not set as currency + +$response = $paytm->charge_customer([ + 'amount' => 10, // minimum 100 amount is required to process payment if usd not set as currency + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('payment.cinetpay.ipn'), //get route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rhamna', + 'payment_type' => 'order', +]); +return $response; +``` +#### ipn_response method example + +```php +$cinetpay = XgPaymentGateway::cinetpay(); +$cinetpay->setAppKey('LE9C12TNM5HAS'); +$cinetpay->setSiteId('EAAAEOuLQObrVwJvCvoio3H13b8Ssqz1ighmTBKZvIENW9qxirHGHkqsGcPBC1uN'); +$cinetpay->setEnv(true); //env must set as boolean, string will not work +dd($cinetpay->ipn_response()); + +``` + + +#### CinetPay test credentials +```apacheconf +apiKey = "12912847765bc0db748fdd44.40081707"; +site_id = "445160"; +``` + + + +## 2.0 Setup For Paypal +route and middleware code will be same as version ^1.0, version ^2.0 will change only customer_charge and ipn_response method + +#### charge_customer method example +```php + +$paypal = XgPaymentGateway::paypal(); +$paypal->setClientId('client_id'); // provide sandbox id if payment env set to true, otherwise provide live credentials +$paypal->setClientSecret('client_secret'); // provide sandbox id if payment env set to true, otherwise provide live credentials +$paypal->setAppId('app_id'); // provide sandbox id if payment env set to true, otherwise provide live credentials +$paypal->setCurrency("EUR"); +$paypal->setEnv(true); //env must set as boolean, string will not work +$paypal->setExchangeRate(74); // if INR not set as currency + +$response = $paypal->charge_customer([ + 'amount' => 10, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('payment.instamojo.ipn'), //get route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rhamna', + 'payment_type' => 'order', +]); +return $response; +``` +#### ipn_response method example + +```php +$paypal = XgPaymentGateway::paypal(); +$paypal->setClientId('AUP7AuZMwJbkee-2OmsSZrU-ID1XUJYE-YB-2JOrxeKV-q9ZJZYmsr-UoKuJn4kwyCv5ak26lrZyb-gb'); +$paypal->setClientSecret('EEIxCuVnbgING9EyzcF2q-gpacLneVbngQtJ1mbx-42Lbq-6Uf6PEjgzF7HEayNsI4IFmB9_CZkECc3y'); +$paypal->setEnv(true); //env must set as boolean, string will not work +$paypal->setAppId('641651651958'); +dd($paypal->ipn_response()); + +``` + + + +## 2.0 Setup For Stripe +route and middleware code will be same as version ^1.0, version ^2.0 will change only customer_charge and ipn_response method + +#### charge_customer method example +```php +$stripe = XgPaymentGateway::stripe(); +$stripe->setSecretKey('sk_test_51GwS1SEmGOuJLTMs2vhSliTwAGkOt4fKJMBrxzTXeCJoLrRu8HFf4I0C5QuyE3l3bQHBJm3c0qFmeVjd0V9nFb6Z00VrWDJ9Uw'); +$stripe->setPublicKey('pk_test_51GwS1SEmGOuJLTMsIeYKFtfAT3o3Fc6IOC7wyFmmxA2FIFQ3ZigJ2z1s4ZOweKQKlhaQr1blTH9y6HR2PMjtq1Rx00vqE8LO0x'); +$stripe->setCurrency("EUR"); +$stripe->setEnv(true); //env must set as boolean, string will not work +$stripe->setExchangeRate(74); // if INR not set as currency + +$response = $stripe->charge_customer([ + 'amount' => 10, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('payment.instamojo.ipn'), //get route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rhamna', + 'payment_type' => 'order', +]); +return $response; +``` +#### ipn_response method example + +```php +$stripe = XgPaymentGateway::stripe(); +$stripe->setSecretKey('sk_test_51GwS1SEmGOuJLTMs2vhSliTwAGkOt4fKJMBrxzTXeCJoLrRu8HFf4I0C5QuyE3l3bQHBJm3c0qFmeVjd0V9nFb6Z00VrWDJ9Uw'); +$stripe->setPublicKey('pk_test_51GwS1SEmGOuJLTMsIeYKFtfAT3o3Fc6IOC7wyFmmxA2FIFQ3ZigJ2z1s4ZOweKQKlhaQr1blTH9y6HR2PMjtq1Rx00vqE8LO0x'); +$stripe->setEnv(true); //env must set as boolean, string will not work +dd($stripe->ipn_response()); + +``` + +## 2.0 Setup For Midtrans +route and middleware code will be same as version ^1.0, version ^2.0 will change only customer_charge and ipn_response method + +#### charge_customer method example +```php +$midtrans = XgPaymentGateway::midtrans(); +$midtrans->setClientKey('SB-Mid-client-iDuy-jKdZHkLjL_I'); +$midtrans->setServerKey('SB-Mid-server-9z5jztsHyYxEdSs7DgkNg2on'); +$midtrans->setCurrency("IDR"); +$midtrans->setEnv(true); //true mean sandbox mode , false means live mode +$midtrans->setExchangeRate(74); // if IDR not set as currency + +$response = $midtrans->charge_customer([ + 'amount' => 10, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('payment.instamojo.ipn'), //get route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rhamna', + 'payment_type' => 'order', +]); +return $response; +``` +#### ipn_response method example + +```php +$midtrans->setClientKey('client_key'); +$midtrans->setServerKey('server_key'); +$midtrans->setEnv(true); //true mean sandbox mode , false means live mode +dd($midtrans->ipn_response()); + +``` + + +#### Midtrans ipn route example +````php +Route::get('/midtrans-ipn', [\App\Http\Controllers\PaymentLogController::class,'midtrans_ipn'] )->name('payment.midtrans.ipn'); +```` + +#### Midtrans Test Cards +``` +VISA Description +4811 1111 1111 1114 3DS Enabled +4911 1111 1111 1113 3DS Enabled. Transaction Denied by Bank + +4411 1111 1111 1118 3DS Disabled +4511 1111 1111 1117 3DS Disabled. Challenged by Fraud Detection +4611 1111 1111 1116 3DS Disabled. Denied by Fraud Detection +4711 1111 1111 1115 3DS Disabled. Transaction Denied by Bank + +MASTERCARD Description +5211 1111 1111 1117 3DS Enabled +5111 1111 1111 1118 3DS Enabled. Transaction Denied by Bank + +5410 1111 1111 1116 3DS Disabled +5510 1111 1111 1115 3DS Disabled. Challenged by Fraud Detection +5411 1111 1111 1115 3DS Disabled. Denied by Fraud Detection +5511 1111 1111 1114 3DS Disabled. Transaction Denied by Bank +``` + +## 2.0 Setup For Razorpay +[Checkout Razorpay Setup Documentation](https://xgenious.com/docs/nexelit/payment-gateway-settings/razorpay/) +route and middleware code will be same as version ^1.0, version ^2.0 will change only customer_charge and ipn_response method + +#### charge_customer method example +```php + +$razorpay = XgPaymentGateway::razorpay(); +$razorpay->setApiKey('rzp_test_SXk7LZqsBPpAkj'); +$razorpay->setApiSecret('Nenvq0aYArtYBDOGgmMH7JNv'); +$razorpay->setCurrency("EUR"); +$razorpay->setEnv(true); //env must set as boolean, string will not work +$razorpay->setExchangeRate(74); // if INR not set as currency + +$response = $razorpay->charge_customer([ + 'amount' => 10, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('payment.instamojo.ipn'), //get route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rhamna', + 'payment_type' => 'order', +]); +return $response; +``` +#### ipn_response method example + +```php +$razorpay = XgPaymentGateway::razorpay(); +$razorpay->setApiKey('rzp_test_SXk7LZqsBPpAkj'); +$razorpay->setApiSecret('Nenvq0aYArtYBDOGgmMH7JNv'); +$razorpay->setEnv(true); //env must set as boolean, string will not work +dd($razorpay->ipn_response()); + +``` + + + + + + + +## 2.0 Setup For Mollie +[Checkout Mollie Setup Documentation](https://xgenious.com/docs/nexelit/payment-gateway-settings/mollie/) +route and middleware code will be same as version ^1.0, version ^2.0 will change only customer_charge and ipn_response method +#### Mollie ipn route example +````php +Route::get('/mollie-ipn', [\App\Http\Controllers\PaymentLogController::class,'mollie_ipn'] )->name('payment.razorpay.ipn'); +```` + +#### charge_customer method example +```php + +$mollie = XgPaymentGateway::mollie(); +$mollie->setApiKey('api_key'); +$mollie->setCurrency("EUR"); +$mollie->setEnv(true); //env must set as boolean, string will not work +$mollie->setExchangeRate(74); // if INR not set as currency + +$response = $mollie->charge_customer([ + 'amount' => 10, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('payment.mollie.ipn'), //get route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rhamna', + 'payment_type' => 'order', +]); +return $response; +``` +#### ipn_response method example + +```php +$mollie = XgPaymentGateway::mollie(); +$mollie->setApiKey('api_key'); +$mollie->setCurrency("EUR"); +$mollie->setEnv(true); //env must set as boolean, string will not work +$mollie->setExchangeRate(74); // if INR not set as currency +dd($mollie->ipn_response()); + +``` + + +## FlutterwaveRave + +[Checkout Flutterwave Setup Documentation](https://xgenious.com/docs/nexelit/payment-gateway-settings/flutterwave/) + +#### FlutterwaveRave ipn route example +````php +Route::get('/flutterwave-ipn', [\App\Http\Controllers\PaymentLogController::class,'flutterwave_ipn'] )->name('payment.flutterwave.ipn'); +```` + +###### Test Cards +````apacheconf +Test MasterCard PIN authentication + Card number: 5531 8866 5214 2950 + cvv: 564 + Expiry: 09/32 + Pin: 3310 + OTP: 12345 + +Card number: 4556052704172643 + cvv: 899 + Expiry: 09/32 + Pin: 3310 + OTP: 12345 + +```` + + + +## 2.0 Setup For Flutterwave +route and middleware code will be same as version ^1.0, version ^2.0 will change only customer_charge and ipn_response method + +#### charge_customer method example +```php + +$flutterwave = XgPaymentGateway::flutterwave(); +$flutterwave->setPublicKey('FLWPUBK_TEST-86cce2ec43c63e09a517290a8347fcab-X'); +$flutterwave->setSecretKey('FLWSECK_TEST-d37a42d8917db84f1b2f47c125252d0a-X'); +$flutterwave->setCurrency("USD"); +$flutterwave->setEnv(true); //env must set as boolean, string will not work +$flutterwave->setExchangeRate(74); // if NGN not set as currency + +$response = $flutterwave->charge_customer([ + 'amount' => 10, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('payment.instamojo.ipn'), //get route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rhamna', + 'payment_type' => 'order', +]); +return $response; +``` + +#### ipn_response method example + +```php +$flutterwave = XgPaymentGateway::flutterwave(); +$flutterwave->setPublicKey('FLWPUBK_TEST-86cce2ec43c63e09a517290a8347fcab-X'); +$flutterwave->setSecretKey('FLWSECK_TEST-d37a42d8917db84f1b2f47c125252d0a-X'); +$flutterwave->setCurrency("USD"); +$flutterwave->setEnv(true); //env must set as boolean, string will not work +dd($flutterwave->ipn_response()); + +``` + + + + +## Paystack + +[Checkout Paystack Setup Documentation](https://xgenious.com/docs/nexelit/payment-gateway-settings/paystack/) + +Here is Test Credentials For Paystack + +#### Paystack ipn route example +````php +Route::get('/paystack-ipn', [\App\Http\Controllers\PaymentLogController::class,'paystack_ipn'] )->name('payment.paystack.ipn'); +```` + +> Note: paystack does not support multiple ipn route, it supports only one webhook you can add in paystack dashboard. you can use $arg['payment_type'] data for check which kind of payment processed + + + +route and middleware code will be same as version ^1.0, version ^2.0 will change only customer_charge and ipn_response method + +#### charge_customer method example +```php + +$paystack = XgPaymentGateway::paystack(); +$paystack->setPublicKey('pk_test_a7e58f850adce9a73750e61668d4f492f67abcd9'); +$paystack->setSecretKey('sk_test_2a458001d806c878aba51955b962b3c8ed78f04b'); +$paystack->setMerchantEmail('sopnilsohan03@gmail.com'); +$paystack->setCurrency("EUR"); +$paystack->setEnv(true); //env must set as boolean, string will not work +$paystack->setExchangeRate(74); // if NGN not set as currency + +$response = $paystack->charge_customer([ + 'amount' => 10, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('payment.instamojo.ipn'), //get route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rhamna', + 'payment_type' => 'order', +]); +return $response; +``` +#### ipn_response method example + +```php +$paystack = XgPaymentGateway::paystack(); +$paystack->setPublicKey('pk_test_a7e58f850adce9a73750e61668d4f492f67abcd9'); +$paystack->setSecretKey('sk_test_2a458001d806c878aba51955b962b3c8ed78f04b'); +$paystack->setMerchantEmail('sopnilsohan03@gmail.com'); +$paystack->setEnv(true); //env must set as boolean, string will not work +dd($paystack->ipn_response()); + +``` + + + +## Payfast +[Checkout Payfast Setup Documentation](https://xgenious.com/docs/nexelit/payment-gateway-settings/payfast/) + +Here is Test Credentials For Payfast + + +#### Payfast ipn route example +````php +Route::post('/payfast-ipn', [\App\Http\Controllers\PaymentLogController::class,'payfast_ipn'] )->name('payment.payfast.ipn'); +```` +you must have to excluded Payfast ipn route from csrf token verify, go to `app/Http/Middleware` ``VerifyCsrfToken`` Middleware add your route path here in ``$except`` array + +````php +namespace App\Http\Middleware; + +use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; + +class VerifyCsrfToken extends Middleware +{ + /** + * The URIs that should be excluded from CSRF verification. + * + * @var array + */ + protected $except = [ + 'payfast-ipn' + ]; +} +```` +route and middleware code will be same as version ^1.0, version ^2.0 will change only customer_charge and ipn_response method + +#### charge_customer method example +```php + +$payfast = XgPaymentGateway::payfast(); +$payfast->setMerchantId('10024000'); +$payfast->setMerchantKey('77jcu5v4ufdod'); +$payfast->setPassphrase('testpayfastsohan'); +$payfast->setCurrency("ZAR"); +$payfast->setEnv(true); //env must set as boolean, string will not work +$payfast->setExchangeRate(74); // if INR not set as currency + +$response = $payfast->charge_customer([ + 'amount' => 10, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('payment.instamojo.ipn'), //get route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rhamna', + 'payment_type' => 'order', +]); +return $response; +``` +#### ipn_response method example + +```php +$payfast = XgPaymentGateway::payfast(); +$payfast->setMerchantId('10024000'); +$payfast->setMerchantKey('77jcu5v4ufdod'); +$payfast->setPassphrase('testpayfastsohan'); +$payfast->setCurrency("ZAR"); +$payfast->setEnv(true); //env must set as boolean, string will not work +dd($payfast->ipn_response()); + +``` + + + +## Cashfree +[Checkout Cashfree Setup Documentation](https://xgenious.com/docs/nexelit/payment-gateway-settings/cashfree/) + + +#### Cashfree ipn route example +````php +Route::post('/cashfree-ipn', [\App\Http\Controllers\PaymentLogController::class,'cashfree_ipn'] )->name('payment.cashfree.ipn'); +```` +you must have to excluded Cashfree ipn route from csrf token verify, go to `app/Http/Middleware` ``VerifyCsrfToken`` Middleware add your route path here in ``$except`` array + +````php +namespace App\Http\Middleware; + +use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; + +class VerifyCsrfToken extends Middleware +{ + /** + * The URIs that should be excluded from CSRF verification. + * + * @var array + */ + protected $except = [ + 'cashfree-ipn' + ]; +} +```` + +route and middleware code will be same as version ^1.0, version ^2.0 will change only customer_charge and ipn_response method + +#### charge_customer method example +```php +$cashfree = XgPaymentGateway::cashfree(); +$cashfree->setAppId('app_id'); +$cashfree->setSecretKey('secret_key'); +$cashfree->setCurrency("USD"); +$cashfree->setEnv(true); //true means sandbox, false means live , //env must set as boolean, string will not work +$cashfree->setExchangeRate(74); // if INR not set as currency + +$response = $cashfree->charge_customer([ + 'amount' => 10, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('payment.cashfree.ipn'), + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rhamna', + 'payment_type' => 'order', +]); +return $response; +``` +#### ipn_response method example + +```php +$cashfree = XgPaymentGateway::cashfree(); +$cashfree->setAppId('app_id'); +$cashfree->setSecretKey('secret_key'); +$cashfree->setEnv(true); //true means sandbox, false means live //env must set as boolean, string will not work +dd($cashfree->ipn_response()); + +``` + + +## Instamojo +[Checkout Instamojo Setup Documentation](https://xgenious.com/docs/nexelit/payment-gateway-settings/instamojo) + +>> Instamojo Pago only works with INR currency + +#### Instamojo ipn route example +````php +Route::get('/instamojo-ipn', [\App\Http\Controllers\PaymentLogController::class,'instamojo_ipn'] )->name('payment.instamojo.ipn'); +```` + +##### Test Credentials for Instamojo +```` +mobile number 919090213229 +For payments use the following card details: +Number: 4242 4242 4242 4242 +Date: Any valid future date +CVV: 111 +Name: abc +3D-secure password: 1221 +```` + +## 2.0 Setup For Instamojo +route and middleware code will be same as version ^1.0, version ^2.0 will change only customer_charge and ipn_response method + +#### charge_customer method example +```php +$instamojo = XgPaymentGateway::instamojo(); +$instamojo->setClientId('client_id'); +$instamojo->setSecretKey('secret_key'); +$instamojo->setCurrency("INR"); +$instamojo->setEnv(true); //true mean sandbox mode , false means live mode //env must set as boolean, string will not work +$instamojo->setExchangeRate(74); // if INR not set as currency + +$response = $instamojo->charge_customer([ + 'amount' => 10, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('payment.instamojo.ipn'), //get route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rhamna', + 'payment_type' => 'order', +]); +return $response; +``` +#### ipn_response method example + +```php +$instamojo = XgPaymentGateway::instamojo(); +$instamojo->setClientId('client_id'); +$instamojo->setSecretKey('secret_key'); +$instamojo->setEnv(true); //env must set as boolean, string will not work +dd($instamojo->ipn_response()); + +``` + + +## Mercadopago + +[Checkout Mercadopago Setup Documentation](https://xgenious.com/docs/nexelit/payment-gateway-settings/mercadopago/) + +>> Mercado Pago only works with BRL currency + +#### Mercado ipn route example +````php +Route::get('/mercadopago-ipn', [\App\Http\Controllers\PaymentLogController::class,'mercadopago_ipn'] )->name('payment.mercadopago.ipn'); +```` + +##### Test Credentials for Mercadopago +```` +For payments use the following card details: +Number: 5031 4332 1540 6351 +Date: 11/25 +CVV: 123 +Name: abc +```` + + +## 2.0 Setup For Instamojo +route and middleware code will be same as version ^1.0, version ^2.0, will change only customer_charge and ipn_response method + +#### charge_customer method example +```php +$mercadopago = XgPaymentGateway::mercadopago(); +$mercadopago->setClientId('client_id'); +$mercadopago->setClientSecret('client_secret'); +$mercadopago->setCurrency("USD"); +$mercadopago->setExchangeRate(82); // if BRL not set as currency, you must have to provide exchange rate for it +$mercadopago->setEnv(true); ////true mean sandbox mode , false means live mode +$response = $mercadopago->charge_customer([ + 'amount' => 10, + 'title' => 'this is test title', + 'description' => 'this is test description', + @@ -804,11 +804,11 @@ return $response; +#### ipn_response method example + +```php +$mercadopago = XgPaymentGateway::mercadopago(); +$mercadopago->setClientId('client_id'); +$mercadopago->setClientSecret('client_secret'); +$mercadopago->setEnv(true); +dd($mercadopago->ipn_response()); + +``` + +#### ipn_response method example + +```php +$mercadopago = XgPaymentGateway::mercadopago(); +$mercadopago->setClientId('client_id'); +$mercadopago->setClientSecret('client_secret'); +$mercadopago->setEnv(true); +dd($mercadopago->ipn_response()); + +``` + + +## Squareup + +[Checkout Squareup Setup Documentation](https://xgenious.com/docs/nexelit/payment-gateway-settings/how-to-get-square-payment-gateway-api-credentials/) + +Here is Test Credentials For Squareup + +>> Squareup supported currency list + +#### Squareup ipn route example +````php +Route::get('/Squareup-ipn', [\App\Http\Controllers\PaymentLogController::class,'Squareup_ipn'] )->name('payment.mercadopago.ipn'); +```` + +##### Api Credentials for Squareup +```apacheconf +access_token = 'EAAAEOuLQObrVwJvCvoio3H13b8Ssqz1ighmTBKZvIENW9qxirHGHkqsGcPBC1uN' +location_id = 'LE9C12TNM5HAS' +``` +##### Test Credentials for Squareup +```` +Mastercard 5105 1051 0510 5100 +CVC: 111 +Date: any future date + +Discover +6011 0000 0000 0004 +CVC: 111 +Date: any future date + +Diners Club 3000 000000 0004 +CVC: 111 +Date: any future date + + +JCB 3569 9900 1009 5841 +CVC: 111 +Date: any future date + +Name: Test +Email: test@gmail.com +```` + + +## 2.0 Setup For Squareup +#### charge_customer method example +```php +$squareup = XgPaymentGateway::squareup(); +$squareup->setLocationId('location_id'); +$squareup->setAccessToken('access_token'); +$squareup->setApplicationId(''); +$squareup->setCurrency("USD"); +$squareup->setEnv(true); +$squareup->setExchangeRate(74); // if INR not set as currency +$response = $squareup->charge_customer([ + 'amount' => 10, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('payment.get.ipn'), + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rhamna', + 'payment_type' => 'order', +]); + return $response; +``` +#### ipn_response method example + +```php +$squareup = XgPaymentGateway::squareup(); +$squareup->setLocationId('location_id'); +$squareup->setAccessToken('access_token'); +$squareup->setApplicationId(''); +$squareup->setCurrency("USD"); +$squareup->setEnv(true); +dd($squareup->ipn_response()); + +``` + + +## PayTabs + +[Checkout PayTabs Setup Documentation](https://xgenious.com/docs/nexelit/payment-gateway-settings/how-to-get-paytabs-payment-gateway-api-credentials/) + +Here is Test Credentials For PayTabs + +>> PayTabs supported currency list + +#### PayTabs ipn route example +````php +Route::post('/paytabs-ipn', [\App\Http\Controllers\PaymentLogController::class,'paytabs_ipn'] )->name('payment.mercadopago.ipn'); +```` + +#### Add This class to config/app.php (Its Mendatory) +````php +\Paytabscom\Laravel_paytabs\PaypageServiceProvider::class +```` + +##### Api Credentials for PayTabs +```phpregexp +[ +'currency' => 'USD', //['AED','EGP','SAR','OMR','JOD','USD'] +'profile_id' => '96698', +'region' => 'GLOBAL', // ['ARE','EGY','SAU','OMN','JOR','GLOBAL'] +'server_key' => 'SKJNDNRHM2-JDKTZDDH2N-H9HLMJNJ2L' +] +``` +##### Test Credentials for PayTabs +```` +Number Scheme CVV 3D enrolled + +4000000000000002 Visa 123 Yes +4111111111111111 Visa 123 No +4012001036983332 Visa 530 Yes +5498383801606532 MasterCard 977 Yes +5200000000000007 MasterCard 977 Yes +5200000000000114 MasterCard 977 No +```` + + +## 2.0 Setup For PayTabs +#### charge_customer method example +```php +$paytabs = XgPaymentGateway::paytabs(); +$paytabs->setProfileId('96698'); +$paytabs->setRegion('GLOBAL'); +$paytabs->setServerKey('SKJNDNRHM2-JDKTZDDH2N-H9HLMJNJ2L'); +$paytabs->setCurrency("USD"); +$paytabs->setEnv(true); +$paytabs->setExchangeRate(74); // if ['AED','EGP','SAR','OMR','JOD','USD'] not set as currency +$response = $paytabs->charge_customer([ + 'amount' => 10, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('payment.post.ipn'), + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rhamna', + 'payment_type' => 'order', +]); +return $response; +``` +#### ipn_response method example for PayTabs + +```php +$paytabs = XgPaymentGateway::paytabs(); +$paytabs->setProfileId('96698'); +$paytabs->setRegion('GLOBAL'); +$paytabs->setServerKey('SKJNDNRHM2-JDKTZDDH2N-H9HLMJNJ2L'); +$paytabs->setCurrency("USD"); +dd($paytabs->ipn_response()); + +``` + +## 2.0 Setup For BillPlz +[Checkout BillPlz Setup Documentation](https://xgenious.com/docs/nexelit/payment-gateway-settings/how-to-setup-api-for-billplz-payment-gateway/) + +>> Billplz supported currency list ['MYR] + + +#### Billplz ipn route example +````php +Route::post('/billplz-ipn', [\App\Http\Controllers\PaymentLogController::class,'billplz_ipn'] )->name('payment.billplz.ipn'); +```` + +##### Api Credentials for Billplz +```phpregexp +[ +'key' => 'b2ead199-e6f3-4420-ae5c-c94f1b1e8ed6', +'version' => 'v4', +'x_signature' => 'S-HDXHxRJB-J7rNtoktZkKJg', +'collection_name' => 'kjj5ya006' +] +``` + +#### charge_customer method example +```php +$billplz = XgPaymentGateway::billplz(); +$billplz->setKey('b2ead199-e6f3-4420-ae5c-c94f1b1e8ed6'); +$billplz->setVersion('v4'); +$billplz->setXsignature('S-HDXHxRJB-J7rNtoktZkKJg'); +$billplz->setCollectionName('kjj5ya006'); +$billplz->setCurrency("MYR"); +$billplz->setEnv(true); +$billplz->setExchangeRate(50); // if ['MYR'] not set as currency +$response = $billplz->charge_customer([ + 'amount' => 10, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('payment.post.ipn'), + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rhamna', + 'payment_type' => 'order', +]); +return $response; +``` +#### ipn_response method example for Billplz + +```php +$billplz = XgPaymentGateway::billplz(); +$billplz->setKey('b2ead199-e6f3-4420-ae5c-c94f1b1e8ed6'); +$billplz->setVersion('v4'); +$billplz->setXsignature('S-HDXHxRJB-J7rNtoktZkKJg'); +$billplz->setCollectionName('kjj5ya006'); +$billplz->setCurrency("MYR"); +$billplz->setEnv(true); +dd($billplz->ipn_response()); + +``` +## 2.0 Setup For Zitopay +[Checkout Zitopay Setup Documentation](https://xgenious.com/docs/nexelit/payment-gateway-settings/zitopay-payment-gateway-setup) + +>> Zitopay supported currency list [ +"USD", +"EUR", +"GBP", +"AED", +"AFN", +"ALL", +"AMD", +"ANG", +"AOA", +"ARS", +"AUD", +"AWG", +"AZN", +"BAM", +"BBD", +"BDT", +"BGN", +"BHD", +"BIF", +"BMD", +"BND", +"BOB", +"BRL", +"BSD", +"BTN", +"BWP", +"BYN", +"BZD", +"CAD", +"CDF", +"CHF", +"CLP", +"CNY", +"COP", +"CRC", +"CUP", +"CVE", +"CZK", +"DJF", +"DKK", +"DOP", +"DZD", +"EGP", +"ERN", +"ETB", +"FJD", +"GEL", +"GHS", +"GMD", +"GNF", +"GTQ", +"GYD", +"HNL", +"HRK", +"HTG", +"HUF", +"IDR", +"ILS", +"INR", +"IQD", +"IRR", +"ISK", +"JMD", +"JOD", +"JPY", +"KES", +"KGS", +"KHR", +"KMF", +"KPW", +"KRW", +"KWD", +"KZT", +"LAK", +"LBP", +"LKR", +"LRD", +"LSL", +"LTL", +"LVL", +"LYD", +"MAD", +"MDL", +"MGA", +"MKD", +"MMK", +"MNT", +"MRO", +"MUR", +"MVR", +"MWK", +"MXN", +"MYR", +"MZN", +"NAD", +"NGN", +"NIO", +"NOK", +"NPR", +"NZD", +"OMR", +"PAB", +"PEN", +"PGK", +"PHP", +"PKR", +"PLN", +"PYG", +"QAR", +"RON", +"RSD", +"RUB", +"RWF", +"SAR", +"SCR", +"SDG", +"SEK", +"SGD", +"SLL", +"SOS", +"SRD", +"STD", +"SVC", +"SYP", +"SZL", +"THB", +"TJS", +"TMT", +"TND", +"TOP", +"TRY", +"TTD", +"TWD", +"TZS", +"UAH", +"UGX", +"UYU", +"UZS", +"VEF", +"VND", +"VUV", +"WST", +"XCD", +"XOF", +"YER", +"ZAR", +"ZMW", +"ZWD", +"XAF", +] + +#### Zitopay ipn route example +````php +Route::post('/zitopay-ipn', [\App\Http\Controllers\PaymentLogController::class,'zitopay_ipn'] )->name('payment.zitopay.ipn'); //need to exclude from csrf token varification +```` +you must have to excluded Zitopay ipn route from csrf token verify, go to `app/Http/Middleware` ``VerifyCsrfToken`` Middleware add your route path here in ``$except`` array + +````php +namespace App\Http\Middleware; +use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; +class VerifyCsrfToken extends Middleware +{ + /** + * The URIs that should be excluded from CSRF verification. + * + * @var array + */ + protected $except = [ + 'zitopay-ipn' + ]; +} +```` + +#### charge_customer method example +```php +$zitopay = XgPaymentGateway::zitopay(); +$zitopay->setUsername('dvrobin4'); +$zitopay->setCurrency("USD"); +$zitopay->setEnv(true); +$zitopay->setExchangeRate(50); // if INR not set as currency +$args = [ + 'amount' => 250, + 'title' => 'this is test title', + 'description' => 'description', + 'ipn_url' => route('payment.post.ipn'), + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'email@mgil.com', + 'name' => 'sharifur', + 'payment_type' => 'order', +]; +$response = $zitopay->charge_customer($args); +return $response; +``` +#### ipn_response method example for Zitopay + +```php +$zitopay = XgPaymentGateway::zitopay(); +$zitopay->setUsername('dvrobin4'); +$zitopay->setCurrency("USD"); +$zitopay->setEnv(true); +$zitopay->setExchangeRate(50); // if INR not set as currency +dd($zitopay->ipn_response()); +``` + +## 3.0 Setup For Toyyibpay +[Checkout Toyyibpay Setup Documentation](https://docs.xgenious.com/docs/nexelit/payment-gateway-settings/toyyibpay-payment-gateway-setup) +```php +>> Toyyibpay supported currency list ["MYR"] +```` +#### Toyyibpay ipn route example +````php +Route::post('/toyyibpay-ipn', [\App\Http\Controllers\PaymentLogController::class,'toyyibpay_ipn'] )->name('payment.toyyibpay.ipn'); //need to exclude from csrf token varification +```` +you must have to excluded Toyyibpay ipn route from csrf token verify, go to `app/Http/Middleware` ``VerifyCsrfToken`` Middleware add your route path here in ``$except`` array + +````php +namespace App\Http\Middleware; +use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; +class VerifyCsrfToken extends Middleware +{ + /** + * The URIs that should be excluded from CSRF verification. + * + * @var array + */ + protected $except = [ + 'toyyibpay-ipn' + ]; +} +```` + +#### charge_customer method example +```php +$toyyibpay = XgPaymentGateway::toyyibpay(); +$toyyibpay->setUserSecretKey('wnbtrqle-9t9l-m02j-e2bz-iaj2tkp52sfo'); +$toyyibpay->setCategoryCode('0m0j9yc4'); +$toyyibpay->setEnv(true); +$toyyibpay->setCurrency("MYR"); +$toyyibpay->setExchangeRate(74); //only support MYR Currency +return $toyyibpay->charge_customer([ + 'amount' => 10, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('post.ipn'), //post route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rhamna', + 'payment_type' => 'order', + 'phone' => 12345678 +]); +``` +#### ipn_response method example for Toyyibpay + +```php +$toyyibpay = XgPaymentGateway::toyyibpay(); +$toyyibpay->setUserSecretKey('wnbtrqle-9t9l-m02j-e2bz-iaj2tkp52sfo'); +$toyyibpay->setCategoryCode('0m0j9yc4'); +$toyyibpay->setEnv(true); +$toyyibpay->ipn_response(); +``` + + + +## Setup For Pagali +[Checkout Pagali Setup Documentation](https://docs.xgenious.com/docs/nexelit/payment-gateway-settings/pagali-payment-gateway-setup) +```php +>> Pagali supported currency list ['MYR','USD','EUR','CVE'] +```` +#### Pagali ipn route example +````php +Route::post('/pagali-ipn', [\App\Http\Controllers\PaymentLogController::class,'pagali_ipn'] )->name('payment.pagali.ipn'); //need to exclude from csrf token varification +```` +you must have to excluded Pagali ipn route from csrf token verify, go to `app/Http/Middleware` ``VerifyCsrfToken`` Middleware add your route path here in ``$except`` array + +````php +namespace App\Http\Middleware; +use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; +class VerifyCsrfToken extends Middleware +{ + /** + * The URIs that should be excluded from CSRF verification. + * + * @var array + */ + protected $except = [ + 'pagali-ipn' + ]; +} +```` + +#### charge_customer method example +```php +$pagali = XgPaymentGateway::pagalipay(); +$pagali->setPageId(''); +$pagali->setEntityId(''); +$pagali->setCurrency("MYR"); +$pagali->setEnv(true); // this must be type of boolean , string will not work +$pagali->setExchangeRate(74); // if INR not set as currency + +$response = $pagali->charge_customer([ + 'amount' => 10, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('post.ipn'), //get route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rhamna', + 'payment_type' => 'order', +]); +``` +#### ipn_response method example for Pagali + +```php +$pagali = XgPaymentGateway::pagalipay(); +$pagali->setPageId(''); +$pagali->setEntityId(''); +$pagali->setCurrency("MYR"); +$pagali->setEnv(true); // this must be type of boolean , string will not work +dd($pagali->ipn_response()); +``` + + +## Setup For Authorize.Net +[Checkout Authorize.nnt Setup Documentation](https://docs.xgenious.com/docs/nexelit/payment-gateway-settings/authorize-payment-gateway-setup) +```php +>> Authorize.Net supported currency list ['AUD', 'CAD', 'CHF', 'DKK', 'EUR', 'GBP', 'JPY', 'NOK', 'NZD', 'SEK', 'USD', 'ZAR']; +```` +#### Authorize.Net ipn route example +````php +Route::get('/authorize-ipn', [\App\Http\Controllers\PaymentLogController::class,'authorize_ipn'] )->name('payment.authorize.ipn'); //need to exclude from csrf token varification +```` + +#### charge_customer method example +```php + +$authorize = XgPaymentGateway::authorizenet(); +$authorize->setMerchantLoginId('2e8yjNL89kV2'); +$authorize->setMerchantTransactionId('65968Gb3DU2ntX2v'); +$authorize->setCurrency("USD"); +$authorize->setEnv(true); // this must be type of boolean , string will not work +$authorize->setExchangeRate(74); // if INR not set as currency + +$response = $authorize->charge_customer([ + 'amount' => 10, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('get.ipn'), //get route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rhamna', + 'payment_type' => 'order', +]); +``` +#### ipn_response method example + +```php + $authorizenet = XgPaymentGateway::authorizenet(); + $authorizenet->setMerchantLoginId('2e8yjNL89kV2'); + $authorizenet->setMerchantTransactionId('65968Gb3DU2ntX2v'); + $authorizenet->setEnv(true); // this must be type of boolean , string will not work + dd($authorizenet->ipn_response()); +``` + +## Setup For SitesWay +no documentation available +```php +>> it support all currency +```` +#### SitesWay ipn route example +````php +Route::post('/siteways-ipn', [\App\Http\Controllers\PaymentLogController::class,'siteways_ipn'] )->name('payment.siteways.ipn'); //need to exclude from csrf token verification +```` +you must have to excluded SitesWay ipn route from csrf token verify, go to `app/Http/Middleware` ``VerifyCsrfToken`` Middleware add your route path here in ``$except`` array + +````php +namespace App\Http\Middleware; +use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; +class VerifyCsrfToken extends Middleware +{ + /** + * The URIs that should be excluded from CSRF verification. + * + * @var array + */ + protected $except = [ + 'siteways-ipn' + ]; +} +```` + +#### charge_customer method example +```php +$sitesway = XgPaymentGateway::sitesway(); + $sitesway->setBrandId("-enter-brand-id-"); + $sitesway->setApiKey("--enter-api-key--"); + $sitesway->setCurrency("USD"); + $sitesway->setEnv(true); // this must be type of boolean , string will not work + + + $response = $sitesway->charge_customer([ + 'amount' => 10, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('post.siteways.ipn'), //post route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rhamna', + 'payment_type' => 'order', + ]); + return $response; +``` +#### ipn_response method example for Siteways + +```php + $sitesway = XgPaymentGateway::sitesway(); + $sitesway->setBrandId("-enter-brand-id-"); + $sitesway->setApiKey("--enter-api-key--"); + $sitesway->setCurrency("USD"); + $payment_data = $sitesway->ipn_response(); +``` + + +## Setup For WiPay +```php +>> Wipay supported currency list ['JMD', 'TTD', 'USD'] +```` +#### Wipay ipn route example +````php +Route::get('/wipay-ipn', [\App\Http\Controllers\PaymentLogController::class,'wipay_ipn'] )->name('payment.wipay.ipn'); + +```` + +#### charge_customer method example +```php + $wipay = XgPaymentGateway::wipay(); + $wipay->setAccountNumber("1234567890"); + $wipay->setAccountApi("123"); + $wipay->setFeeStructure("customer_pay"); + $wipay->setCountryCode("TT"); + $wipay->setCurrency("USD"); + $wipay->setEnv(true); // this must be type of boolean , string will not work + $wipay->setExchangeRate(74); // if INR not set as currency + + $response = $wipay->charge_customer([ + 'amount' => 10.5, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('get.ipn'), //post route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rahman', + 'payment_type' => 'order', + ]); + return $response; +``` +#### ipn_response method example for WiPay + +```php + $wipay = XgPaymentGateway::wipay(); + $wipay->setAccountNumber("1234567890"); + $wipay->setAccountApi("123"); + $wipay->setFeeStructure("customer_pay"); + $wipay->setCountryCode("TT"); + $wipay->setCurrency("USD"); + $wipay->setEnv(true); // this must be type of boolean , string will not work + $wipay->setExchangeRate(74); // if INR not set as currency + $payment_data = $wipay->ipn_response(); + dd($payment_data); +``` + + + +## Setup For TransactionCloud +[Checkout TransactionCloud Setup Documentation](https://docs.xgenious.com/docs/nexelit/payment-gateway-settings/transaction-cloud-payment-gateway-setup) +```php +>> TransactionCloud supported currency list ['USD','EUR','PLN','INR','CAD','CNY','AUD','JPY','NOK','GBP','CHF','SGD','BRL','RUB','BGN','CZK','DKK','HUF','RON','SEK','GEL'] +```` +#### TransactionCloud ipn route example +````php +Route::get('/transactioncloud-ipn', [\App\Http\Controllers\PaymentLogController::class,'siteways_ipn'] )->name('payment.transactioncloud.ipn'); + +```` +please note, TransactionCloud send all the ipn response to one single route which need to configure in TransactionCloud merchant panel as prodcut return url. you have to manage all the payment success process from one single route you will get a product_type param to get idea which kind of product payment ipn response it is + +#### charge_customer method example +```php + $transactionclud = XgPaymentGateway::transactionclud(); + $transactionclud->setApiLogin("API_QWGW6TO2N1I5A2L40W"); + $transactionclud->setApiPassword("EPKUZU6L7HR8BU5WHH"); + $transactionclud->setProductID("TC-PR_APo7g7R"); + $transactionclud->setCurrency("USD"); + $transactionclud->setEnv(true); // this must be type of boolean , string will not work + $transactionclud->setExchangeRate(74); // if INR not set as currency + + $response = $transactionclud->charge_customer([ + 'amount' => 10.5, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('get.ipn'), //post route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rahman', + 'payment_type' => 'order', + ]); + return $response; +``` +#### ipn_response method example for TransactionCloud + +```php + $transactionclud = XgPaymentGateway::transactionclud(); + $transactionclud->setApiLogin("API_QWGW6TO2N1I5A2L40W"); + $transactionclud->setApiPassword("EPKUZU6L7HR8BU5WHH"); + $transactionclud->setProductID("TC-PR_APo7g7R"); + $transactionclud->setEnv(true); // this must be type of boolean , string will not work + $transactionclud->ipn_response(); +``` + + +## Setup For KineticPay +```php +>> KineticPay supported currency list ['MYR'] +```` +#### KineticPay ipn route example +````php +Route::post('/kineticpay-ipn', [\App\Http\Controllers\PaymentLogController::class,'KineticPay_ipn'] )->name('payment.KineticPay.ipn'); + +```` +you must have to excluded KineticPay ipn route from csrf token verify, go to `app/Http/Middleware` ``VerifyCsrfToken`` Middleware add your route path here in ``$except`` array + +````php +namespace App\Http\Middleware; +use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; +class VerifyCsrfToken extends Middleware +{ + /** + * The URIs that should be excluded from CSRF verification. + * + * @var array + */ + protected $except = [ + 'kineticpay-ipn' + ]; +} +```` + +#### charge_customer method example +```php + $kineticpay = XgPaymentGateway::kineticpay(); + $kineticpay->setMerchantKey("ede1c5e9f81c9d12bf418629f56a7870"); + $kineticpay->setBank("ABMB0212"); + $kineticpay->setCurrency("MYR"); + $kineticpay->setEnv(true); // this must be type of boolean , string will not work + $kineticpay->setExchangeRate(74); // if INR not set as currency + + $response = $kineticpay->charge_customer([ + 'amount' => 10.5, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('post.ipn'), //post route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rahman', + 'payment_type' => 'order', + ]); + return $response; +``` +#### ipn_response method example for kineticpay + +```php + $kineticpay = XgPaymentGateway::kineticpay(); + $kineticpay->setMerchantKey("ede1c5e9f81c9d12bf418629f56a7870"); + $kineticpay->setCurrency("MYR"); + $kineticpay->setEnv(true); // this must be type of boolean , string will not work + $kineticpay->setExchangeRate(74); // if INR not set as currency + $payment_data = $kineticpay->ipn_response(); +``` + + +## Setup For Senangpay +[Senangpay Documentation](https://docs.xgenious.com/docs/nexelit/payment-gateway-settings/how-to-configure-senangpay/) + +```php +>> Senangpay supported currency list ['MYR'] +```` +#### Senangpay ipn route example +````php +Route::get('/senangpay-ipn', [\App\Http\Controllers\PaymentLogController::class,'senangpay_ipn'] )->name('payment.senangpay.ipn'); + +```` +you must have to add this url to senangpay merchant panel as return url, you can use only one ipn because, senangpay does not support return url, or ipn url, you can manage multiple payment by pass payment_type, then filter it in single ipn route and manage it. + + + +#### charge_customer method example +```php + $senangpay = XgPaymentGateway::senangpay(); + $senangpay->setMerchantId(''); + $senangpay->setSecretKey(''); + $senangpay->setEnv(true); + $senangpay->setHashMethod('sha256'); + $senangpay->setCurrency('MYR'); + $response = $senangpay->charge_customer([ + 'amount' => 10.5, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('get.ipn'), //post route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rahman', + 'payment_type' => 'order', + ]); + + return $response; +``` +#### ipn_response method example for Senangpay + +```php + $senangpay = XgPaymentGateway::senangpay(); + $senangpay->setMerchantId(''); + $senangpay->setSecretKey(''); + $senangpay->setEnv(true); + $senangpay->setHashMethod('sha256'); + $senangpay->setCurrency('MYR'); + $payment_data = $senangpay->ipn_response(); + + dd($payment_data); +``` + + +#### charge_customer_recurring method example +```php + $senangpay = XgPaymentGateway::senangpay(); + $senangpay->setMerchantId(''); + $senangpay->setSecretKey(''); + $senangpay->setRecurringId('169217592513'); //need to create product first in senangpay merchant panel and have to enable customer amount change option + $senangpay->setEnv(true); + $senangpay->setHashMethod('sha256'); + $senangpay->setCurrency('MYR'); + $response = $senangpay->charge_customer_recurring([ + 'amount' => 10.5, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('get.ipn'), //post route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rahman', + 'payment_type' => 'order', +]); + +return $response; + +``` + +#### ipn_response_recurring method example for Senangpay + +```php + $senangpay = XgPaymentGateway::senangpay(); + $senangpay->setMerchantId(''); + $senangpay->setSecretKey(''); + $senangpay->setEnv(true); + $senangpay->setHashMethod('sha256'); //need to set hash method in senangpay merchant panel + $senangpay->setCurrency('MYR'); + $payment_data = $senangpay->ipn_response_recurring(); + dd($payment_data); +``` + +#### Test Card for Senangpay +```` +Number: 5111111111111118 +Expiry Month: May +Expiry Year: 2025 +CVV: 100 +Card Name: anything + +```` + + + +## Setup For SaltPay + +```php +>> Salt supported currency list ['ISK', 'USD', 'EUR', 'GBP', 'DKK', 'NOK', 'SEK', 'CHF', 'JPY', 'CAD', 'HUF'] +```` +#### Salt ipn route example +````php +Route::post('/salt-ipn', [\App\Http\Controllers\PaymentLogController::class,'salt_ipn'] )->name('payment.saltpay.ipn'); + +```` + +you must have to excluded Salt ipn route from csrf token verify, go to `app/Http/Middleware` ``VerifyCsrfToken`` Middleware add your route path here in ``$except`` array + +````php +namespace App\Http\Middleware; +use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; +class VerifyCsrfToken extends Middleware +{ + /** + * The URIs that should be excluded from CSRF verification. + * + * @var array + */ + protected $except = [ + 'salt-ipn' + ]; +} +```` + + +#### charge_customer method example +```php + $saltpay = XgPaymentGateway::saltpay(); + $saltpay->setMerchantId(''); + $saltpay->setSecretKey(''); + $saltpay->setPaymentGatewayId(16); + $saltpay->setEnv(true); + $saltpay->setCurrency('USD'); + $response = $saltpay->charge_customer([ + 'amount' => 5, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('post.ipn'), //post route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rahman', + 'payment_type' => 'order', + ]); + return $response; +``` +#### ipn_response method example for Saltpay + +```php +$saltpay = XgPaymentGateway::saltpay(); +$saltpay->setMerchantId(''); +$saltpay->setSecretKey(''); +$saltpay->setPaymentGatewayId(16); +$saltpay->setEnv(true); +$saltpay->setCurrency('USD'); +$payment_data = $saltpay->ipn_response(); + +dd($payment_data); +``` + + + +## Setup For Iyzipay + +```php +>> Salt supported currency list ['TRY', 'USD', 'EUR', 'GBP','IRR','NOK','RUB','CHF'] +```` +#### Iyzipay ipn route example +````php +Route::post('/iyzipay-ipn', [\App\Http\Controllers\PaymentLogController::class,'iyzipay_ipn'] )->name('payment.iyzipay.ipn'); + +```` + +you must have to excluded Iyzipay ipn route from csrf token verify, go to `app/Http/Middleware` ``VerifyCsrfToken`` Middleware add your route path here in ``$except`` array + +````php +namespace App\Http\Middleware; +use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; +class VerifyCsrfToken extends Middleware +{ + /** + * The URIs that should be excluded from CSRF verification. + * + * @var array + */ + protected $except = [ + 'iyzipay-ipn' + ]; +} +```` + + +#### charge_customer method example +```php + $iyzipay = XgPaymentGateway::iyzipay(); + $iyzipay->setSecretKey('sandbox-QsgXTUpizlCZzHaypMJwkL8YTMGsYMBM'); + $iyzipay->setApiKey('sandbox-wtyih1LNnlN1FtCei29rVjbZRKfqVeUC'); + $iyzipay->setEnv(false); + $iyzipay->setCurrency('TRY'); + $response = $iyzipay->charge_customer([ + 'amount' => 5, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('post.ipn'), //post route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rahman', + 'payment_type' => 'order', + ]); + return $response; +``` +#### ipn_response method example for Iyzipay + +```php +$iyzipay = XgPaymentGateway::iyzipay(); +$iyzipay->setSecretKey('sandbox-QsgXTUpizlCZzHaypMJwkL8YTMGsYMBM'); +$iyzipay->setApiKey('sandbox-wtyih1LNnlN1FtCei29rVjbZRKfqVeUC'); +$iyzipay->setEnv(true); +$iyzipay->setCurrency('TRY'); +$payment_data = $iyzipay->ipn_response(); + +dd($payment_data); +``` + + +## Setup For Paymob + + +```php +>> paymob supported currency list ['EGP', 'USD', 'EUR', 'GBP'] +```` +#### Paymob ipn route example +````php +Route::match(['get','post'],'/paymob-ipn', [\App\Http\Controllers\PaymentLogController::class,'paymob_ipn'] )->name('payment.paymob.ipn'); + +```` + +you must have to excluded Paymob ipn route from csrf token verify, go to `app/Http/Middleware` ``VerifyCsrfToken`` Middleware add your route path here in ``$except`` array + +````php +namespace App\Http\Middleware; +use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; +class VerifyCsrfToken extends Middleware +{ + /** + * The URIs that should be excluded from CSRF verification. + * + * @var array + */ + protected $except = [ + 'paymob-ipn' + ]; +} +```` + + +#### charge_customer method example +```php + $paymob = XgPaymentGateway::paymob(); + $paymob->setApiKey('='); + $paymob->setIntegrationId(''); + $paymob->setIframeId(''); + //this payment gateway support mulple payment option. here is example of 4, +// $paymob->setGatewayType('accept-valu'); + $paymob->setGatewayType('accept-online'); +// $paymob->setGatewayType('accept-kiosk'); +// $paymob->setGatewayType('accept-wallet'); +// $paymob->setWalletMobileNumber('01010101010'); //require wallet mobile number, is you set gateway type "accept-wallet", this is user wallet number; + + $paymob->setSecretKey(''); + $paymob->setPublicKey(''); + $paymob->setHmacSecret(''); + $paymob->setEnv(true); + $paymob->setCurrency('EGP'); + $response = $paymob->charge_customer([ + 'amount' => 5, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('post.ipn'), //post route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rahman', + 'payment_type' => 'order', + ]); + return $response; +``` +#### ipn_response method example for Paymob + +```php + $paymob = XgPaymentGateway::paymob(); + $paymob->setApiKey('ZXlKaGJHY2lPaUpJVXpVeE1pSXNJblI1Y0NJNklrcFhWQ0o5LmV5SmpiR0Z6Y3lJNklrMWxjbU5vWVc1MElpd2ljSEp2Wm1sc1pWOXdheUk2T0RVNU5UY3pMQ0p1WVcxbElqb2lhVzVwZEdsaGJDSjkuSzZ3WUliNDN3MzdfNVpLVm9yQjdkYXo5bmh3UGtiVGNUUnlfNGhoVXVzWmYyYzJyMnpEb2VMWVRuMXZDSmtPcE1NWkdpNURmYU5mdHBmc3ZtdGlUeEE='); + $paymob->setIntegrationId('4036562'); + $paymob->setIframeId('775086'); +// $paymob->setGatewayType('accept-valu'); + $paymob->setGatewayType('accept-online'); +// $paymob->setGatewayType('accept-kiosk'); +// $paymob->setGatewayType('accept-wallet'); +// $paymob->setWalletMobileNumber('01010101010'); //require wallet mobile number, is you set gateway type "accept-wallet", this is user wallet number; + + $paymob->setSecretKey('egy_sk_live_fccc02d55ad9719c077a8344b83d87a45a2babfadd750fd64ecc22e023196f9b'); + $paymob->setPublicKey('egy_pk_live_9ojAlERxBdcEuO7bZDyzx00xJNvi12Q5'); + $paymob->setHmacSecret('02D16CFDC2F224AE0E12416CC7FFEF9F'); + $paymob->setEnv(true); + $paymob->setCurrency('EGP'); + $payment_data = $paymob->ipn_response(); + dd($payment_data); +``` + + +## Setup For Powertranz + + +```php +>> Powertranz supported currency list ['EGP', 'USD', 'EUR', 'GBP'] +```` +#### Powertranz ipn route example +````php +Route::post('/powertranz-ipn', [\App\Http\Controllers\PaymentLogController::class,'powertranz_ipn'] )->name('payment.powertranz.ipn'); + +```` + +you must have to excluded Powertranz ipn route from csrf token verify, go to `app/Http/Middleware` ``VerifyCsrfToken`` Middleware add your route path here in ``$except`` array + +````php +namespace App\Http\Middleware; +use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; +class VerifyCsrfToken extends Middleware +{ + /** + * The URIs that should be excluded from CSRF verification. + * + * @var array + */ + protected $except = [ + 'powertranz-ipn' + ]; +} +```` + + +#### charge_customer method example for Powertranz +```php + $powertranz = XgPaymentGateway::powertranz(); + $powertranz->setMerchantId('88803448'); + $powertranz->setMerchantProcessingPassword('SqroVVlPemN4gvlAKCbl7l5tvHzjOypnfqdYXMYv9ze4GsW3OaCABO'); + $powertranz->setGatewayKey(''); + $powertranz->setEnv(true); + $powertranz->setCurrency('USD'); + $response = $powertranz->charge_customer([ + 'amount' => 5.2, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('post.ipn'), //post route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rahman', + 'payment_type' => 'order', + ]); + + return $response; +``` +#### ipn_response method example for Powertranz + +```php + $powertranz = XgPaymentGateway::powertranz(); + $powertranz->setMerchantId('88803448'); + $powertranz->setMerchantProcessingPassword('SqroVVlPemN4gvlAKCbl7l5tvHzjOypnfqdYXMYv9ze4GsW3OaCABO'); + $powertranz->setGatewayKey(''); + $powertranz->setEnv(true); + $powertranz->setCurrency('USD'); + $payment_data = $powertranz->ipn_response(); + dd($payment_data); +``` + + + + +## Using this package + +Information about using this package + +## Contributing +Information about contributing to this package. +Owner Of Package @sharifur +Bug Fix and minor Contributor diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..cf00ad0 --- /dev/null +++ b/composer.json @@ -0,0 +1,70 @@ +{ + "name": "xgenious/paymentgateway", + "description": "a laravel package to manage multiple payment gateway", + "keywords": [ + "Laravel", + "xgenious" + ], + "authors": [ + { + "name": "Sharifur Rahman", + "email": "dvrobin4@gmail.com" + } + ], + "homepage": "https://github.com/Sharifur/paymentgateway", + "require": { + "php": "^8.0", + "laravel/framework": "^9.0", + "stripe/stripe-php": "^7.103", + "srmklive/paypal": "~3.0", + "midtrans/midtrans-php": "^2.5", + "anandsiddharth/laravel-paytm-wallet": "^2.0.0", + "razorpay/razorpay": "2.*", + "mollie/laravel-mollie": "^2.0", + "unicodeveloper/laravel-paystack": "1.0.*", + "mercadopago/dx-php":"^2.4.4", + "tzsk/payu": "^6.0.0", + "square/square": "18.0.0.20220420", + "cinetpay/cinetpay-php": "^1.9", + "paytabscom/laravel_paytabs": "dev-master", + "jomweb/billplz-laravel" : "^v3.0.0", + "sharifur/payfast" : "^v1.0.0", + "authorizenet/authorizenet": "^2.0", + "php-http/message": "^1.16", + "php-http/message-factory": "^1.1", + "iyzico/iyzipay-php": "^2.0", + "stevebauman/location": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.0", + "orchestra/testbench": "^7.0", + "phpstan/phpstan": "^0.12" + }, + "license": "MIT", + "autoload": { + "psr-4": { + "Xgenious\\Paymentgateway\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Xgenious\\Paymentgateway\\Tests\\": "tests/" + } + }, + "extra": { + "laravel": { + "providers": [ + "Xgenious\\Paymentgateway\\Providers\\PaymentgatewayServiceProvider" + ] + } + }, + "scripts": { + "test": "vendor/bin/phpunit -c ./phpunit.xml --colors=always", + "analysis": "vendor/bin/phpstan analyse" + }, + "config": { + "allow-plugins": { + "php-http/discovery": true + } + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..b1ab20c --- /dev/null +++ b/composer.lock @@ -0,0 +1,11004 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "55d53c17a5c83d036169dc4689a2f8d7", + "packages": [ + { + "name": "anandsiddharth/laravel-paytm-wallet", + "version": "v2.0.0", + "source": { + "type": "git", + "url": "https://github.com/anandsiddharth/laravel-paytm-wallet.git", + "reference": "5342add0719e9c5ca94fdd13f766e6a810f2ef45" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/anandsiddharth/laravel-paytm-wallet/zipball/5342add0719e9c5ca94fdd13f766e6a810f2ef45", + "reference": "5342add0719e9c5ca94fdd13f766e6a810f2ef45", + "shasum": "" + }, + "require": { + "illuminate/contracts": ">=8.0", + "illuminate/support": ">=8.0", + "php": ">=7.3.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Anand\\LaravelPaytmWallet\\PaytmWalletServiceProvider" + ], + "aliases": { + "PaytmWallet": "Anand\\LaravelPaytmWallet\\Facades\\PaytmWallet" + } + } + }, + "autoload": { + "psr-4": { + "Anand\\LaravelPaytmWallet\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anand Siddharth", + "email": "anandsiddharth21@gmail.com" + } + ], + "description": "Integrate paytm wallet easily with this package. This package uses official Paytm PHP SDK's", + "keywords": [ + "laravel", + "paytm wallet" + ], + "support": { + "issues": "https://github.com/anandsiddharth/laravel-paytm-wallet/issues", + "source": "https://github.com/anandsiddharth/laravel-paytm-wallet/tree/v2.0.0" + }, + "time": "2020-10-28T06:22:20+00:00" + }, + { + "name": "apimatic/jsonmapper", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/apimatic/jsonmapper.git", + "reference": "b74416e750a3cdf979ffaed2b91eafa1c56589e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/apimatic/jsonmapper/zipball/b74416e750a3cdf979ffaed2b91eafa1c56589e9", + "reference": "b74416e750a3cdf979ffaed2b91eafa1c56589e9", + "shasum": "" + }, + "require": { + "ext-json": "*" + }, + "require-dev": { + "phpunit/phpunit": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "squizlabs/php_codesniffer": "^3.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "apimatic\\jsonmapper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0" + ], + "authors": [ + { + "name": "Christian Weiske", + "email": "christian.weiske@netresearch.de", + "homepage": "http://www.netresearch.de/", + "role": "Developer" + }, + { + "name": "Mehdi Jaffery", + "email": "mehdi.jaffery@apimatic.io", + "homepage": "http://apimatic.io/", + "role": "Developer" + } + ], + "description": "Map nested JSON structures onto PHP classes", + "support": { + "email": "mehdi.jaffery@apimatic.io", + "issues": "https://github.com/apimatic/jsonmapper/issues", + "source": "https://github.com/apimatic/jsonmapper/tree/3.0.6" + }, + "time": "2023-02-16T10:49:45+00:00" + }, + { + "name": "apimatic/unirest-php", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/apimatic/unirest-php.git", + "reference": "52e226fb3b7081dc9ef64aee876142a240a5f0f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/apimatic/unirest-php/zipball/52e226fb3b7081dc9ef64aee876142a240a5f0f9", + "reference": "52e226fb3b7081dc9ef64aee876142a240a5f0f9", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "php": ">=5.6.0" + }, + "require-dev": { + "phpunit/phpunit": "^5 || ^6 || ^7 || ^8 || ^9" + }, + "suggest": { + "ext-json": "Allows using JSON Bodies for sending and parsing requests" + }, + "type": "library", + "autoload": { + "psr-0": { + "Unirest\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mashape", + "email": "opensource@mashape.com", + "homepage": "https://www.mashape.com", + "role": "Developer" + }, + { + "name": "APIMATIC", + "email": "opensource@apimatic.io", + "homepage": "https://www.apimatic.io", + "role": "Developer" + } + ], + "description": "Unirest PHP", + "homepage": "https://github.com/apimatic/unirest-php", + "keywords": [ + "client", + "curl", + "http", + "https", + "rest" + ], + "support": { + "email": "opensource@apimatic.io", + "issues": "https://github.com/apimatic/unirest-php/issues", + "source": "https://github.com/apimatic/unirest-php/tree/2.3.0" + }, + "time": "2022-06-15T08:29:49+00:00" + }, + { + "name": "authorizenet/authorizenet", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/AuthorizeNet/sdk-php.git", + "reference": "a3e76f96f674d16e892f87c58bedb99dada4b067" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/AuthorizeNet/sdk-php/zipball/a3e76f96f674d16e892f87c58bedb99dada4b067", + "reference": "a3e76f96f674d16e892f87c58bedb99dada4b067", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "php": ">=5.6" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "proprietary" + ], + "description": "Official PHP SDK for Authorize.Net", + "homepage": "http://developer.authorize.net", + "keywords": [ + "authorize.net", + "authorizenet", + "ecommerce", + "payment" + ], + "support": { + "issues": "https://github.com/AuthorizeNet/sdk-php/issues", + "source": "https://github.com/AuthorizeNet/sdk-php/tree/2.0.2" + }, + "time": "2021-03-31T18:22:14+00:00" + }, + { + "name": "billowapp/show-me-the-money", + "version": "0.4.3", + "source": { + "type": "git", + "url": "https://github.com/billowapp/show-me-the-money.git", + "reference": "70409331d4ca1cdcd458589cdbd12105f0bca599" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/billowapp/show-me-the-money/zipball/70409331d4ca1cdcd458589cdbd12105f0bca599", + "reference": "70409331d4ca1cdcd458589cdbd12105f0bca599", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^1.1|^2.0", + "illuminate/support": "^5.2|^6.0|^7.0|^8.0|^9.0", + "php": "^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Billow\\Utilities\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Warren Hansen", + "email": "warren@billow.co.za" + } + ], + "description": "Super simple money class for laravel and we mean simple.", + "support": { + "issues": "https://github.com/billowapp/show-me-the-money/issues", + "source": "https://github.com/billowapp/show-me-the-money/tree/0.4.3" + }, + "time": "2022-04-04T05:31:17+00:00" + }, + { + "name": "brick/math", + "version": "0.10.2", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/459f2781e1a08d52ee56b0b1444086e038561e3f", + "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^9.0", + "vimeo/psalm": "4.25.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "brick", + "math" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.10.2" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2022-08-10T22:54:19+00:00" + }, + { + "name": "cinetpay/cinetpay-php", + "version": "1.9.2", + "source": { + "type": "git", + "url": "https://github.com/cinetpay/cinetpay-php-legacy.git", + "reference": "8a4a53bce076036fc5d6781bee839719780f2028" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cinetpay/cinetpay-php-legacy/zipball/8a4a53bce076036fc5d6781bee839719780f2028", + "reference": "8a4a53bce076036fc5d6781bee839719780f2028", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "php": ">=5.6.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "CinetPay": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fawaz Adisa", + "email": "adisaf@programmer.net", + "role": "Developer" + } + ], + "description": "easily integrate cinetpay's gateway on your php web site.", + "homepage": "https://github.com/cinetpay/cinetpay-php-legacy", + "keywords": [ + "cinetpay", + "integration", + "mobile", + "money" + ], + "support": { + "email": "support@cinetpay.com", + "issues": "https://github.com/cinetpay/cinetpay-php-legacy/issues", + "source": "https://github.com/cinetpay/cinetpay-php-legacy/tree/v1.9.2" + }, + "time": "2020-11-30T00:00:00+00:00" + }, + { + "name": "clue/stream-filter", + "version": "v1.6.0", + "source": { + "type": "git", + "url": "https://github.com/clue/stream-filter.git", + "reference": "d6169430c7731d8509da7aecd0af756a5747b78e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/stream-filter/zipball/d6169430c7731d8509da7aecd0af756a5747b78e", + "reference": "d6169430c7731d8509da7aecd0af756a5747b78e", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "Clue\\StreamFilter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "A simple and modern approach to stream filtering in PHP", + "homepage": "https://github.com/clue/php-stream-filter", + "keywords": [ + "bucket brigade", + "callback", + "filter", + "php_user_filter", + "stream", + "stream_filter_append", + "stream_filter_register" + ], + "support": { + "issues": "https://github.com/clue/stream-filter/issues", + "source": "https://github.com/clue/stream-filter/tree/v1.6.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-02-21T13:15:14+00:00" + }, + { + "name": "composer/ca-bundle", + "version": "1.3.5", + "source": { + "type": "git", + "url": "https://github.com/composer/ca-bundle.git", + "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/74780ccf8c19d6acb8d65c5f39cd72110e132bbd", + "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.55", + "psr/log": "^1.0", + "symfony/phpunit-bridge": "^4.2 || ^5", + "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\CaBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "keywords": [ + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/ca-bundle/issues", + "source": "https://github.com/composer/ca-bundle/tree/1.3.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2023-01-11T08:27:00+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "f41715465d65213d644d3141a6a93081be5d3549" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549", + "reference": "f41715465d65213d644d3141a6a93081be5d3549", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2" + }, + "time": "2022-10-27T11:44:00+00:00" + }, + { + "name": "doctrine/annotations", + "version": "1.14.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", + "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1 || ^2", + "ext-tokenizer": "*", + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" + }, + "require-dev": { + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/coding-standard": "^9 || ^10", + "phpstan/phpstan": "~1.4.10 || ^1.8.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "vimeo/psalm": "^4.10" + }, + "suggest": { + "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/1.14.3" + }, + "time": "2023-02-01T09:20:38+00:00" + }, + { + "name": "doctrine/common", + "version": "3.4.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common.git", + "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/common/zipball/8b5e5650391f851ed58910b3e3d48a71062eeced", + "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced", + "shasum": "" + }, + "require": { + "doctrine/persistence": "^2.0 || ^3.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0 || ^10.0", + "doctrine/collections": "^1", + "phpstan/phpstan": "^1.4.1", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", + "squizlabs/php_codesniffer": "^3.0", + "symfony/phpunit-bridge": "^6.1", + "vimeo/psalm": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, proxies and much more.", + "homepage": "https://www.doctrine-project.org/projects/common.html", + "keywords": [ + "common", + "doctrine", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/common/issues", + "source": "https://github.com/doctrine/common/tree/3.4.3" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcommon", + "type": "tidelift" + } + ], + "time": "2022-10-09T11:47:59+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5|^8.5|^9.5", + "psr/log": "^1|^2|^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/v1.0.0" + }, + "time": "2022-05-02T15:47:09+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/750671534e0241a7c50ea5b43f67e23eb5c96f32", + "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/common": "<2.9" + }, + "require-dev": { + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.8.8", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.28" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/2.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2022-10-12T20:59:15+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.6", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/d9d313a36c872fd6ee06d9a6cbcf713eaa40f024", + "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.6" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2022-10-20T09:10:12+00:00" + }, + { + "name": "doctrine/lexer", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", + "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^10", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^4.11 || ^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/2.1.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2022-12-14T08:49:07+00:00" + }, + { + "name": "doctrine/persistence", + "version": "3.1.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/persistence.git", + "reference": "8bf8ab15960787f1a49d405f6eb8c787b4841119" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/8bf8ab15960787f1a49d405f6eb8c787b4841119", + "reference": "8bf8ab15960787f1a49d405f6eb8c787b4841119", + "shasum": "" + }, + "require": { + "doctrine/event-manager": "^1 || ^2", + "php": "^7.2 || ^8.0", + "psr/cache": "^1.0 || ^2.0 || ^3.0" + }, + "conflict": { + "doctrine/common": "<2.10" + }, + "require-dev": { + "composer/package-versions-deprecated": "^1.11", + "doctrine/coding-standard": "^11", + "doctrine/common": "^3.0", + "phpstan/phpstan": "1.9.4", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.5", + "symfony/cache": "^4.4 || ^5.4 || ^6.0", + "vimeo/psalm": "4.30.0 || 5.3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Persistence\\": "src/Persistence" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", + "homepage": "https://www.doctrine-project.org/projects/persistence.html", + "keywords": [ + "mapper", + "object", + "odm", + "orm", + "persistence" + ], + "support": { + "issues": "https://github.com/doctrine/persistence/issues", + "source": "https://github.com/doctrine/persistence/tree/3.1.4" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence", + "type": "tidelift" + } + ], + "time": "2023-02-03T11:13:07+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.3.2", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/782ca5968ab8b954773518e9e49a6f892a34b2a8", + "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "webmozart/assert": "^1.0" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-webmozart-assert": "^1.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.2" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2022-09-10T18:51:20+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "3a85486b709bc384dae8eb78fb2eec649bdb64ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/3a85486b709bc384dae8eb78fb2eec649bdb64ff", + "reference": "3a85486b709bc384dae8eb78fb2eec649bdb64ff", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^4.30" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2023-01-14T14:17:03+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "58571acbaa5f9f462c9c77e911700ac66f446d4e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/58571acbaa5f9f462c9c77e911700ac66f446d4e", + "reference": "58571acbaa5f9f462c9c77e911700ac66f446d4e", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "support": { + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.2.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2022-02-20T15:07:15+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", + "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.1" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2023-02-25T20:23:15+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.5.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5", + "guzzlehttp/psr7": "^1.9 || ^2.4", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "ext-curl": "*", + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "7.5-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.5.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2022-08-28T15:39:27+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "1.5.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "b94b2807d85443f9719887892882d0329d1e2598" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", + "reference": "b94b2807d85443f9719887892882d0329d1e2598", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4 || ^5.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.5.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2022-08-28T14:55:35+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.4.4", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "3cf1b6d4f0c820a2cf8bcaec39fc698f3443b5cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/3cf1b6d4f0c820a2cf8bcaec39fc698f3443b5cf", + "reference": "3cf1b6d4f0c820a2cf8bcaec39fc698f3443b5cf", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.4.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2023-03-09T13:19:02+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "b945d74a55a25a949158444f09ec0d3c120d69e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/b945d74a55a25a949158444f09ec0d3c120d69e2", + "reference": "b945d74a55a25a949158444f09ec0d3c120d69e2", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.17" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.19 || ^9.5.8", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2021-10-07T12:57:01+00:00" + }, + { + "name": "http-interop/http-factory-guzzle", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/http-interop/http-factory-guzzle.git", + "reference": "8f06e92b95405216b237521cc64c804dd44c4a81" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/8f06e92b95405216b237521cc64c804dd44c4a81", + "reference": "8f06e92b95405216b237521cc64c804dd44c4a81", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.7||^2.0", + "php": ">=7.3", + "psr/http-factory": "^1.0" + }, + "provide": { + "psr/http-factory-implementation": "^1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^9.5" + }, + "suggest": { + "guzzlehttp/psr7": "Includes an HTTP factory starting in version 2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Factory\\Guzzle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "An HTTP Factory using Guzzle PSR7", + "keywords": [ + "factory", + "http", + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/http-interop/http-factory-guzzle/issues", + "source": "https://github.com/http-interop/http-factory-guzzle/tree/1.2.0" + }, + "time": "2021-07-21T13:50:14+00:00" + }, + { + "name": "igorw/get-in", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/igorw/get-in.git", + "reference": "170ded831f49abc6a6061f655aba9bdbcf7b8111" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/get-in/zipball/170ded831f49abc6a6061f655aba9bdbcf7b8111", + "reference": "170ded831f49abc6a6061f655aba9bdbcf7b8111", + "shasum": "" + }, + "require": { + "php": ">=5.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "files": [ + "src/get_in.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Functions for for hash map (assoc array) traversal.", + "keywords": [ + "assoc-array", + "hash-map" + ], + "support": { + "issues": "https://github.com/igorw/get-in/issues", + "source": "https://github.com/igorw/get-in/tree/v1.0.3" + }, + "time": "2014-12-15T23:03:51+00:00" + }, + { + "name": "jomweb/billplz", + "version": "v4.5.1", + "source": { + "type": "git", + "url": "https://github.com/jomweb/billplz.git", + "reference": "65bc43594337362888e7be13b17ee3a6d7e687ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jomweb/billplz/zipball/65bc43594337362888e7be13b17ee3a6d7e687ea", + "reference": "65bc43594337362888e7be13b17ee3a6d7e687ea", + "shasum": "" + }, + "require": { + "jomweb/ringgit": "^2.3.1", + "laravie/codex": "^5.3.3", + "laravie/codex-filter": "^1.2.2", + "php": "^7.2 || ^8.0", + "php-http/multipart-stream-builder": "^1.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.1 || ^1.4.4", + "php-http/guzzle7-adapter": "^1.0", + "phpstan/phpstan": "^1.10.3", + "phpunit/phpunit": "^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Billplz\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com" + } + ], + "description": "PHP Agnostic library for working with BillPlz API", + "support": { + "issues": "https://github.com/jomweb/billplz/issues", + "source": "https://github.com/jomweb/billplz/tree/v4.5.1" + }, + "funding": [ + { + "url": "https://paypal.me/crynobone", + "type": "custom" + }, + { + "url": "https://liberapay.com/crynobone", + "type": "liberapay" + } + ], + "time": "2023-03-06T13:39:53+00:00" + }, + { + "name": "jomweb/billplz-laravel", + "version": "v3.2.0", + "source": { + "type": "git", + "url": "https://github.com/jomweb/billplz-laravel.git", + "reference": "850439bae956fef5c21422cad5afaa8e8d1b6e11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jomweb/billplz-laravel/zipball/850439bae956fef5c21422cad5afaa8e8d1b6e11", + "reference": "850439bae956fef5c21422cad5afaa8e8d1b6e11", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^7.0.1", + "illuminate/support": "^9.0 || ^10.0", + "jomweb/billplz": "^4.3.1", + "php": "^8.0", + "php-http/guzzle7-adapter": "^1.0" + }, + "require-dev": { + "nunomaduro/collision": "^6.1", + "nunomaduro/larastan": "^2.0", + "orchestra/canvas": "^7.0 || ^8.0", + "orchestra/testbench": "^7.0 || ^8.0", + "phpunit/phpunit": "^9.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + }, + "laravel": { + "providers": [ + "Billplz\\Laravel\\BillplzServiceProvider" + ], + "aliases": { + "Billplz": "Billplz\\Laravel\\Billplz" + } + } + }, + "autoload": { + "psr-4": { + "Billplz\\Laravel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com" + } + ], + "description": "Laravel adapter for Billplz", + "support": { + "issues": "https://github.com/jomweb/billplz-laravel/issues", + "source": "https://github.com/jomweb/billplz-laravel/tree/v3.2.0" + }, + "funding": [ + { + "url": "https://paypal.me/crynobone", + "type": "custom" + }, + { + "url": "https://liberapay.com/crynobone", + "type": "liberapay" + } + ], + "time": "2023-02-14T10:25:02+00:00" + }, + { + "name": "jomweb/ringgit", + "version": "v2.4.1", + "source": { + "type": "git", + "url": "https://github.com/jomweb/ringgit.git", + "reference": "c9137299971e14652a9db0c8e73ff9d17c3075f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jomweb/ringgit/zipball/c9137299971e14652a9db0c8e73ff9d17c3075f3", + "reference": "c9137299971e14652a9db0c8e73ff9d17c3075f3", + "shasum": "" + }, + "require": { + "moneyphp/money": "^3.3 || ^4.0", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Duit\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com" + } + ], + "description": "Malaysia Ringgit implementation on top of Money PHP", + "support": { + "issues": "https://github.com/jomweb/ringgit/issues", + "source": "https://github.com/jomweb/ringgit/tree/v2.4.1" + }, + "funding": [ + { + "url": "https://paypal.me/crynobone", + "type": "custom" + }, + { + "url": "https://liberapay.com/crynobone", + "type": "liberapay" + } + ], + "time": "2021-12-14T12:34:10+00:00" + }, + { + "name": "laravel/framework", + "version": "v9.52.4", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "9239128cfb4d22afefb64060dfecf53e82987267" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/9239128cfb4d22afefb64060dfecf53e82987267", + "reference": "9239128cfb4d22afefb64060dfecf53e82987267", + "shasum": "" + }, + "require": { + "brick/math": "^0.9.3|^0.10.2|^0.11", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.3.2", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/serializable-closure": "^1.2.2", + "league/commonmark": "^2.2.1", + "league/flysystem": "^3.8.0", + "monolog/monolog": "^2.0", + "nesbot/carbon": "^2.62.1", + "nunomaduro/termwind": "^1.13", + "php": "^8.0.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^6.0.9", + "symfony/error-handler": "^6.0", + "symfony/finder": "^6.0", + "symfony/http-foundation": "^6.0", + "symfony/http-kernel": "^6.0", + "symfony/mailer": "^6.0", + "symfony/mime": "^6.0", + "symfony/process": "^6.0", + "symfony/routing": "^6.0", + "symfony/uid": "^6.0", + "symfony/var-dumper": "^6.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.4.1", + "voku/portable-ascii": "^2.0" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.235.5", + "doctrine/dbal": "^2.13.3|^3.1.4", + "ext-gmp": "*", + "fakerphp/faker": "^1.21", + "guzzlehttp/guzzle": "^7.5", + "league/flysystem-aws-s3-v3": "^3.0", + "league/flysystem-ftp": "^3.0", + "league/flysystem-path-prefixing": "^3.3", + "league/flysystem-read-only": "^3.3", + "league/flysystem-sftp-v3": "^3.0", + "mockery/mockery": "^1.5.1", + "orchestra/testbench-core": "^7.16", + "pda/pheanstalk": "^4.0", + "phpstan/phpdoc-parser": "^1.15", + "phpstan/phpstan": "^1.4.7", + "phpunit/phpunit": "^9.5.8", + "predis/predis": "^1.1.9|^2.0.2", + "symfony/cache": "^6.0", + "symfony/http-client": "^6.0" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).", + "brianium/paratest": "Required to run tests in parallel (^6.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.4).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "guzzlehttp/guzzle": "Required to use the HTTP Client and the ping methods on schedules (^7.5).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).", + "league/flysystem-read-only": "Required to use read-only disks (^3.3)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).", + "mockery/mockery": "Required to use mocking (^1.5.1).", + "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^9.5.8).", + "predis/predis": "Required to use the predis connector (^1.1.9|^2.0.2).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^6.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^6.0).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^6.0).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.0).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.0).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2023-02-22T14:38:06+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "f23fe9d4e95255dacee1bf3525e0810d1a1b0f37" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/f23fe9d4e95255dacee1bf3525e0810d1a1b0f37", + "reference": "f23fe9d4e95255dacee1bf3525e0810d1a1b0f37", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "nesbot/carbon": "^2.61", + "pestphp/pest": "^1.21.3", + "phpstan/phpstan": "^1.8.2", + "symfony/var-dumper": "^5.4.11" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2023-01-30T18:31:20+00:00" + }, + { + "name": "laravie/codex", + "version": "v5.3.3", + "source": { + "type": "git", + "url": "https://github.com/laravie/codex.git", + "reference": "5434e8e33d008d3cf177dfa27b227d46995f97ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravie/codex/zipball/5434e8e33d008d3cf177dfa27b227d46995f97ec", + "reference": "5434e8e33d008d3cf177dfa27b227d46995f97ec", + "shasum": "" + }, + "require": { + "laravie/codex-common": "^1.5.1", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.0.1", + "laravie/codex-filter": "^1.2.2", + "mockery/mockery": "^1.3.1", + "php-http/guzzle7-adapter": "^1.0", + "php-http/multipart-stream-builder": "^1.0", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10" + }, + "suggest": { + "laravie/codex-filter": "Content filtering for Laravie Codex (^1.2.2)", + "php-http/multipart-stream-builder": "Allow to send multipart form request (^1.0)", + "phpunit/phpunit": "Allow to use Codex Faker request during testing (^8.5.21 || ^9.5.10)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravie\\Codex\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com" + } + ], + "description": "PHP library for building API Client SDK for PHP", + "support": { + "issues": "https://github.com/laravie/codex/issues", + "source": "https://github.com/laravie/codex/tree/v5.3.3" + }, + "funding": [ + { + "url": "https://paypal.me/crynobone", + "type": "custom" + }, + { + "url": "https://liberapay.com/crynobone", + "type": "liberapay" + } + ], + "time": "2022-02-08T03:05:53+00:00" + }, + { + "name": "laravie/codex-common", + "version": "v1.5.2", + "source": { + "type": "git", + "url": "https://github.com/laravie/codex-common.git", + "reference": "8d465a10a294727ec8fab0de4960f373b6de1d80" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravie/codex-common/zipball/8d465a10a294727ec8fab0de4960f373b6de1d80", + "reference": "8d465a10a294727ec8fab0de4960f373b6de1d80", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.6 || ^2.0", + "http-interop/http-factory-guzzle": "^1.0", + "php": "^7.2 || ^8.0", + "php-http/client-common": "^2.0", + "php-http/client-implementation": "^1.0", + "php-http/discovery": "^1.13" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.0.1", + "mockery/mockery": "~1.3.1 || ^1.4.4", + "php-http/guzzle7-adapter": "^1.0", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laravie\\Codex\\Common\\": "src/Common/", + "Laravie\\Codex\\Testing\\": "src/Testing/", + "Laravie\\Codex\\Contracts\\": "src/Contracts/", + "Laravie\\Codex\\Exceptions\\": "src/Exceptions/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com" + } + ], + "description": "Common PHP library for building API Client SDK for PHP", + "support": { + "issues": "https://github.com/laravie/codex-common/issues", + "source": "https://github.com/laravie/codex-common/tree/v1.5.2" + }, + "funding": [ + { + "url": "https://paypal.me/crynobone", + "type": "custom" + }, + { + "url": "https://liberapay.com/crynobone", + "type": "liberapay" + } + ], + "time": "2022-12-18T09:01:37+00:00" + }, + { + "name": "laravie/codex-filter", + "version": "v1.2.2", + "source": { + "type": "git", + "url": "https://github.com/laravie/codex-filter.git", + "reference": "0ff6a2556cb71e8080f1b92b82aa54630424d57b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravie/codex-filter/zipball/0ff6a2556cb71e8080f1b92b82aa54630424d57b", + "reference": "0ff6a2556cb71e8080f1b92b82aa54630424d57b", + "shasum": "" + }, + "require": { + "igorw/get-in": "^1.0", + "laravie/codex-common": "^1.5.1", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.1 || ^1.4.4", + "php-http/guzzle7-adapter": "^1.0", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravie\\Codex\\Filter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com" + } + ], + "description": "Content filtering for Laravie Codex", + "support": { + "issues": "https://github.com/laravie/codex-filter/issues", + "source": "https://github.com/laravie/codex-filter/tree/v1.2.2" + }, + "funding": [ + { + "url": "https://paypal.me/crynobone", + "type": "custom" + }, + { + "url": "https://liberapay.com/crynobone", + "type": "liberapay" + } + ], + "time": "2022-02-08T02:38:37+00:00" + }, + { + "name": "league/commonmark", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "d44a24690f16b8c1808bf13b1bd54ae4c63ea048" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d44a24690f16b8c1808bf13b1bd54ae4c63ea048", + "reference": "d44a24690f16b8c1808bf13b1bd54ae4c63ea048", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.30.0", + "commonmark/commonmark.js": "0.30.0", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2023-03-24T15:16:10+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/flysystem", + "version": "3.12.3", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "81e87e74dd5213795c7846d65089712d2dda90ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/81e87e74dd5213795c7846d65089712d2dda90ce", + "reference": "81e87e74dd5213795c7846d65089712d2dda90ce", + "shasum": "" + }, + "require": { + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5", + "async-aws/simple-s3": "^1.1", + "aws/aws-sdk-php": "^3.220.0", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "microsoft/azure-storage-blob": "^1.1", + "phpseclib/phpseclib": "^3.0.14", + "phpstan/phpstan": "^0.12.26", + "phpunit/phpunit": "^9.5.11", + "sabre/dav": "^4.3.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.12.3" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2023-02-18T15:32:41+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ff6248ea87a9f116e78edd6002e39e5128a0d4dd", + "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.11.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2022-04-17T13:12:02+00:00" + }, + { + "name": "mercadopago/dx-php", + "version": "2.5.3", + "source": { + "type": "git", + "url": "https://github.com/mercadopago/sdk-php.git", + "reference": "c41853bde4a85742fd3b6741effde34c6919da2d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mercadopago/sdk-php/zipball/c41853bde4a85742fd3b6741effde34c6919da2d", + "reference": "c41853bde4a85742fd3b6741effde34c6919da2d", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.8", + "doctrine/common": "^2.6 || ^3.0", + "php": ">=7.1.0" + }, + "require-dev": { + "doctrine/orm": "~2.3", + "phpmd/phpmd": "@stable", + "phpunit/phpunit": "^7", + "sebastian/phpcpd": "*", + "squizlabs/php_codesniffer": "2.8.1", + "symfony/yaml": "~2.5", + "vlucas/phpdotenv": "^2.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "MercadoPago\\": [ + "src/MercadoPago/", + "tests/", + "src/MercadoPago/Generic/", + "src/MercadoPago/Entities/", + "src/MercadoPago/Entities/Shared/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Mercado Pago PHP SDK", + "homepage": "https://github.com/mercadopago/sdk-php", + "support": { + "source": "https://github.com/mercadopago/sdk-php/tree/2.5.3" + }, + "time": "2022-11-30T12:55:58+00:00" + }, + { + "name": "midtrans/midtrans-php", + "version": "2.5.2", + "source": { + "type": "git", + "url": "https://github.com/Midtrans/midtrans-php.git", + "reference": "a1ad0c824449ca8c68c4cf11b3417ad518311d2b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Midtrans/midtrans-php/zipball/a1ad0c824449ca8c68c4cf11b3417ad518311d2b", + "reference": "a1ad0c824449ca8c68c4cf11b3417ad518311d2b", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "php": ">=5.4" + }, + "require-dev": { + "phpunit/phpunit": "5.7.*", + "psy/psysh": "0.4.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Midtrans\\": "Midtrans/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andri Setiawan", + "email": "andri.setiawan@veritrans.co.id" + }, + { + "name": "Alvin Litani", + "email": "alvin.litani@veritrans.co.id" + }, + { + "name": "Ismail Faruqi", + "email": "ismail.faruqi@veritrans.co.id" + } + ], + "description": "PHP Wrapper for Midtrans Payment API.", + "homepage": "https://midtrans.com", + "support": { + "issues": "https://github.com/Midtrans/midtrans-php/issues", + "source": "https://github.com/Midtrans/midtrans-php/tree/2.5.2" + }, + "time": "2021-08-23T08:52:05+00:00" + }, + { + "name": "mollie/laravel-mollie", + "version": "v2.22.0", + "source": { + "type": "git", + "url": "https://github.com/mollie/laravel-mollie.git", + "reference": "039eec4f8e8a138e0539d77e0dcce3bc34df25f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mollie/laravel-mollie/zipball/039eec4f8e8a138e0539d77e0dcce3bc34df25f8", + "reference": "039eec4f8e8a138e0539d77e0dcce3bc34df25f8", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/support": "^9.0|^10.0", + "mollie/mollie-api-php": "^2.50", + "php": "^8.0" + }, + "require-dev": { + "laravel/pint": "^1.1", + "laravel/socialite": "^5.5", + "mockery/mockery": "^1.4", + "orchestra/testbench": "^7.18|^8.0", + "phpunit/phpunit": "^9.0|^10.0" + }, + "suggest": { + "laravel/socialite": "Use Mollie Connect (OAuth) to authenticate via Laravel Socialite with the Mollie API. This is needed for some endpoints." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Mollie\\Laravel\\MollieServiceProvider" + ], + "aliases": { + "Mollie": "Mollie\\Laravel\\Facades\\Mollie" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Mollie\\Laravel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Mollie B.V.", + "email": "info@mollie.com" + } + ], + "description": "Mollie API client wrapper for Laravel & Mollie Connect provider for Laravel Socialite", + "homepage": "https://github.com/mollie/laravel-mollie", + "keywords": [ + "Apple Pay", + "Przelewy24", + "api", + "bancontact", + "banktransfer", + "belfius", + "belfius direct net", + "charges", + "creditcard", + "direct debit", + "gateway", + "ideal", + "laravel", + "lumen", + "mistercash", + "mollie", + "payment", + "payments", + "paypal", + "paysafecard", + "podiumcadeaukaart", + "recurring", + "refunds", + "sepa", + "service", + "socialite", + "sofort", + "sofortbanking", + "subscriptions" + ], + "support": { + "issues": "https://github.com/mollie/laravel-mollie/issues", + "source": "https://github.com/mollie/laravel-mollie/tree/v2.22.0" + }, + "time": "2023-02-16T12:04:20+00:00" + }, + { + "name": "mollie/mollie-api-php", + "version": "v2.52.0", + "source": { + "type": "git", + "url": "https://github.com/mollie/mollie-api-php.git", + "reference": "f2f694ce26ef37362bdffe7b230b4d89f1c74e2d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mollie/mollie-api-php/zipball/f2f694ce26ef37362bdffe7b230b4d89f1c74e2d", + "reference": "f2f694ce26ef37362bdffe7b230b4d89f1c74e2d", + "shasum": "" + }, + "require": { + "composer/ca-bundle": "^1.2", + "ext-curl": "*", + "ext-json": "*", + "ext-openssl": "*", + "php": "^7.2|^8.0" + }, + "require-dev": { + "eloquent/liberator": "^2.0||^3.0", + "friendsofphp/php-cs-fixer": "^3.0", + "guzzlehttp/guzzle": "^6.3 || ^7.0", + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^8.5 || ^9.5" + }, + "suggest": { + "mollie/oauth2-mollie-php": "Use OAuth to authenticate with the Mollie API. This is needed for some endpoints. Visit https://docs.mollie.com/ for more information." + }, + "type": "library", + "autoload": { + "psr-4": { + "Mollie\\Api\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Mollie B.V.", + "email": "info@mollie.com" + } + ], + "description": "Mollie API client library for PHP. Mollie is a European Payment Service provider and offers international payment methods such as Mastercard, VISA, American Express and PayPal, and local payment methods such as iDEAL, Bancontact, SOFORT Banking, SEPA direct debit, Belfius Direct Net, KBC Payment Button and various gift cards such as Podiumcadeaukaart and fashioncheque.", + "homepage": "https://www.mollie.com/en/developers", + "keywords": [ + "Apple Pay", + "CBC", + "Przelewy24", + "api", + "bancontact", + "banktransfer", + "belfius", + "belfius direct net", + "charges", + "creditcard", + "direct debit", + "fashioncheque", + "gateway", + "gift cards", + "ideal", + "inghomepay", + "intersolve", + "kbc", + "klarna", + "mistercash", + "mollie", + "paylater", + "payment", + "payments", + "paypal", + "paysafecard", + "podiumcadeaukaart", + "recurring", + "refunds", + "sepa", + "service", + "sliceit", + "sofort", + "sofortbanking", + "subscriptions" + ], + "support": { + "issues": "https://github.com/mollie/mollie-api-php/issues", + "source": "https://github.com/mollie/mollie-api-php/tree/v2.52.0" + }, + "time": "2023-03-20T13:47:44+00:00" + }, + { + "name": "moneyphp/money", + "version": "v4.1.0", + "source": { + "type": "git", + "url": "https://github.com/moneyphp/money.git", + "reference": "c8eeeb1f7b7e6ca95490b94a301dc9cb8cb76c2d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/moneyphp/money/zipball/c8eeeb1f7b7e6ca95490b94a301dc9cb8cb76c2d", + "reference": "c8eeeb1f7b7e6ca95490b94a301dc9cb8cb76c2d", + "shasum": "" + }, + "require": { + "ext-bcmath": "*", + "ext-filter": "*", + "ext-json": "*", + "php": "~8.0.0 || ~8.1.0 || ~8.2.0" + }, + "require-dev": { + "cache/taggable-cache": "^1.1.0", + "doctrine/coding-standard": "^9.0", + "doctrine/instantiator": "^1.4.0", + "ext-gmp": "*", + "ext-intl": "*", + "florianv/exchanger": "^2.6.3", + "florianv/swap": "^4.3.0", + "moneyphp/crypto-currencies": "^1.0.0", + "moneyphp/iso-currencies": "^3.2.1", + "php-http/message": "^1.11.0", + "php-http/mock-client": "^1.4.1", + "phpbench/phpbench": "^1.2.5", + "phpspec/phpspec": "^7.3", + "phpunit/phpunit": "^9.5.4", + "psalm/plugin-phpunit": "^0.18.4", + "psr/cache": "^1.0.1", + "vimeo/psalm": "~5.3.0" + }, + "suggest": { + "ext-gmp": "Calculate without integer limits", + "ext-intl": "Format Money objects with intl", + "florianv/exchanger": "Exchange rates library for PHP", + "florianv/swap": "Exchange rates library for PHP", + "psr/cache-implementation": "Used for Currency caching" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Money\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mathias Verraes", + "email": "mathias@verraes.net", + "homepage": "http://verraes.net" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + }, + { + "name": "Frederik Bosch", + "email": "f.bosch@genkgo.nl" + } + ], + "description": "PHP implementation of Fowler's Money pattern", + "homepage": "http://moneyphp.org", + "keywords": [ + "Value Object", + "money", + "vo" + ], + "support": { + "issues": "https://github.com/moneyphp/money/issues", + "source": "https://github.com/moneyphp/money/tree/v4.1.0" + }, + "time": "2022-12-19T20:35:32+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.9.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "f259e2b15fb95494c83f52d3caad003bbf5ffaa1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f259e2b15fb95494c83f52d3caad003bbf5ffaa1", + "reference": "f259e2b15fb95494c83f52d3caad003bbf5ffaa1", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2@dev", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpspec/prophecy": "^1.15", + "phpstan/phpstan": "^0.12.91", + "phpunit/phpunit": "^8.5.14", + "predis/predis": "^1.1 || ^2.0", + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.9.1" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2023-02-06T13:44:46+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.66.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "496712849902241f04902033b0441b269effe001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/496712849902241f04902033b0441b269effe001", + "reference": "496712849902241f04902033b0441b269effe001", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2023-01-29T18:53:47+00:00" + }, + { + "name": "nette/schema", + "version": "v1.2.3", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", + "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", + "shasum": "" + }, + "require": { + "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", + "php": ">=7.1 <8.3" + }, + "require-dev": { + "nette/tester": "^2.3 || ^2.4", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.2.3" + }, + "time": "2022-10-13T01:24:26+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.0", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "cacdbf5a91a657ede665c541eda28941d4b09c1e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/cacdbf5a91a657ede665c541eda28941d4b09c1e", + "reference": "cacdbf5a91a657ede665c541eda28941d4b09c1e", + "shasum": "" + }, + "require": { + "php": ">=8.0 <8.3" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.4", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()", + "ext-xml": "to use Strings::length() etc. when mbstring is not available" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.0" + }, + "time": "2023-02-02T10:41:53+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v1.15.1", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.0", + "symfony/console": "^5.3.0|^6.0.0" + }, + "require-dev": { + "ergebnis/phpstan-rules": "^1.0.", + "illuminate/console": "^8.0|^9.0", + "illuminate/support": "^8.0|^9.0", + "laravel/pint": "^1.0.0", + "pestphp/pest": "^1.21.0", + "pestphp/pest-plugin-mock": "^1.0", + "phpstan/phpstan": "^1.4.6", + "phpstan/phpstan-strict-rules": "^1.1.0", + "symfony/var-dumper": "^5.2.7|^6.0.0", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Its like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "support": { + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v1.15.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2023-02-08T01:06:31+00:00" + }, + { + "name": "paytabscom/laravel_paytabs", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/paytabscom/paytabs-php-laravel-package.git", + "reference": "50c191b4e476b685a987e43bbfe5f0069a8e5c9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paytabscom/paytabs-php-laravel-package/zipball/50c191b4e476b685a987e43bbfe5f0069a8e5c9e", + "reference": "50c191b4e476b685a987e43bbfe5f0069a8e5c9e", + "shasum": "" + }, + "require": { + "php": "^7.0|^8.0" + }, + "default-branch": true, + "type": "composer-package", + "autoload": { + "psr-4": { + "Paytabscom\\Laravel_paytabs\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Walaa Elsaeed", + "email": "w.elsaeed@paytabs.com" + } + ], + "description": "Official laravel package to implement PayTabs integration with laravel apps", + "homepage": "https://site.paytabs.com/en/", + "keywords": [ + "E-comerce", + "laravel", + "payments", + "paytabs" + ], + "support": { + "issues": "https://github.com/paytabscom/paytabs-php-laravel-package/issues", + "source": "https://github.com/paytabscom/paytabs-php-laravel-package/tree/V1.4.1" + }, + "time": "2023-01-10T20:56:02+00:00" + }, + { + "name": "php-http/client-common", + "version": "2.6.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/client-common.git", + "reference": "45db684cd4e186dcdc2b9c06b22970fe123796c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/client-common/zipball/45db684cd4e186dcdc2b9c06b22970fe123796c0", + "reference": "45db684cd4e186dcdc2b9c06b22970fe123796c0", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/httplug": "^2.0", + "php-http/message": "^1.6", + "php-http/message-factory": "^1.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0", + "symfony/polyfill-php80": "^1.17" + }, + "require-dev": { + "doctrine/instantiator": "^1.1", + "guzzlehttp/psr7": "^1.4", + "nyholm/psr7": "^1.2", + "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", + "phpspec/prophecy": "^1.10.2", + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" + }, + "suggest": { + "ext-json": "To detect JSON responses with the ContentTypePlugin", + "ext-libxml": "To detect XML responses with the ContentTypePlugin", + "php-http/cache-plugin": "PSR-6 Cache plugin", + "php-http/logger-plugin": "PSR-3 Logger plugin", + "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Client\\Common\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Common HTTP Client implementations and tools for HTTPlug", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "common", + "http", + "httplug" + ], + "support": { + "issues": "https://github.com/php-http/client-common/issues", + "source": "https://github.com/php-http/client-common/tree/2.6.0" + }, + "time": "2022-09-29T09:59:43+00:00" + }, + { + "name": "php-http/discovery", + "version": "1.15.2", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "5cc428320191ac1d0b6520034c2dc0698628ced5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/5cc428320191ac1d0b6520034c2dc0698628ced5", + "reference": "5cc428320191ac1d0b6520034c2dc0698628ced5", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "symfony/phpunit-bridge": "^6.2" + }, + "type": "composer-plugin", + "extra": { + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true + }, + "autoload": { + "psr-4": { + "Http\\Discovery\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", + "homepage": "http://php-http.org", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr17", + "psr7" + ], + "support": { + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.15.2" + }, + "time": "2023-02-11T08:28:41+00:00" + }, + { + "name": "php-http/guzzle7-adapter", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/guzzle7-adapter.git", + "reference": "fb075a71dbfa4847cf0c2938c4e5a9c478ef8b01" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/guzzle7-adapter/zipball/fb075a71dbfa4847cf0c2938c4e5a9c478ef8b01", + "reference": "fb075a71dbfa4847cf0c2938c4e5a9c478ef8b01", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^7.0", + "php": "^7.2 | ^8.0", + "php-http/httplug": "^2.0", + "psr/http-client": "^1.0" + }, + "provide": { + "php-http/async-client-implementation": "1.0", + "php-http/client-implementation": "1.0", + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.0|^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Adapter\\Guzzle7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + } + ], + "description": "Guzzle 7 HTTP Adapter", + "homepage": "http://httplug.io", + "keywords": [ + "Guzzle", + "http" + ], + "support": { + "issues": "https://github.com/php-http/guzzle7-adapter/issues", + "source": "https://github.com/php-http/guzzle7-adapter/tree/1.0.0" + }, + "time": "2021-03-09T07:35:15+00:00" + }, + { + "name": "php-http/httplug", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/httplug.git", + "reference": "f640739f80dfa1152533976e3c112477f69274eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/httplug/zipball/f640739f80dfa1152533976e3c112477f69274eb", + "reference": "f640739f80dfa1152533976e3c112477f69274eb", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/promise": "^1.1", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.1", + "phpspec/phpspec": "^5.1 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "http" + ], + "support": { + "issues": "https://github.com/php-http/httplug/issues", + "source": "https://github.com/php-http/httplug/tree/2.3.0" + }, + "time": "2022-02-21T09:52:22+00:00" + }, + { + "name": "php-http/message", + "version": "1.13.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/message.git", + "reference": "7886e647a30a966a1a8d1dad1845b71ca8678361" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message/zipball/7886e647a30a966a1a8d1dad1845b71ca8678361", + "reference": "7886e647a30a966a1a8d1dad1845b71ca8678361", + "shasum": "" + }, + "require": { + "clue/stream-filter": "^1.5", + "php": "^7.1 || ^8.0", + "php-http/message-factory": "^1.0.2", + "psr/http-message": "^1.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.6", + "ext-zlib": "*", + "guzzlehttp/psr7": "^1.0", + "laminas/laminas-diactoros": "^2.0", + "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", + "slim/slim": "^3.0" + }, + "suggest": { + "ext-zlib": "Used with compressor/decompressor streams", + "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", + "laminas/laminas-diactoros": "Used with Diactoros Factories", + "slim/slim": "Used with Slim Framework PSR-7 implementation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "files": [ + "src/filters.php" + ], + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "HTTP Message related tools", + "homepage": "http://php-http.org", + "keywords": [ + "http", + "message", + "psr-7" + ], + "support": { + "issues": "https://github.com/php-http/message/issues", + "source": "https://github.com/php-http/message/tree/1.13.0" + }, + "time": "2022-02-11T13:41:14+00:00" + }, + { + "name": "php-http/message-factory", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-http/message-factory.git", + "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1", + "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Factory interfaces for PSR-7 HTTP Message", + "homepage": "http://php-http.org", + "keywords": [ + "factory", + "http", + "message", + "stream", + "uri" + ], + "support": { + "issues": "https://github.com/php-http/message-factory/issues", + "source": "https://github.com/php-http/message-factory/tree/master" + }, + "time": "2015-12-19T14:08:53+00:00" + }, + { + "name": "php-http/multipart-stream-builder", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/multipart-stream-builder.git", + "reference": "11c1d31f72e01c738bbce9e27649a7cca829c30e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/multipart-stream-builder/zipball/11c1d31f72e01c738bbce9e27649a7cca829c30e", + "reference": "11c1d31f72e01c738bbce9e27649a7cca829c30e", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/discovery": "^1.7", + "php-http/message-factory": "^1.0.2", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "nyholm/psr7": "^1.0", + "php-http/message": "^1.5", + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Message\\MultipartStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + } + ], + "description": "A builder class that help you create a multipart stream", + "homepage": "http://php-http.org", + "keywords": [ + "factory", + "http", + "message", + "multipart stream", + "stream" + ], + "support": { + "issues": "https://github.com/php-http/multipart-stream-builder/issues", + "source": "https://github.com/php-http/multipart-stream-builder/tree/1.2.0" + }, + "time": "2021-05-21T08:32:01+00:00" + }, + { + "name": "php-http/promise", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/promise.git", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", + "phpspec/phpspec": "^5.1.2 || ^6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/php-http/promise/issues", + "source": "https://github.com/php-http/promise/tree/1.1.0" + }, + "time": "2020-07-07T09:29:14+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.1", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dd3a383e599f49777d8b628dadbb90cae435b87e", + "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2023-02-25T19:38:58+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/master" + }, + "time": "2020-06-29T06:28:15+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/master" + }, + "time": "2019-04-30T12:38:16+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.0" + }, + "time": "2021-07-14T16:46:02+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2022-12-31T21:50:55+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.7.3", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "433b2014e3979047db08a17a205f410ba3869cf2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/433b2014e3979047db08a17a205f410ba3869cf2", + "reference": "433b2014e3979047db08a17a205f410ba3869cf2", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.7.3" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2023-01-12T18:13:24+00:00" + }, + { + "name": "razorpay/razorpay", + "version": "2.8.5", + "source": { + "type": "git", + "url": "https://github.com/razorpay/razorpay-php.git", + "reference": "31027cfb689b9480d67419dbec7c203097e9d9ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/razorpay/razorpay-php/zipball/31027cfb689b9480d67419dbec7c203097e9d9ac", + "reference": "31027cfb689b9480d67419dbec7c203097e9d9ac", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=7.3", + "rmccue/requests": "^2.0" + }, + "require-dev": { + "phpunit/phpunit": "^9", + "raveren/kint": "1.*" + }, + "type": "library", + "autoload": { + "files": [ + "Deprecated.php" + ], + "psr-4": { + "Razorpay\\Api\\": "src/", + "Razorpay\\Tests\\": "tests/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Abhay Rana", + "email": "nemo@razorpay.com", + "homepage": "https://captnemo.in", + "role": "Developer" + }, + { + "name": "Shashank Kumar", + "email": "shashank@razorpay.com", + "role": "Developer" + } + ], + "description": "Razorpay PHP Client Library", + "homepage": "https://docs.razorpay.com", + "keywords": [ + "api", + "client", + "php", + "razorpay" + ], + "support": { + "email": "contact@razorpay.com", + "issues": "https://github.com/Razorpay/razorpay-php/issues", + "source": "https://github.com/Razorpay/razorpay-php" + }, + "time": "2022-10-19T07:41:27+00:00" + }, + { + "name": "rmccue/requests", + "version": "v2.0.5", + "source": { + "type": "git", + "url": "https://github.com/WordPress/Requests.git", + "reference": "b717f1d2f4ef7992ec0c127747ed8b7e170c2f49" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/WordPress/Requests/zipball/b717f1d2f4ef7992ec0c127747ed8b7e170c2f49", + "reference": "b717f1d2f4ef7992ec0c127747ed8b7e170c2f49", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=5.6" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "php-parallel-lint/php-console-highlighter": "^0.5.0", + "php-parallel-lint/php-parallel-lint": "^1.3.1", + "phpcompatibility/php-compatibility": "^9.0", + "requests/test-server": "dev-main", + "roave/security-advisories": "dev-latest", + "squizlabs/php_codesniffer": "^3.6", + "wp-coding-standards/wpcs": "^2.0", + "yoast/phpunit-polyfills": "^1.0.0" + }, + "type": "library", + "autoload": { + "files": [ + "library/Deprecated.php" + ], + "psr-4": { + "WpOrg\\Requests\\": "src/" + }, + "classmap": [ + "library/Requests.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Ryan McCue", + "homepage": "https://rmccue.io/" + }, + { + "name": "Alain Schlesser", + "homepage": "https://github.com/schlessera" + }, + { + "name": "Juliette Reinders Folmer", + "homepage": "https://github.com/jrfnl" + }, + { + "name": "Contributors", + "homepage": "https://github.com/WordPress/Requests/graphs/contributors" + } + ], + "description": "A HTTP library written in PHP, for human beings.", + "homepage": "https://requests.ryanmccue.info/", + "keywords": [ + "curl", + "fsockopen", + "http", + "idna", + "ipv6", + "iri", + "sockets" + ], + "support": { + "docs": "https://requests.ryanmccue.info/", + "issues": "https://github.com/WordPress/Requests/issues", + "source": "https://github.com/WordPress/Requests" + }, + "time": "2022-10-11T08:15:28+00:00" + }, + { + "name": "sharifur/payfast", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/Sharifur/payfast.git", + "reference": "aab3e78c1f4bc635df0c7cec64a99fcc34c21133" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Sharifur/payfast/zipball/aab3e78c1f4bc635df0c7cec64a99fcc34c21133", + "reference": "aab3e78c1f4bc635df0c7cec64a99fcc34c21133", + "shasum": "" + }, + "require": { + "billowapp/show-me-the-money": "^0.1.2|^0.2|^0.4", + "illuminate/http": "^5.4|^6.0|^7.0|^8.0|^9.0", + "illuminate/support": "^5.4|^6.0|^7.0|^8.0|^9.0" + }, + "require-dev": { + "symfony/var-dumper": "^3.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Billow\\PayfastServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Billow\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Warren Hansen", + "email": "warren@billow.co.za" + } + ], + "description": "Laravel 5.4+|6+|7+|8+|9+ package for processing ITN payments through payfast.co.za", + "keywords": [ + "laravel", + "package", + "payfast" + ], + "support": { + "source": "https://github.com/Sharifur/payfast/tree/v1.0.0" + }, + "time": "2022-09-03T10:42:47+00:00" + }, + { + "name": "square/square", + "version": "18.0.0.20220420", + "source": { + "type": "git", + "url": "https://github.com/square/square-php-sdk.git", + "reference": "f1ee0948a0d3a573a9506c6dd0108ca955d4b07f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/square/square-php-sdk/zipball/f1ee0948a0d3a573a9506c6dd0108ca955d4b07f", + "reference": "f1ee0948a0d3a573a9506c6dd0108ca955d4b07f", + "shasum": "" + }, + "require": { + "apimatic/jsonmapper": "^3.0.0", + "apimatic/unirest-php": "^2.2.2", + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": ">=7.2 <8.2" + }, + "require-dev": { + "phan/phan": "5.3.1", + "phpunit/phpunit": "^7.5 || ^8.5", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Square\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Square Developer Platform", + "email": "developers@squareup.com", + "homepage": "https://squareup.com/developers" + } + ], + "description": "Use Square APIs to manage and run business including payment, customer, product, inventory, and employee management.", + "homepage": "https://squareup.com/developers", + "keywords": [ + "api", + "sdk", + "square" + ], + "support": { + "issues": "https://github.com/square/square-php-sdk/issues", + "source": "https://github.com/square/square-php-sdk/tree/18.0.0.20220420" + }, + "time": "2022-04-19T22:29:34+00:00" + }, + { + "name": "srmklive/paypal", + "version": "3.0.19", + "source": { + "type": "git", + "url": "https://github.com/srmklive/laravel-paypal.git", + "reference": "ece40beaa55153119be30e74fff71001882629ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/srmklive/laravel-paypal/zipball/ece40beaa55153119be30e74fff71001882629ce", + "reference": "ece40beaa55153119be30e74fff71001882629ce", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "guzzlehttp/guzzle": "~7.0", + "illuminate/support": "~6.0|~7.0|~8.0|~9.0|^10.0", + "nesbot/carbon": "~2.0", + "php": ">=7.2|^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.0|^9.0", + "symfony/var-dumper": "~5.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Srmklive\\PayPal\\Providers\\PayPalServiceProvider" + ], + "aliases": { + "PayPal": "Srmklive\\PayPal\\Facades\\PayPal" + } + } + }, + "autoload": { + "psr-4": { + "Srmklive\\PayPal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Raza Mehdi", + "email": "srmk@outlook.com" + } + ], + "description": "Laravel plugin For Processing Payments Through Paypal Express Checkout. Can Be Used Independently With Other Applications.", + "keywords": [ + "http", + "laravel paypal", + "paypal", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/srmklive/laravel-paypal/issues", + "source": "https://github.com/srmklive/laravel-paypal/tree/3.0.19" + }, + "time": "2023-02-20T14:35:50+00:00" + }, + { + "name": "stripe/stripe-php", + "version": "v7.128.0", + "source": { + "type": "git", + "url": "https://github.com/stripe/stripe-php.git", + "reference": "c704949c49b72985c76cc61063aa26fefbd2724e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/stripe/stripe-php/zipball/c704949c49b72985c76cc61063aa26fefbd2724e", + "reference": "c704949c49b72985c76cc61063aa26fefbd2724e", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": ">=5.6.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "3.5.0", + "phpstan/phpstan": "^1.2", + "phpunit/phpunit": "^5.7 || ^9.0", + "squizlabs/php_codesniffer": "^3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "Stripe\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Stripe and contributors", + "homepage": "https://github.com/stripe/stripe-php/contributors" + } + ], + "description": "Stripe PHP Library", + "homepage": "https://stripe.com/", + "keywords": [ + "api", + "payment processing", + "stripe" + ], + "support": { + "issues": "https://github.com/stripe/stripe-php/issues", + "source": "https://github.com/stripe/stripe-php/tree/v7.128.0" + }, + "time": "2022-05-05T17:18:02+00:00" + }, + { + "name": "symfony/console", + "version": "v6.2.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "cbad09eb8925b6ad4fb721c7a179344dc4a19d45" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/cbad09eb8925b6ad4fb721c7a179344dc4a19d45", + "reference": "cbad09eb8925b6ad4fb721c7a179344dc4a19d45", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.4|^6.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/lock": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v6.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-25T17:00:03+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v6.2.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "aedf3cb0f5b929ec255d96bbb4909e9932c769e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/aedf3cb0f5b929ec255d96bbb4909e9932c769e0", + "reference": "aedf3cb0f5b929ec255d96bbb4909e9932c769e0", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v6.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-14T08:44:56+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", + "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.3-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-03-01T10:25:55+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v6.2.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "61e90f94eb014054000bc902257d2763fac09166" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/61e90f94eb014054000bc902257d2763fac09166", + "reference": "61e90f94eb014054000bc902257d2763fac09166", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^5.4|^6.0" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/serializer": "^5.4|^6.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v6.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-14T08:44:56+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.2.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "404b307de426c1c488e5afad64403e5f145e82a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/404b307de426c1c488e5afad64403e5f145e82a5", + "reference": "404b307de426c1c488e5afad64403e5f145e82a5", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^5.4|^6.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v6.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-14T08:44:56+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0ad3b6f1e4e2da5690fefe075cd53a238646d8dd", + "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.3-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-03-01T10:32:47+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.2.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "20808dc6631aecafbe67c186af5dcb370be3a0eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/20808dc6631aecafbe67c186af5dcb370be3a0eb", + "reference": "20808dc6631aecafbe67c186af5dcb370be3a0eb", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v6.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-16T09:57:23+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v6.2.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "5fc3038d4a594223f9ea42e4e985548f3fcc9a3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/5fc3038d4a594223f9ea42e4e985548f3fcc9a3b", + "reference": "5fc3038d4a594223f9ea42e4e985548f3fcc9a3b", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.1" + }, + "conflict": { + "symfony/cache": "<6.2" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/cache": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^5.4|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v6.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-21T10:54:55+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v6.2.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "ca0680ad1e2d678536cc20e0ae33f9e4e5d2becd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ca0680ad1e2d678536cc20e0ae33f9e4e5d2becd", + "reference": "ca0680ad1e2d678536cc20e0ae33f9e4e5d2becd", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/error-handler": "^6.1", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/http-foundation": "^5.4.21|^6.2.7", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<5.4", + "symfony/cache": "<5.4", + "symfony/config": "<6.1", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<6.2", + "symfony/doctrine-bridge": "<5.4", + "symfony/form": "<5.4", + "symfony/http-client": "<5.4", + "symfony/mailer": "<5.4", + "symfony/messenger": "<5.4", + "symfony/translation": "<5.4", + "symfony/twig-bridge": "<5.4", + "symfony/validator": "<5.4", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^5.4|^6.0", + "symfony/config": "^6.1", + "symfony/console": "^5.4|^6.0", + "symfony/css-selector": "^5.4|^6.0", + "symfony/dependency-injection": "^6.2", + "symfony/dom-crawler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^1.1|^2|^3", + "symfony/process": "^5.4|^6.0", + "symfony/routing": "^5.4|^6.0", + "symfony/stopwatch": "^5.4|^6.0", + "symfony/translation": "^5.4|^6.0", + "symfony/translation-contracts": "^1.1|^2|^3", + "symfony/uid": "^5.4|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v6.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-28T13:26:41+00:00" + }, + { + "name": "symfony/mailer", + "version": "v6.2.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "e4f84c633b72ec70efc50b8016871c3bc43e691e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/e4f84c633b72ec70efc50b8016871c3bc43e691e", + "reference": "e4f84c633b72ec70efc50b8016871c3bc43e691e", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.1", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/mime": "^6.2", + "symfony/service-contracts": "^1.1|^2|^3" + }, + "conflict": { + "symfony/http-kernel": "<5.4", + "symfony/messenger": "<6.2", + "symfony/mime": "<6.2", + "symfony/twig-bridge": "<6.2.1" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/messenger": "^6.2", + "symfony/twig-bridge": "^6.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v6.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-21T10:35:38+00:00" + }, + { + "name": "symfony/mime", + "version": "v6.2.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "62e341f80699badb0ad70b31149c8df89a2d778e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/62e341f80699badb0ad70b31149c8df89a2d778e", + "reference": "62e341f80699badb0ad70b31149c8df89a2d778e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<5.4", + "symfony/serializer": "<6.2" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/property-access": "^5.4|^6.0", + "symfony/property-info": "^5.4|^6.0", + "symfony/serializer": "^6.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v6.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-24T10:42:00+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v6.2.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "aa0e85b53bbb2b4951960efd61d295907eacd629" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/aa0e85b53bbb2b4951960efd61d295907eacd629", + "reference": "aa0e85b53bbb2b4951960efd61d295907eacd629", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v6.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-14T08:44:56+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "639084e360537a19f9ee352433b84ce831f3d2da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", + "reference": "639084e360537a19f9ee352433b84ce831f3d2da", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/f3cf1a645c2734236ed1e2e671e273eeb3586166", + "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/process", + "version": "v6.2.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "680e8a2ea6b3f87aecc07a6a65a203ae573d1902" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/680e8a2ea6b3f87aecc07a6a65a203ae573d1902", + "reference": "680e8a2ea6b3f87aecc07a6a65a203ae573d1902", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v6.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-24T10:42:00+00:00" + }, + { + "name": "symfony/routing", + "version": "v6.2.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "fa643fa4c56de161f8bc8c0492a76a60140b50e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/fa643fa4c56de161f8bc8c0492a76a60140b50e4", + "reference": "fa643fa4c56de161f8bc8c0492a76a60140b50e4", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<6.2", + "symfony/dependency-injection": "<5.4", + "symfony/yaml": "<5.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.2", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0" + }, + "suggest": { + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v6.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-14T08:53:37+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "a8c9cedf55f314f3a186041d19537303766df09a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a8c9cedf55f314f3a186041d19537303766df09a", + "reference": "a8c9cedf55f314f3a186041d19537303766df09a", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.3-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.2.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-03-01T10:32:47+00:00" + }, + { + "name": "symfony/string", + "version": "v6.2.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "67b8c1eec78296b85dc1c7d9743830160218993d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/67b8c1eec78296b85dc1c7d9743830160218993d", + "reference": "67b8c1eec78296b85dc1c7d9743830160218993d", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.0" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/intl": "^6.2", + "symfony/translation-contracts": "^2.0|^3.0", + "symfony/var-exporter": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-24T10:42:00+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.2.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "90db1c6138c90527917671cd9ffa9e8b359e3a73" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/90db1c6138c90527917671cd9ffa9e8b359e3a73", + "reference": "90db1c6138c90527917671cd9ffa9e8b359e3a73", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.3|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.13", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^1.1|^2.0|^3.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/intl": "^5.4|^6.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0", + "symfony/service-contracts": "^1.1.2|^2|^3", + "symfony/yaml": "^5.4|^6.0" + }, + "suggest": { + "nikic/php-parser": "To use PhpAstExtractor", + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-24T10:42:00+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "dfec258b9dd17a6b24420d464c43bffe347441c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/dfec258b9dd17a6b24420d464c43bffe347441c8", + "reference": "dfec258b9dd17a6b24420d464c43bffe347441c8", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.3-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.2.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-03-01T10:32:47+00:00" + }, + { + "name": "symfony/uid", + "version": "v6.2.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "d30c72a63897cfa043e1de4d4dd2ffa9ecefcdc0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/d30c72a63897cfa043e1de4d4dd2ffa9ecefcdc0", + "reference": "d30c72a63897cfa043e1de4d4dd2ffa9ecefcdc0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v6.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-14T08:44:56+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.2.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "cf8d4ca1ddc1e3cc242375deb8fc23e54f5e2a1e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/cf8d4ca1ddc1e3cc242375deb8fc23e54f5e2a1e", + "reference": "cf8d4ca1ddc1e3cc242375deb8fc23e54f5e2a1e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<5.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/uid": "^5.4|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v6.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-24T10:42:00+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "2.2.6", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/c42125b83a4fa63b187fdf29f9c93cb7733da30c", + "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.5 || ^7.0 || ^8.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.6" + }, + "time": "2023-01-03T09:29:04+00:00" + }, + { + "name": "tzsk/payu", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/tzsk/payu.git", + "reference": "4ee61c5039ac101e0df801cbf4def9a2c88bd028" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tzsk/payu/zipball/4ee61c5039ac101e0df801cbf4def9a2c88bd028", + "reference": "4ee61c5039ac101e0df801cbf4def9a2c88bd028", + "shasum": "" + }, + "require": { + "illuminate/support": "^8.0|^9.0", + "php": "^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "guzzlehttp/guzzle": "^7.0", + "laravel/legacy-factories": "^1.0", + "orchestra/testbench": "^6.0|^7.0", + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9.3", + "spatie/phpunit-snapshot-assertions": "^4.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Tzsk\\Payu\\PayuServiceProvider" + ], + "aliases": { + "Payu": "Tzsk\\Payu\\Facades\\Payu" + } + } + }, + "autoload": { + "psr-4": { + "Tzsk\\Payu\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "tzsk", + "email": "mailtokmahmed@gmail.com", + "homepage": "https://tzsk.githu.io", + "role": "Developer" + } + ], + "description": "PayU India Payment Gateway Integration with Laravel", + "homepage": "https://github.com/tzsk/payu", + "keywords": [ + "geteway", + "laravel 5 payment gateway", + "laravel payu", + "payment", + "payment gateway", + "payu", + "payu gateway with verification", + "payu payment gateway", + "payu payment verification laravel", + "tzsk", + "verification" + ], + "support": { + "issues": "https://github.com/tzsk/payu/issues", + "source": "https://github.com/tzsk/payu/tree/6.0.0" + }, + "funding": [ + { + "url": "https://paypal.me/KMAhmed", + "type": "custom" + }, + { + "url": "https://github.com/tzsk", + "type": "github" + } + ], + "time": "2022-02-25T06:27:35+00:00" + }, + { + "name": "unicodeveloper/laravel-paystack", + "version": "1.0.9", + "source": { + "type": "git", + "url": "https://github.com/unicodeveloper/laravel-paystack.git", + "reference": "785aa1c5a1b07e06e2cc5c63f11e9dcf6c29a648" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/unicodeveloper/laravel-paystack/zipball/785aa1c5a1b07e06e2cc5c63f11e9dcf6c29a648", + "reference": "785aa1c5a1b07e06e2cc5c63f11e9dcf6c29a648", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "~6|~7|~8|~9", + "illuminate/support": "~6|~7|~8|~9", + "php": "^7.2|^8.0|^8.1" + }, + "require-dev": { + "mockery/mockery": "^1.3", + "php-coveralls/php-coveralls": "^2.0", + "phpunit/phpunit": "^8.4|^9.0", + "scrutinizer/ocular": "~1.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Unicodeveloper\\Paystack\\PaystackServiceProvider" + ], + "aliases": { + "Paystack": "Unicodeveloper\\Paystack\\Facades\\Paystack" + } + } + }, + "autoload": { + "files": [ + "src/Support/helpers.php" + ], + "psr-4": { + "Unicodeveloper\\Paystack\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "unicodeveloper", + "email": "prosperotemuyiwa@gmail.com" + }, + { + "name": "iamfunsho", + "email": "info@devfunsho.com" + } + ], + "description": "A Laravel Package for Paystack", + "keywords": [ + "github", + "laravel", + "laravel 6", + "laravel 7", + "laravel 8", + "open source", + "payments", + "paystack", + "paystack.co", + "php", + "subscription" + ], + "support": { + "issues": "https://github.com/unicodeveloper/laravel-paystack/issues", + "source": "https://github.com/unicodeveloper/laravel-paystack/tree/1.0.9" + }, + "time": "2022-09-21T10:25:05+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.5.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.0.2", + "php": "^7.1.3 || ^8.0", + "phpoption/phpoption": "^1.8", + "symfony/polyfill-ctype": "^1.23", + "symfony/polyfill-mbstring": "^1.23.1", + "symfony/polyfill-php80": "^1.23.1" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-filter": "*", + "phpunit/phpunit": "^7.5.20 || ^8.5.30 || ^9.5.25" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "5.5-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.5.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2022-10-16T01:01:54+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b56450eed252f6801410d810c8e1727224ae0743" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2022-03-08T17:03:00+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ + { + "name": "doctrine/instantiator", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:23:10+00:00" + }, + { + "name": "fakerphp/faker", + "version": "v1.21.0", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "92efad6a967f0b79c499705c69b662f738cc9e4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/92efad6a967f0b79c499705c69b662f738cc9e4d", + "reference": "92efad6a967f0b79c499705c69b662f738cc9e4d", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "v1.21-dev" + } + }, + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.21.0" + }, + "time": "2022-12-13T13:54:32+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + }, + "time": "2020-07-09T08:09:16+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.5.1", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "e92dcc83d5a51851baf5f5591d32cb2b16e3684e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/e92dcc83d5a51851baf5f5591d32cb2b16e3684e", + "reference": "e92dcc83d5a51851baf5f5591d32cb2b16e3684e", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": "^7.3 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Mockery": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "http://davedevelopment.co.uk" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "issues": "https://github.com/mockery/mockery/issues", + "source": "https://github.com/mockery/mockery/tree/1.5.1" + }, + "time": "2022-09-07T15:32:08+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2023-03-08T13:26:56+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.15.4", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290", + "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4" + }, + "time": "2023-03-05T19:49:14+00:00" + }, + { + "name": "orchestra/testbench", + "version": "v7.22.2", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench.git", + "reference": "2b46f51b61404313156f180a0b3ebda7233a309b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench/zipball/2b46f51b61404313156f180a0b3ebda7233a309b", + "reference": "2b46f51b61404313156f180a0b3ebda7233a309b", + "shasum": "" + }, + "require": { + "fakerphp/faker": "^1.21", + "laravel/framework": "^9.52.4", + "mockery/mockery": "^1.5.1", + "orchestra/testbench-core": "^7.22.2", + "php": "^8.0", + "phpunit/phpunit": "^9.5.10", + "spatie/laravel-ray": "^1.32.4", + "symfony/process": "^6.0.9", + "symfony/yaml": "^6.0.9", + "vlucas/phpdotenv": "^5.4.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.0-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com", + "homepage": "https://github.com/crynobone" + } + ], + "description": "Laravel Testing Helper for Packages Development", + "homepage": "https://packages.tools/testbench/", + "keywords": [ + "BDD", + "TDD", + "laravel", + "orchestra-platform", + "orchestral", + "testing" + ], + "support": { + "issues": "https://github.com/orchestral/testbench/issues", + "source": "https://github.com/orchestral/testbench/tree/v7.22.2" + }, + "time": "2023-03-23T09:07:28+00:00" + }, + { + "name": "orchestra/testbench-core", + "version": "v7.22.2", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench-core.git", + "reference": "c34bcaf4888cb680f76eaca11ec9c4a67c019a0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench-core/zipball/c34bcaf4888cb680f76eaca11ec9c4a67c019a0b", + "reference": "c34bcaf4888cb680f76eaca11ec9c4a67c019a0b", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "fakerphp/faker": "^1.21", + "laravel/framework": "^9.52.4", + "laravel/pint": "^1.4", + "mockery/mockery": "^1.5.1", + "orchestra/canvas": "^7.0", + "phpstan/phpstan": "^1.10.7", + "phpunit/phpunit": "^9.5.10", + "spatie/laravel-ray": "^1.32.4", + "symfony/process": "^6.0.9", + "symfony/yaml": "^6.0.9", + "vlucas/phpdotenv": "^5.4.1" + }, + "suggest": { + "brianium/paratest": "Allow using parallel tresting (^6.4).", + "fakerphp/faker": "Allow using Faker for testing (^1.21).", + "laravel/framework": "Required for testing (^9.52.4).", + "mockery/mockery": "Allow using Mockery for testing (^1.5.1).", + "nunomaduro/collision": "Allow using Laravel style tests output and parallel testing (^6.2).", + "orchestra/testbench-browser-kit": "Allow using legacy Laravel BrowserKit for testing (^7.0).", + "orchestra/testbench-dusk": "Allow using Laravel Dusk for testing (^7.0).", + "phpunit/phpunit": "Allow using PHPUnit for testing (^9.5.10).", + "symfony/yaml": "Required for CLI Commander (^6.0.9).", + "vlucas/phpdotenv": "Required for CLI Commander (^5.4.1)." + }, + "bin": [ + "testbench" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.0-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Orchestra\\Testbench\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com", + "homepage": "https://github.com/crynobone" + } + ], + "description": "Testing Helper for Laravel Development", + "homepage": "https://packages.tools/testbench", + "keywords": [ + "BDD", + "TDD", + "laravel", + "orchestra-platform", + "orchestral", + "testing" + ], + "support": { + "issues": "https://github.com/orchestral/testbench/issues", + "source": "https://github.com/orchestral/testbench-core" + }, + "time": "2023-03-23T08:52:15+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.3" + }, + "time": "2021-07-20T11:28:43+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "0.12.100", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "48236ddf823547081b2b153d1cd2994b784328c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/48236ddf823547081b2b153d1cd2994b784328c3", + "reference": "48236ddf823547081b2b153d1cd2994b784328c3", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.12-dev" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "support": { + "issues": "https://github.com/phpstan/phpstan/issues", + "source": "https://github.com/phpstan/phpstan/tree/0.12.100" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", + "type": "tidelift" + } + ], + "time": "2022-11-01T09:52:08+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.26", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", + "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.15", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-text-template": "^2.0.2", + "sebastian/code-unit-reverse-lookup": "^2.0.2", + "sebastian/complexity": "^2.0", + "sebastian/environment": "^5.1.2", + "sebastian/lines-of-code": "^1.0.3", + "sebastian/version": "^3.0.1", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-03-06T12:58:08+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.6.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "86e761949019ae83f49240b2f2123fb5ab3b2fc5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/86e761949019ae83f49240b2f2123fb5ab3b2fc5", + "reference": "86e761949019ae83f49240b2f2123fb5ab3b2fc5", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.3.1 || ^2", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.13", + "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.3", + "phpunit/php-timer": "^5.0.2", + "sebastian/cli-parser": "^1.0.1", + "sebastian/code-unit": "^1.0.6", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.3", + "sebastian/environment": "^5.1.3", + "sebastian/exporter": "^4.0.5", + "sebastian/global-state": "^5.0.1", + "sebastian/object-enumerator": "^4.0.3", + "sebastian/resource-operations": "^3.0.3", + "sebastian/type": "^3.2", + "sebastian/version": "^3.0.2" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.6-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.5" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2023-03-09T06:34:10+00:00" + }, + { + "name": "pimple/pimple", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/silexphp/Pimple.git", + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed", + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1 || ^2.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^5.4@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Pimple": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Pimple, a simple Dependency Injection Container", + "homepage": "https://pimple.symfony.com", + "keywords": [ + "container", + "dependency injection" + ], + "support": { + "source": "https://github.com/silexphp/Pimple/tree/v3.5.0" + }, + "time": "2021-10-28T11:13:42+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:08:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T12:41:17+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.7", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:52:27+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:10:38+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:03:51+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T06:03:37+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-02-14T08:28:10+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.6", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-28T06:42:11+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:07:39+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:45:17+00:00" + }, + { + "name": "sebastian/type", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:13:03+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "spatie/backtrace", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/backtrace.git", + "reference": "ec4dd16476b802dbdc6b4467f84032837e316b8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/ec4dd16476b802dbdc6b4467f84032837e316b8c", + "reference": "ec4dd16476b802dbdc6b4467f84032837e316b8c", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "ext-json": "*", + "phpunit/phpunit": "^9.3", + "spatie/phpunit-snapshot-assertions": "^4.2", + "symfony/var-dumper": "^5.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Backtrace\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van de Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A better backtrace", + "homepage": "https://github.com/spatie/backtrace", + "keywords": [ + "Backtrace", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/backtrace/tree/1.4.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2023-03-04T08:57:24+00:00" + }, + { + "name": "spatie/laravel-ray", + "version": "1.32.4", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-ray.git", + "reference": "2274653f0a90dd87fbb887437be1c1ea1388a47c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-ray/zipball/2274653f0a90dd87fbb887437be1c1ea1388a47c", + "reference": "2274653f0a90dd87fbb887437be1c1ea1388a47c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/contracts": "^7.20|^8.19|^9.0|^10.0", + "illuminate/database": "^7.20|^8.19|^9.0|^10.0", + "illuminate/queue": "^7.20|^8.19|^9.0|^10.0", + "illuminate/support": "^7.20|^8.19|^9.0|^10.0", + "php": "^7.4|^8.0", + "spatie/backtrace": "^1.0", + "spatie/ray": "^1.37", + "symfony/stopwatch": "4.2|^5.1|^6.0", + "zbateson/mail-mime-parser": "^1.3.1|^2.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.3", + "laravel/framework": "^7.20|^8.19|^9.0|^10.0", + "orchestra/testbench-core": "^5.0|^6.0|^7.0|^8.0", + "pestphp/pest": "^1.22", + "phpstan/phpstan": "^0.12.93", + "phpunit/phpunit": "^9.3", + "spatie/pest-plugin-snapshots": "^1.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.29.x-dev" + }, + "laravel": { + "providers": [ + "Spatie\\LaravelRay\\RayServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\LaravelRay\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily debug Laravel apps", + "homepage": "https://github.com/spatie/laravel-ray", + "keywords": [ + "laravel-ray", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-ray/issues", + "source": "https://github.com/spatie/laravel-ray/tree/1.32.4" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2023-03-23T08:04:54+00:00" + }, + { + "name": "spatie/macroable", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/macroable.git", + "reference": "ec2c320f932e730607aff8052c44183cf3ecb072" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/macroable/zipball/ec2c320f932e730607aff8052c44183cf3ecb072", + "reference": "ec2c320f932e730607aff8052c44183cf3ecb072", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.0|^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Macroable\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A trait to dynamically add methods to a class", + "homepage": "https://github.com/spatie/macroable", + "keywords": [ + "macroable", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/macroable/issues", + "source": "https://github.com/spatie/macroable/tree/2.0.0" + }, + "time": "2021-03-26T22:39:02+00:00" + }, + { + "name": "spatie/ray", + "version": "1.37.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/ray.git", + "reference": "a915e327f04c0fbed3bdd26e076e39feea091062" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/ray/zipball/a915e327f04c0fbed3bdd26e076e39feea091062", + "reference": "a915e327f04c0fbed3bdd26e076e39feea091062", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "php": "^7.3|^8.0", + "ramsey/uuid": "^3.0|^4.1", + "spatie/backtrace": "^1.1", + "spatie/macroable": "^1.0|^2.0", + "symfony/stopwatch": "^4.0|^5.1|^6.0", + "symfony/var-dumper": "^4.2|^5.1|^6.0" + }, + "require-dev": { + "illuminate/support": "6.x|^8.18|^9.0", + "nesbot/carbon": "^2.63", + "pestphp/pest": "^1.22", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5", + "spatie/phpunit-snapshot-assertions": "^4.2", + "spatie/test-time": "^1.2" + }, + "type": "library", + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\Ray\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Debug with Ray to fix problems faster", + "homepage": "https://github.com/spatie/ray", + "keywords": [ + "ray", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/ray/issues", + "source": "https://github.com/spatie/ray/tree/1.37.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2023-03-06T07:22:28+00:00" + }, + { + "name": "symfony/polyfill-iconv", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-iconv.git", + "reference": "927013f3aac555983a5059aada98e1907d842695" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/927013f3aac555983a5059aada98e1907d842695", + "reference": "927013f3aac555983a5059aada98e1907d842695", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-iconv": "*" + }, + "suggest": { + "ext-iconv": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Iconv extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "iconv", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v6.2.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "f3adc98c1061875dd2edcd45e5b04e63d0e29f8f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/f3adc98c1061875dd2edcd45e5b04e63d0e29f8f", + "reference": "f3adc98c1061875dd2edcd45e5b04e63d0e29f8f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/service-contracts": "^1|^2|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v6.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-14T08:44:56+00:00" + }, + { + "name": "symfony/yaml", + "version": "v6.2.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "e8e6a1d59e050525f27a1f530aa9703423cb7f57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e8e6a1d59e050525f27a1f530aa9703423cb7f57", + "reference": "e8e6a1d59e050525f27a1f530aa9703423cb7f57", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v6.2.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-16T09:57:23+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2021-07-28T10:34:58+00:00" + }, + { + "name": "zbateson/mail-mime-parser", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zbateson/mail-mime-parser.git", + "reference": "20b3e48eb799537683780bc8782fbbe9bc25934a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/20b3e48eb799537683780bc8782fbbe9bc25934a", + "reference": "20b3e48eb799537683780bc8782fbbe9bc25934a", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.7.0|^2.0", + "php": ">=7.1", + "pimple/pimple": "^3.0", + "zbateson/mb-wrapper": "^1.0.1", + "zbateson/stream-decorators": "^1.0.6" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "*", + "mikey179/vfsstream": "^1.6.0", + "phpstan/phpstan": "*", + "phpunit/phpunit": "<10" + }, + "suggest": { + "ext-iconv": "For best support/performance", + "ext-mbstring": "For best support/performance" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZBateson\\MailMimeParser\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zaahid Bateson" + }, + { + "name": "Contributors", + "homepage": "https://github.com/zbateson/mail-mime-parser/graphs/contributors" + } + ], + "description": "MIME email message parser", + "homepage": "https://mail-mime-parser.org", + "keywords": [ + "MimeMailParser", + "email", + "mail", + "mailparse", + "mime", + "mimeparse", + "parser", + "php-imap" + ], + "support": { + "docs": "https://mail-mime-parser.org/#usage-guide", + "issues": "https://github.com/zbateson/mail-mime-parser/issues", + "source": "https://github.com/zbateson/mail-mime-parser" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2023-02-14T22:58:03+00:00" + }, + { + "name": "zbateson/mb-wrapper", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/zbateson/mb-wrapper.git", + "reference": "faf35dddfacfc5d4d5f9210143eafd7a7fe74334" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/mb-wrapper/zipball/faf35dddfacfc5d4d5f9210143eafd7a7fe74334", + "reference": "faf35dddfacfc5d4d5f9210143eafd7a7fe74334", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-iconv": "^1.9", + "symfony/polyfill-mbstring": "^1.9" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "*", + "phpstan/phpstan": "*", + "phpunit/phpunit": "<=9.0" + }, + "suggest": { + "ext-iconv": "For best support/performance", + "ext-mbstring": "For best support/performance" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZBateson\\MbWrapper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zaahid Bateson" + } + ], + "description": "Wrapper for mbstring with fallback to iconv for encoding conversion and string manipulation", + "keywords": [ + "charset", + "encoding", + "http", + "iconv", + "mail", + "mb", + "mb_convert_encoding", + "mbstring", + "mime", + "multibyte", + "string" + ], + "support": { + "issues": "https://github.com/zbateson/mb-wrapper/issues", + "source": "https://github.com/zbateson/mb-wrapper/tree/1.2.0" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2023-01-11T23:05:44+00:00" + }, + { + "name": "zbateson/stream-decorators", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/zbateson/stream-decorators.git", + "reference": "7466ff45d249c86b96267a83cdae68365ae1787e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/stream-decorators/zipball/7466ff45d249c86b96267a83cdae68365ae1787e", + "reference": "7466ff45d249c86b96267a83cdae68365ae1787e", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.9 | ^2.0", + "php": ">=7.1", + "zbateson/mb-wrapper": "^1.0.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "*", + "phpstan/phpstan": "*", + "phpunit/phpunit": "<=9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZBateson\\StreamDecorators\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zaahid Bateson" + } + ], + "description": "PHP psr7 stream decorators for mime message part streams", + "keywords": [ + "base64", + "charset", + "decorators", + "mail", + "mime", + "psr7", + "quoted-printable", + "stream", + "uuencode" + ], + "support": { + "issues": "https://github.com/zbateson/stream-decorators/issues", + "source": "https://github.com/zbateson/stream-decorators/tree/1.1.0" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2023-01-11T23:22:44+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "paytabscom/laravel_paytabs": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": "^8.0" + }, + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/config/paymentgateway.php b/config/paymentgateway.php new file mode 100644 index 0000000..cb43082 --- /dev/null +++ b/config/paymentgateway.php @@ -0,0 +1,91 @@ + [ + 'secret_key' => env('STRIPE_SECRET_KEY',null), + 'public_key' => env('STRIPE_PUBLIC_KEY',null) + ], + 'paypal' =>[ + 'mode' => env('PAYPAL_MODE', 'sandbox'), // Can only be 'sandbox' Or 'live'. If empty or invalid, 'live' will be used. + 'sandbox' => [ + 'client_id' => env('PAYPAL_SANDBOX_CLIENT_ID', ''), + 'client_secret' => env('PAYPAL_SANDBOX_CLIENT_SECRET', ''), + 'app_id' => env('PAYPAL_SANDBOX_APP_ID', ''), + ], + 'live' => [ + 'client_id' => env('PAYPAL_LIVE_CLIENT_ID', ''), + 'client_secret' => env('PAYPAL_LIVE_CLIENT_SECRET', ''), + 'app_id' => env('PAYPAL_LIVE_APP_ID', ''), + ], + + 'payment_action' => env('PAYPAL_PAYMENT_ACTION', 'Sale'), // Can only be 'Sale', 'Authorization' or 'Order' + 'currency' => env('SITE_GLOBAL_CURRENCY', 'USD'), + 'notify_url' => env('PAYPAL_NOTIFY_URL', ''), // Change this accordingly for your application. + 'locale' => env('PAYPAL_LOCALE', 'en_US'), // force gateway language i.e. it_IT, es_ES, en_US ... (for express checkout only) + 'validate_ssl' => env('PAYPAL_VALIDATE_SSL', true), // Validate SSL when creating api client. + ], + 'midtrans' => [ + 'merchant_id' => env('MIDTRANS_MERCHANT_ID', null), + 'server_key' => env('MIDTRANS_SERVER_KEY', null), + 'client_key' => env('MIDTRANS_CLIENT_KEY', null), + 'envaironment' => env('MIDTRANS_ENVAIRONTMENT', false) // Set to Development/Sandbox Environment (default). Set to true for Production Environment (accept real transaction). + ], + 'paytm' => [ + 'env' => env('PAYTM_ENVIRONMENT','local'), // values : (local | production) + 'merchant_id' => env('PAYTM_MERCHANT_ID'), + 'merchant_key' => env('PAYTM_MERCHANT_KEY'), + 'merchant_website' => env('PAYTM_MERCHANT_WEBSITE'), + 'channel' => env('PAYTM_CHANNEL'), + 'industry_type' => env('PAYTM_INDUSTRY_TYPE'), + ], + 'razorpay' => [ + 'api_key' => env('RAZORPAY_API_KEY',null), + 'api_secret' => env('RAZORPAY_API_SECRET',null), + ], + 'mollie' => [ + 'public_key' => env('MOLLIE_KEY',null) + ], + 'flutterwave' => [ + 'public_key' => env('FLW_PUBLIC_KEY',null), + 'secret_key' => env('FLW_SECRET_KEY',null), + 'secret_hash' => env('FLW_SECRET_HASH','abcd'), + ], + 'paystack' => [ + 'public_key' => env('PAYSTACK_PUBLIC_KEY',null), + 'secret_key' => env('PAYSTACK_SECRET_KEY',null), + 'payment_url' => env('PAYSTACK_PAYMENT_URL','https://api.paystack.co'), + 'merchant_email' => env('MERCHANT_EMAIL',''), + ], + 'payfast' => [ + 'merchant_id' => env('PF_MERCHANT_ID'), + 'merchant_key' => env('PF_MERCHANT_KEY'), + 'passpharse' => env('PAYFAST_PASSPHRASE'), + 'environment' => env('PF_MERCHANT_ENV',true), + 'PF_ITN_URL' => env('PF_ITN_URL',null) + ], + 'cashfree' => [ + 'test_mode' => env('CASHFREE_TEST_MODE','true'), + 'app_id' => env('CASHFREE_APP_ID'), + 'secret_key' => env('CASHFREE_SECRET_KEY'), + ], + 'instamojo' => [ + 'client_id' => env('INSTAMOJO_CLIENT_ID'), + 'client_secret' => env('INSTAMOJO_CLIENT_SECRET'), + 'test_mode' => env('INSTAMOJO_TEST_MODE',true), + ], + 'mercadopago' => [ + 'client_id' => env('MERCADO_PAGO_CLIENT_ID'), + 'client_secret' => env('MERCADO_PAGO_CLIENT_SECRET'), + 'test_mode' => env('MERCADO_PAGO_TEST_MODE',true), + ], + 'global_currency' => env('SITE_GLOBAL_CURRENCY','USD'), + 'ngn_exchange_rate' => env('NGN_EXCHANGE_RATE',null), + 'inr_exchange_rate' => env('INR_EXCHANGE_RATE',null), + 'usd_exchange_rate' => env('USD_EXCHANGE_RATE',null), + 'idr_exchange_rate' => env('IDR_EXCHANGE_RATE',null), + 'zar_exchange_rate' => env('ZAR_EXCHANGE_RATE',null), + 'brl_exchange_rate' => env('BRL_EXCHANGE_RATE',null) +]; diff --git a/database/migrations/.gitignore b/database/migrations/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/database/migrations/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/phpstan.neon b/phpstan.neon new file mode 100644 index 0000000..a76a832 --- /dev/null +++ b/phpstan.neon @@ -0,0 +1,5 @@ +parameters: + level: 5 + paths: + - src + - tests \ No newline at end of file diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..c93c7df --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,19 @@ + + + + + ./tests + + + + + + \ No newline at end of file diff --git a/public/.gitignore b/public/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/public/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/resources/.DS_Store b/resources/.DS_Store new file mode 100644 index 0000000..646266b Binary files /dev/null and b/resources/.DS_Store differ diff --git a/resources/lang/en.json b/resources/lang/en.json new file mode 100644 index 0000000..e18dc5e --- /dev/null +++ b/resources/lang/en.json @@ -0,0 +1,3 @@ +{ + "Stripe" : "Stripe Payment" +} diff --git a/resources/views/.DS_Store b/resources/views/.DS_Store new file mode 100644 index 0000000..ce28a74 Binary files /dev/null and b/resources/views/.DS_Store differ diff --git a/resources/views/authorizenet.blade.php b/resources/views/authorizenet.blade.php new file mode 100644 index 0000000..dbaf2cd --- /dev/null +++ b/resources/views/authorizenet.blade.php @@ -0,0 +1,132 @@ + + + {{__('Authorized.net Payment Gateway')}} + + + +
+
+
+ +
+
+
+ @csrf + @foreach($authorizenet_data as $field_name => $value) + + @endforeach +
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+
+
+
+ +
+
+ +
+
+ + + + + + diff --git a/resources/views/cashfree.blade.php b/resources/views/cashfree.blade.php new file mode 100644 index 0000000..3631df2 --- /dev/null +++ b/resources/views/cashfree.blade.php @@ -0,0 +1,37 @@ + + + {{__('Cashfree Payment Gateway')}} + + +
+ + + + + + + + + + + + + + +
+ + + diff --git a/resources/views/cinetpay.blade.php b/resources/views/cinetpay.blade.php new file mode 100644 index 0000000..0421309 --- /dev/null +++ b/resources/views/cinetpay.blade.php @@ -0,0 +1,22 @@ + + + {{__('CinetPay Payment Gateway')}} + + +{!! $payButton !!} + + + diff --git a/resources/views/pagali.blade.php b/resources/views/pagali.blade.php new file mode 100644 index 0000000..bd216f6 --- /dev/null +++ b/resources/views/pagali.blade.php @@ -0,0 +1,46 @@ + + + {{__('Pagali Payment Gateway')}} + + +
+ + + + + + + + + + + + + + + + + + diff --git a/resources/views/payfast.blade.php b/resources/views/payfast.blade.php new file mode 100644 index 0000000..f21d3b1 --- /dev/null +++ b/resources/views/payfast.blade.php @@ -0,0 +1,21 @@ + + + {{__('Payfast Payment Gateway')}} + + +{!! $submit_form !!} + + + diff --git a/resources/views/paymob.blade.php b/resources/views/paymob.blade.php new file mode 100644 index 0000000..ac83709 --- /dev/null +++ b/resources/views/paymob.blade.php @@ -0,0 +1,23 @@ + + + {{__('Paymob Payment Gateway')}} + + + +
+
+ +
+
+ + diff --git a/resources/views/paystack.blade.php b/resources/views/paystack.blade.php new file mode 100644 index 0000000..962ee8f --- /dev/null +++ b/resources/views/paystack.blade.php @@ -0,0 +1,49 @@ + + + {{__('PayStack Payment')}} + + + + @csrf +
+
+ + {{-- required --}} + + + {{-- required in kobo --}} + + + + + + {{-- For other necessary things you want to add to your payload. it is optional though --}} + {{-- required --}} +

+ +

+
+
+
+ + + + diff --git a/resources/views/powertransz.blade.php b/resources/views/powertransz.blade.php new file mode 100644 index 0000000..a971de7 --- /dev/null +++ b/resources/views/powertransz.blade.php @@ -0,0 +1,138 @@ + + + {{__('Powertransz Payment Gateway')}} + + + + + + +
+
+
+ +
+
+
+ @csrf +{{-- @dd($powertransz_data)--}} + @foreach($powertransz_data as $field_name => $value) + + @endforeach +
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+
+
+
+ +
+
+ +
+
+ + + + + + diff --git a/resources/views/razorpay.blade.php b/resources/views/razorpay.blade.php new file mode 100644 index 0000000..a5400f4 --- /dev/null +++ b/resources/views/razorpay.blade.php @@ -0,0 +1,50 @@ + + + {{__('Razorpay')}} + + +
+
+
+ + + + + + +
+
+
+ + + + diff --git a/resources/views/saltpay.blade.php b/resources/views/saltpay.blade.php new file mode 100644 index 0000000..de621f7 --- /dev/null +++ b/resources/views/saltpay.blade.php @@ -0,0 +1,136 @@ + + + {{__('Salt Payment Gateway')}} + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + diff --git a/resources/views/stripe.blade.php b/resources/views/stripe.blade.php new file mode 100644 index 0000000..c38acd0 --- /dev/null +++ b/resources/views/stripe.blade.php @@ -0,0 +1,76 @@ + + + {{__('Stripe Payment Gateway')}} + + + +
+
+ +
+ @foreach($stripe_data as $field_name => $value) + + @endforeach +
+
+ +
+
+
+ + + + diff --git a/resources/views/zitopay.blade.php b/resources/views/zitopay.blade.php new file mode 100644 index 0000000..3f54901 --- /dev/null +++ b/resources/views/zitopay.blade.php @@ -0,0 +1,38 @@ + + + {{__('Zitopay Payment Gateway')}} + + +{{--@dd($args)--}} +
+ + + + + + + + {{-- payment description is called as memo--}} + + {{-- When a transaction has been completed, the transaction reference (under an HTTP POST key 'ref') will be posted to this url (even before the payer gets redirected to the success_url or cancel_url).--}} + {{-- It is then advisable to rather perform all the needed confirmation check & updates on this urlF--}} + + + + +
+ + + diff --git a/routes/web.php b/routes/web.php new file mode 100644 index 0000000..03be873 --- /dev/null +++ b/routes/web.php @@ -0,0 +1,30 @@ + 'web'],function (){ + /** + * STRIPE PAYMENT ROUTE + * */ + Route::post('xgpayment-gateway/powertransz',[\Xgenious\Paymentgateway\Http\Controllers\PowertranszPaymentController::class,'charge_customer']) + ->name('xg.payment.gateway.powertransz'); + Route::post('xgpayment-gateway/authorizenet',[\Xgenious\Paymentgateway\Http\Controllers\AuthorizeNetPaymentController::class,'charge_customer']) + ->name('xg.payment.gateway.authorizenet'); + Route::post('xgpayment-gateway/stipe',[\Xgenious\Paymentgateway\Http\Controllers\StripePaymentController::class,'charge_customer']) + ->name('xg.payment.gateway.stripe'); + Route::post('xgpayment-gateway/paystack',[\Xgenious\Paymentgateway\Http\Controllers\PaystackPaymentController::class,'redirect_to_gateway']) + ->name('xg.payment.gateway.paystack'); + Route::get('xgpayment-gateway/paystack-callback',[\Xgenious\Paymentgateway\Http\Controllers\PaystackPaymentController::class,'callback']) + ->name('xg.payment.gateway.paystack.callback'); +}); + diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000..909a306 Binary files /dev/null and b/src/.DS_Store differ diff --git a/src/Base/.DS_Store b/src/Base/.DS_Store new file mode 100644 index 0000000..de56bb7 Binary files /dev/null and b/src/Base/.DS_Store differ diff --git a/src/Base/Gateways/AuthorizeDotNetPay.php b/src/Base/Gateways/AuthorizeDotNetPay.php new file mode 100644 index 0000000..6847ad9 --- /dev/null +++ b/src/Base/Gateways/AuthorizeDotNetPay.php @@ -0,0 +1,250 @@ +merchant_login_id; + } + /* set setMerchantLoginId */ + public function setMerchantLoginId($merchant_login_id){ + $this->merchant_login_id = $merchant_login_id; + return $this; + } + /* set setMerchantTransactionId */ + public function setMerchantTransactionId($merchant_transaction_id){ + $this->merchant_transaction_id = $merchant_transaction_id; + return $this; + } + /* get getMerchantTransactionId */ + private function getMerchantTransactionId(){ + return $this->merchant_transaction_id; + } + /* + * charge_amount(); + * @required param list + * $amount + * + * + * */ + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $amount; + } + return $this->get_amount_in_usd($amount); + } + /** + * @required param list + * $args['amount'] + * $args['description'] + * $args['item_name'] + * $args['ipn_url'] + * $args['cancel_url'] + * $args['payment_track'] + * return redirect url for paypal + * */ + + public function view($args){ + return view('paymentgateway::authorizenet', ['authorizenet_data' => array_merge($args,[ + 'merchant_login_id' => Crypt::encrypt($this->getMerchantLoginId()), + 'currency' => $this->getCurrency(), + 'merchant_transaction_id' => Crypt::encrypt($this->getMerchantTransactionId()), + 'charge_amount' => $this->charge_amount($args['amount']), + 'environment' => $this->getEnv(), + 'order_id' => PaymentGatewayHelpers::wrapped_id($args['order_id']) + ])]); + } + public function charge_customer($args) + { + return $this->view($args); + //todo:: format data for send in blade file for get user card details + } + public function charge_customer_from_controller() + { + $input = request()->input(); + + /* Create a merchantAuthenticationType object with authentication details + retrieved from the constants file */ + $merchant_transaction_id = \Crypt::decrypt(request()->merchant_transaction_id); + $merchant_login_id = \Crypt::decrypt(request()->merchant_login_id); + $merchantAuthentication = new AnetAPI\MerchantAuthenticationType(); + $merchantAuthentication->setName($merchant_login_id); + $merchantAuthentication->setTransactionKey($merchant_transaction_id); + + + + // Set the transaction's refId + $refId = 'ref' . time(); + $cardNumber = preg_replace('/\s+/', '', $input['number']); +//dd($cardNumber,request()->all(),request()->get('expiry'),explode('/',request()->get('expiry'))); + // Create the payment data for a credit card + $creditCard = new AnetAPI\CreditCardType(); + $creditCard->setCardNumber($cardNumber); + $card_date = explode('/',request()->get('expiry')); + $expiration_month = trim($card_date[0]); //detect if year value is full number like 2024 get only last two digit¥¥¥¥¥¥¥¥^-09oi87uy68uy6t5rewqsdw34e5 + $expiration_year = strlen(trim($card_date[1])) == 4 ? trim($card_date[1]) : '20'.trim($card_date[1]); + $expiration_date = $expiration_year. "-" .$expiration_month; + $creditCard->setExpirationDate($expiration_date); + $creditCard->setCardCode($input['cvc']); + + // Add the payment data to a paymentType object + $paymentOne = new AnetAPI\PaymentType(); + $paymentOne->setCreditCard($creditCard); + + // Create a TransactionRequestType object and add the previous objects to it + $transactionRequestType = new AnetAPI\TransactionRequestType(); + $transactionRequestType->setTransactionType("authCaptureTransaction"); + $transactionRequestType->setAmount($input['charge_amount']); + $transactionRequestType->setPayment($paymentOne); + $transactionRequestType->setCurrencyCode($input['currency']); + + // Assemble the complete transaction request + $requests = new AnetAPI\CreateTransactionRequest(); + $requests->setMerchantAuthentication($merchantAuthentication); + $requests->setRefId($refId); + $requests->setTransactionRequest($transactionRequestType); + + // Create the controller and get the response + $controller = new AnetController\CreateTransactionController($requests); + $Environment = $input['environment'] ? \net\authorize\api\constants\ANetEnvironment::SANDBOX: \net\authorize\api\constants\ANetEnvironment::PRODUCTION; + $response = $controller->executeWithApiResponse($Environment); + if ($response != null) { + // Check to see if the API request was successfully received and acted upon + if ($response->getMessages()->getResultCode() == "Ok") { + // Since the API request was successful, look for a transaction response + // and parse it to display the results of authorizing the card + $tresponse = $response->getTransactionResponse(); + + if ($tresponse != null && $tresponse->getMessages() != null) { + return $this->verified_data([ + 'transaction_id' => $tresponse->getTransId(), + 'status' => 'complete', + 'order_id' => $input['order_id'] + ]); + + } else { + $message = __('There were some issue with the payment. Please try again later.'); + if ($tresponse->getErrors() != null) { + $message = $tresponse->getErrors()[0]->getErrorText(); + } + abort(500,$message); + } + // Or, print errors if the API request wasn't successful + } else { + $message_text = 'There were some issue with the payment. Please try again later.'; + $msg_type = "error_msg"; + + $tresponse = $response->getTransactionResponse(); + + if ($tresponse != null && $tresponse->getErrors() != null) { + $message_text = $tresponse->getErrors()[0]->getErrorText(); + } else { + $message_text = $response->getMessages()->getMessage()[0]->getText(); + } + abort(500,$message_text); + } + } + return $this->verified_data([ + 'status' => 'failed', + 'order_id' => PaymentGatewayHelpers::unwrapped_id(request()->get('order_id')) + ]); + } + + /** + * @required param list + * $args['request'] + * $args['cancel_url'] + * $args['success_url'] + * + * return @void + * */ + public function ipn_response($args = []){ + + $transaction_id = request()->transaction_id; + /* Create a merchantAuthenticationType object with authentication details + retrieved from the constants file */ + $merchantAuthentication = new AnetAPI\MerchantAuthenticationType(); + $merchantAuthentication->setName($this->getMerchantLoginId()); + $merchantAuthentication->setTransactionKey($this->getMerchantTransactionId()); + + // Set the transaction's refId + // The refId is a Merchant-assigned reference ID for the request. + // If included in the request, this value is included in the response. + // This feature might be especially useful for multi-threaded applications. + $refId = 'ref' . time(); + + $request = new AnetAPI\GetTransactionDetailsRequest(); + $request->setMerchantAuthentication($merchantAuthentication); + $request->setTransId($transaction_id); + + $controller = new AnetController\GetTransactionDetailsController($request); + $Environment = $this->getEnv() ? \net\authorize\api\constants\ANetEnvironment::SANDBOX: \net\authorize\api\constants\ANetEnvironment::PRODUCTION; + $response = $controller->executeWithApiResponse( $Environment); + + if (($response != null) && ($response->getMessages()->getResultCode() == "Ok")) + { +// echo "SUCCESS: Transaction Status:" . $response->getTransaction()->getTransactionStatus() . "\n"; +// echo " Auth Amount:" . $response->getTransaction()->getAuthAmount() . "\n"; +// echo " Trans ID:" . $response->getTransaction()->getTransId() . "\n"; + return $this->verified_data([ + 'status' => 'complete', + 'transaction_id' => $response->getTransaction()->getTransId() , + 'order_id' => PaymentGatewayHelpers::unwrapped_id(request()->get('order_id')), + 'order_type' => request()->get('order_type') + ]); + } + return $this->verified_data([ + 'status' => 'failed', + 'order_id' => PaymentGatewayHelpers::unwrapped_id(request()->get('order_id')), + 'order_type' => request()->get('payment_type') + ]); + + } + + /** + * geteway_name(); + * return @string + * */ + public function gateway_name(){ + return 'authorizenet'; + } + /** + * charge_currency(); + * return @string + * */ + public function charge_currency() + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $this->getCurrency(); + } + return "USD"; + } + /** + * supported_currency_list(); + * it will returl all of supported currency for the payment gateway + * return array + * */ + public function supported_currency_list(){ + return ['AUD', 'CAD', 'CHF', 'DKK', 'EUR', 'GBP', 'JPY', 'NOK', 'NZD', 'SEK', 'USD', 'ZAR']; + } +} diff --git a/src/Base/Gateways/BillPlzPay.php b/src/Base/Gateways/BillPlzPay.php new file mode 100644 index 0000000..0789d62 --- /dev/null +++ b/src/Base/Gateways/BillPlzPay.php @@ -0,0 +1,128 @@ +collection_name; + } + public function setCollectionName($collection_name){ + $this->collection_name = $collection_name; + return $this; + } + + public function getKey(){ + return $this->key; + } + public function setKey($key){ + $this->key = $key; + return $this; + } + + public function getVersion(){ + return $this->version; + } + public function setVersion($version){ + $this->version = $version; + return $this; + } + + public function getXsignature(){ + return $this->x_signature; + } + public function setXsignature($x_signature){ + $this->x_signature = $x_signature; + return $this; + } + + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $amount * 100; + } + return $this->get_amount_in_myr($amount); + } + + public function ipn_response(array $args = []) + { + $signature = new Signature($this->getXsignature(), Signature::WEBHOOK_PARAMETERS); + $x_signature = $signature->create(request()->all()); + + $oder_id = Str::after(request()->get('name'),'ID#'); + if (hash_equals($x_signature,request()->get('x_signature')) && request()->get('paid') === 'true'){ + return $this->verified_data([ + 'status' => 'complete', + 'transaction_id' => request()->id, + 'order_id' => substr( $oder_id,5,-5) , + ]); + } + return ['status' => 'failed','order_id' => substr( $oder_id,5,-5) ]; + } + public function charge_customer(array $args) + { + $this->setConfigration(); + try { + $bill = Billplz::bill()->create( + $this->getCollectionName(), + $args['email'], + $args['phone'] ?? '', + $args['name'].' id#'.PaymentGatewayHelpers::wrapped_id($args['order_id']), + $this->charge_amount($args['amount']), + $args['ipn_url'], + $args['description'], + [ + 'redirect_url' => $args['success_url'], + ] + ); + $arry = $bill->toArray(); + Session::put('billplz_order_id',PaymentGatewayHelpers::wrapped_id($args['order_id'])); + return redirect()->to($arry['url']); + }catch (\Exception $e){ + abort(501,$e->getMessage()); + } + } + + public function supported_currency_list() + { + return ['MYR']; + } + + public function charge_currency() + { + return 'MYR'; + } + + public function gateway_name() + { + return 'billplz'; + } + + protected function setConfigration() : void + { + Config::set([ + 'services.billplz.key' => $this->getKey(), + 'services.billplz.version' => $this->getVersion(), + 'services.billplz.x-signature' => $this->getXsignature(), + 'services.billplz.sandbox' => $this->getEnv(), + ]); + } +} diff --git a/src/Base/Gateways/CashFreePay.php b/src/Base/Gateways/CashFreePay.php new file mode 100644 index 0000000..b1c86b6 --- /dev/null +++ b/src/Base/Gateways/CashFreePay.php @@ -0,0 +1,167 @@ +getCurrency(), $this->supported_currency_list())){ + return $amount; + } + return $this->get_amount_in_inr($amount); + } + + + + /** + * @inheritDoc + */ + public function ipn_response(array $args = []) + { + $config_data = $this->setConfig(); + $secretKey = $config_data['secret_key']; + $orderId = request()->get('orderId'); + $orderAmount = request()->get('orderAmount'); + $referenceId = request()->get('referenceId'); + $txStatus = request()->get('txStatus'); + $paymentMode = request()->get('paymentMode'); + $txMsg = request()->get('txMsg'); + $txTime = request()->get('txTime'); + $signature = request()->get('signature'); + + $data = $orderId . $orderAmount . $referenceId . $txStatus . $paymentMode . $txMsg . $txTime; + $hash_hmac = hash_hmac('sha256', $data, $secretKey, true); + $computedSignature = base64_encode($hash_hmac); + + if ($computedSignature === $signature && request()->txStatus === 'SUCCESS'){ + return $this->verified_data([ + 'status' => 'complete', + 'transaction_id' => request()->referenceId, + 'order_id' => substr( request()->get('orderId'),5,-5) , + ]); + } + return ['status' => 'failed']; + } + + /** + * @inheritDoc + */ + public function charge_customer(array $args) + { + $config_data = $this->setConfig(); + $order_id = random_int(12345,99999).$args['order_id'].random_int(12345,99999); + $postData = array( + "appId" => $config_data['app_id'], + "orderId" => $order_id, + "orderAmount" => round((float)$this->charge_amount($args['amount']),2), + "orderCurrency" => "INR", + "orderNote" => $order_id, + "customerName" => $args['name'], + "customerPhone" => random_int(9999999999999,9999999999999), + "customerEmail" => $args['email'], + "returnUrl" => $args['ipn_url'], + "notifyUrl" => null, + ); + + ksort($postData); + + $signatureData = ""; + foreach ( $postData as $key => $value) { + $signatureData .= $key . $value; + } + $signature = hash_hmac('sha256', $signatureData, $config_data['secret_key'], true); + $signature = base64_encode($signature); + $data = [ + 'action' => $config_data['action'], + 'app_id' => $config_data['app_id'], + 'order_id' => $order_id, + 'amount' => round((float)$this->charge_amount($args['amount']),2), + 'currency' => "INR", + 'name' => $args['name'], + 'email' => $args['email'], + 'phone' => random_int(9999999999999,9999999999999), + 'signature' => $signature, + "return_url" => $args['ipn_url'], + "notify_url" => null, + ]; + return view('paymentgateway::cashfree',['payment_data' => $data]); + } + + /** + * @inheritDoc + */ + public function supported_currency_list() + { + return ['INR']; + } + + /** + * @inheritDoc + */ + public function charge_currency() + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $this->getCurrency(); + } + return "INR"; + } + + /** + * @inheritDoc + */ + public function gateway_name() + { + return 'cashfree'; + } + + /* set app id */ + public function setAppId($app_id){ + $this->app_id = $app_id; + return $this; + } + /* set app secret */ + public function setSecretKey($secret_key){ + $this->secret_key = $secret_key; + return $this; + } + /* get app id */ + private function getAppId(){ + return $this->app_id; + } + /* get secret key */ + private function getSecretKey(){ + return $this->secret_key; + } + + protected function setConfig() : array + { + return [ + 'app_id' => $this->getAppId(), + 'secret_key' => $this->getSecretKey(), + 'order_currency' => 'INR', + 'action' => $this->get_api_url() + ]; + } + + public function get_api_url(){ + return $this->getEnv() ? + 'https://test.cashfree.com/billpay/checkout/post/submit' : + 'https://www.cashfree.com/checkout/post/submit'; + } + +} diff --git a/src/Base/Gateways/CinetPay.php b/src/Base/Gateways/CinetPay.php new file mode 100644 index 0000000..71578eb --- /dev/null +++ b/src/Base/Gateways/CinetPay.php @@ -0,0 +1,164 @@ +app_key = $app_key; + return $this; + } + public function getAppKey(){ + return $this->app_key; + } + public function setSiteId($site_id){ + $this->site_id = $site_id; + return $this; + } + public function getSiteId(){ + return $this->site_id; + } + + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $amount; + } + return $this->get_amount_in_usd($amount); + } + + public function ipn_response(array $args = []) + { + $id_transaction = request()->cpm_trans_id; + if (!empty($id_transaction)) { + try { + $cp = $this->setConfig(); + + // Reprise exacte des bonnes données chez CinetPay + $payment_status = $cp->setTransId($id_transaction)->getPayStatus(); + $paymentData = [ + "cpm_site_id" => $cp->_cpm_site_id, + "signature" => $cp->_signature, + "cpm_amount" => $cp->_cpm_amount, + "cpm_trans_id" => $cp->_cpm_trans_id, + "cpm_custom" => $cp->_cpm_custom, + "cpm_currency" => $cp->_cpm_currency, + "cpm_payid" => $cp->_cpm_payid, + "cpm_payment_date" => $cp->_cpm_payment_date, + "cpm_payment_time" => $cp->_cpm_payment_time, + "cpm_error_message" => $cp->_cpm_error_message, + "payment_method" => $cp->_payment_method, + "cpm_phone_prefixe" => $cp->_cpm_phone_prefixe, + "cel_phone_num" => $cp->_cel_phone_num, + "cpm_ipn_ack" => $cp->_cpm_ipn_ack, + "created_at" => $cp->_created_at, + "updated_at" => $cp->_updated_at, + "cpm_result" => $cp->_cpm_result, + "cpm_trans_status" => $cp->_cpm_trans_status, + "cpm_designation" => $cp->_cpm_designation, + "buyer_name" => $cp->_buyer_name, + ]; + if ($cp->isValidPayment()) { + if (isset($paymentData['cpm_trans_status']) && $paymentData['cpm_trans_status'] === 'ACCEPTED') { + return $this->verified_data([ + 'transaction_id' => $paymentData['cpm_payid'], + 'order_id' => substr($paymentData['cpm_custom'],5,-5) + ]); + } + } else { + return ['status' => 'failed']; + } + } catch (\Exception $e) { + // Une erreur s'est produite + return "Erreur :" . $e->getMessage(); + } + } + return ['status' => 'failed']; + } + + /** + * @throws \Exception + */ + public function charge_customer(array $args) + { + if($this->charge_amount($args['amount']) < 100 && !in_array("USD",[$this->getCurrency()])){ + abort(402,__('amount must be getter than 100')); + } + $order_id = random_int(12345,99999).$args['order_id'].random_int(12345,99999); + + $id_transaction = CinetPayment::generateTransId(); // Identifiant du Paiement + $description_du_paiement = $args['description']; // Description du Payment + $date_transaction = date("Y-m-d H:i:s"); // Date Paiement dans votre système + $montant_a_payer = $this->charge_amount($args['amount']); // Montant à Payer : minimun est de 100 francs sur CinetPay + $devise = $this->getCurrency();//'XOF'; // Montant à Payer : minimun est de 100 francs sur CinetPay + $identifiant_du_payeur = $order_id; // Mettez ici une information qui vous permettra d'identifier de façon unique le payeur + $formName = "goCinetPay"; // nom du formulaire CinetPay + $notify_url = $args['ipn_url']; // notification CallBack CinetPay (IPN Link) + $return_url = $args['ipn_url'];//cinetpay redirect this url after successfully payment + $cancel_url = $args['cancel_url']; // cancel url, where cinet pay will redirect after cancel payment + + $btnType = 2;//1-5xwxxw + $btnSize = 'large'; // 'small' pour reduire la taille du bouton, 'large' pour une taille moyenne ou 'larger' pour une taille plus grande + + try{ + $cp = $this->setConfig(); + }catch (\Exception $e) { + return $e->getMessage(); + } + try { + $cp->setTransId($id_transaction) + ->setDesignation($description_du_paiement) + ->setTransDate($date_transaction) + ->setAmount($montant_a_payer) + ->setCurrency($devise) + ->setDebug($this->getEnv())// Valorisé à true, si vous voulez activer le mode debug sur cinetpay afin d'afficher toutes les variables envoyées chez CinetPay + ->setCustom($identifiant_du_payeur)// optional + ->setNotifyUrl($notify_url)// optional + ->setReturnUrl($return_url)// optional + ->setCancelUrl($cancel_url);// optional + return view('paymentgateway::cinetpay',[ + 'payButton' => $cp->getPayButton($formName, $btnType, $btnSize) + ]); + } catch (\Exception $e) { + return $e->getMessage(); + } + } + + private function setConfig(){ + return new CinetPayment($this->getSiteId(), $this->getAppKey()); + } + + public function supported_currency_list() + { + return ['XOF', 'XAF', 'CDF', 'GNF', 'USD']; + } + + public function charge_currency() + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $this->getCurrency(); + } + return "USD"; + } + + public function gateway_name() + { + return 'cinetpay'; + } +} diff --git a/src/Base/Gateways/FlutterwavePay.php b/src/Base/Gateways/FlutterwavePay.php new file mode 100644 index 0000000..f728d5e --- /dev/null +++ b/src/Base/Gateways/FlutterwavePay.php @@ -0,0 +1,150 @@ +public_key = $public_key; + return $this; + } + public function getPublicKey(){ + return $this->public_key; + } + public function setSecretKey($secret_key){ + $this->secret_key = $secret_key; + return $this; + } + public function getSecretKey(){ + return $this->secret_key; + } + + /** + * @inheritDoc + * /** + * this payment gateway will not work without this package + * @ https://github.com/kingflamez/laravelrave + * */ + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $amount; + } + return $this->get_amount_in_usd($amount); + } + + /** + * @inheritDoc + * @param ['status','transaction_id','order_id' ] + */ + public function ipn_response(array $args = []) + { + $response = Http::withToken($this->getSecretKey())->get($this->getBaseUri() . "/transactions/" . request()->transaction_id . '/verify')->json(); + + $status = $response['status'] ?? ''; + + if ( $status === 'success'){ + $txRef = $response['data']['tx_ref']; + $order_id = $response['data']['meta']['metavalue']; + + return $this->verified_data([ + 'status' => 'complete', + 'transaction_id' => $txRef, + 'order_id' => substr( $order_id,5,-5) , + ]); + } + + return ['status' => 'failed' ]; + } + + /** + * @inheritDoc + * @param ['amount','title','description' ,'ipn_url','order_id','track','cancel_url', 'success_url' ,'email','name','payment_type'] + */ + public function charge_customer(array $args) + { + if(!in_array($this->getCurrency(),["NGN","XAF"]) && $this->charge_amount($args['amount']) > 1000){ + abort(405,__('We could not process your request due to your amount is higher than the maximum.')); + } + + + $order_id = random_int(12345,99999).$args['order_id'].random_int(12345,99999); + // Enter the details of the payment + $data = [ + 'payment_options' => 'card,banktransfer', + 'amount' =>$this->charge_amount($args['amount']), + 'email' => $args['email'], + 'tx_ref' => $this->getTxRef(), // a unique number with uuid as a transaction reference + 'currency' => $this->charge_currency(), + 'redirect_url' => $args['ipn_url'], + 'customer' => [ + 'email' => $args['email'], + "name" => $args['name'] + ], + "customizations" => [ + "title" => null, + "description" => $args['description'] + ], + 'meta' => [ + 'metaname' => 'order_id', 'metavalue' => $order_id, + ] + ]; + try { + $payment = Http::withToken($this->getSecretKey())->post( + $this->getBaseUri() . '/payments', + $data + )->json(); + }catch (\Exception $e){ + abort(500,$e->getMessage()); + } + + return redirect($payment['data']['link']); + } + + /** + * @inheritDoc + */ + public function supported_currency_list() + { + return ['BIF', 'CAD', 'CDF', 'CVE', 'EUR', 'GBP', 'GHS', 'GMD', 'GNF', 'KES', 'LRD', 'MWK', 'MZN', 'NGN', 'RWF', 'SLL', 'STD', 'TZS', 'UGX', 'USD', 'XAF', 'XOF', 'ZMK', 'ZMW', 'ZWD']; + } + + /** + * @inheritDoc + */ + public function charge_currency() + { + if (in_array($this->getCurrency(), $this->supported_currency_list())) { + return $this->getCurrency(); + } + return "USD"; + } + + /** + * @inheritDoc + */ + public function gateway_name() + { + return 'flutterwaverave'; + } + + + private function getBaseUri(){ + return 'https://api.flutterwave.com/v3'; + } + private function getTxRef(){ + return 'flw_' . uniqid(time()); + } + +} diff --git a/src/Base/Gateways/InstamojoPay.php b/src/Base/Gateways/InstamojoPay.php new file mode 100644 index 0000000..ff342c8 --- /dev/null +++ b/src/Base/Gateways/InstamojoPay.php @@ -0,0 +1,136 @@ +getCurrency(), $this->supported_currency_list())) { + return $amount; + } + return $this->get_amount_in_inr($amount); + } + + public function ipn_response(array $args = []) + { + $payment_id = request()->get('payment_id'); + $payment_request_id = request()->get('payment_request_id'); + $api_token = $this->setConfig(); + $result = Http::asForm() + ->withToken($api_token) + ->acceptJson() + ->get($this->base_url() . 'v2/payment_requests/' . $payment_request_id); + $response = $result->object(); + + if ($result->ok() && property_exists($response, 'status') && $response->status === 'Completed') { + $order_id = Str::of($response->purpose)->after('_ID_')->trim()->__toString(); + return $this->verified_data([ + 'transaction_id' => $payment_id, + 'order_id' => substr($order_id,5,-5) + ]); + } + return ['status' => 'failed']; + } + + /** + * @throws \Exception + */ + public function charge_customer(array $args) + { + $api_token = $this->setConfig(); + $charge_amount = $this->charge_amount($args['amount']); + $order_id = random_int(01234, 99999) . $args['order_id'] . random_int(01234, 99999); // not required to mask order for this payment gateway + $response = Http::asForm() + ->acceptJson() + ->withToken($api_token) + ->post($this->base_url() . 'v2/payment_requests/', [ + 'purpose' => $args['payment_type'] . '_ID_' . $order_id, + 'amount' => $charge_amount, + 'buyer_name' => $args['name'], + 'email' => $args['email'], +// 'phone' => $args['phone'] ?? random_int(123456789,999999999), //mobile number support will be available in future + 'redirect_url' => $args['ipn_url'], + 'send_email' => 'True', + 'send_sms' => 'False', //mobile number support will be available in future +// 'webhook' => '', //webhook option will be avilable in future + 'allow_repeated_payments' => 'False', + ]); + $res_body = $response->object(); + if (property_exists($res_body, 'longurl')) { + return redirect()->away($response->object()->longurl); + } else { + abort(405, 'something went wrong! , check your instamojo credentials were correct or not.'); + } + } + + public function supported_currency_list() + { + return ['INR']; + } + + public function charge_currency() + { + if (in_array($this->getCurrency(), $this->supported_currency_list())) { + return $this->getCurrency(); + } + return "INR"; + } + + public function gateway_name() + { + return 'instamojo'; + } + + protected function base_url() + { + $prefix = $this->getEnv() ? 'test' : 'api'; + return 'https://' . $prefix . '.instamojo.com/'; + } + + /* set app id */ + public function setClientId($client_id){ + $this->client_id = $client_id; + return $this; + } + /* set app secret */ + public function setSecretKey($secret_key){ + $this->secret_key = $secret_key; + return $this; + } + /* get app id */ + private function getClientId(){ + return $this->client_id; + } + /* get secret key */ + private function getSecretKey(){ + return $this->secret_key; + } + + protected function setConfig() + { + + $response = Http::asForm() + ->withBasicAuth($this->getClientId(), $this->getSecretKey()) + ->post($this->base_url() . 'oauth2/token/', [ + 'grant_type' => 'client_credentials', + ]); + if ($response->ok()) { + return $response->object()->access_token; + } + $response->throw(); + } +} diff --git a/src/Base/Gateways/Iyzipay.php b/src/Base/Gateways/Iyzipay.php new file mode 100644 index 0000000..bf9a838 --- /dev/null +++ b/src/Base/Gateways/Iyzipay.php @@ -0,0 +1,207 @@ +secretKay = $secretKay; + return $this; + } + + public function getSecretKey() + { + return $this->secretKay; + } + + public function setApiKey($apiKey) + { + $this->apiKey = $apiKey; + return $this; + } + + public function getApiKey() + { + return $this->apiKey; + } + + + /* + * charge_amount(); + * @required param list + * $amount + * + * + * */ + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())) { + return number_format($amount,2); + } + return $this->get_amount_in_usd($amount); + } + + + public function charge_customer($args) + { + $locationDetails = $this->getLocationDetails(request()->ip()); + $options = new Options(); + $options->setApiKey($this->getApiKey()); + $options->setSecretKey($this->getSecretKey()); + $options->setBaseUrl($this->baseApiUrl()); + + # create request class + $request = new \Iyzipay\Request\CreatePayWithIyzicoInitializeRequest(); + $request->setLocale(\Iyzipay\Model\Locale::EN); + $request->setConversationId(PaymentGatewayHelpers::wrapped_id($args['order_id'])); //order id + $request->setPrice($this->charge_amount($args['amount'])); //price + $request->setPaidPrice($this->charge_amount($args['amount'])); //price + $request->setCurrency($this->getCurrency()); + $request->setBasketId($args['payment_type']."__".PaymentGatewayHelpers::wrapped_id($args['order_id'])); //order id with payment type + $request->setPaymentGroup(\Iyzipay\Model\PaymentGroup::PRODUCT); + $request->setCallbackUrl($args['ipn_url']); //set a get callback + + $buyer = new \Iyzipay\Model\Buyer(); + $buyer->setId("___".($args['payment_type'] ?? 'Unknown')); + $buyer->setName($args['name']); + $buyer->setSurname("."); +// $buyer->setGsmNumber("+905350000000"); + $buyer->setEmail($args['email']); + $buyer->setIdentityNumber("11111111111");//dummy number + $buyer->setLastLoginDate("2018-07-06 11:11:11");//dummy date + $buyer->setRegistrationDate("2018-07-06 11:11:11"); //dummy date + $buyer->setRegistrationAddress("unknown"); + $buyer->setIp(request()->ip()); + $buyer->setCity($locationDetails['city']); + $buyer->setCountry($locationDetails['country']); +// $buyer->setZipCode("34732"); + $request->setBuyer($buyer); + + $billingAddress = new \Iyzipay\Model\Address(); + $billingAddress->setContactName($args['name']); + $billingAddress->setCity($locationDetails['city']); + $billingAddress->setCountry($locationDetails['country']); + $billingAddress->setAddress("Unknown"); +// $billingAddress->setZipCode("34742"); + $request->setBillingAddress($billingAddress); + + $basketItems = array(); + $firstBasketItem = new \Iyzipay\Model\BasketItem(); + $firstBasketItem->setId($args['payment_type']."__".PaymentGatewayHelpers::wrapped_id($args['order_id'])); + $firstBasketItem->setName($args['title']); + $firstBasketItem->setCategory1(($args['payment_type'] ?? 'Unknown')); + $firstBasketItem->setItemType(\Iyzipay\Model\BasketItemType::VIRTUAL); + $firstBasketItem->setPrice($this->charge_amount($args['amount'])); + $basketItems[0] = $firstBasketItem; + $request->setBasketItems($basketItems); + + # make request + $payWithIyzicoInitialize = \Iyzipay\Model\PayWithIyzicoInitialize::create($request, $options); + if ($payWithIyzicoInitialize->getStatus() === 'success'){ + return redirect()->away($payWithIyzicoInitialize->getPayWithIyzicoPageUrl()); + } + return redirect()->to($args['cancel_url']); + } + + /** + * @required param list + * $args['request'] + * $args['cancel_url'] + * $args['success_url'] + * + * return @void + * */ + public function ipn_response($args = []) + { + + + + $options = new Options(); + $options->setApiKey($this->getApiKey()); + $options->setSecretKey($this->getSecretKey()); + $options->setBaseUrl($this->baseApiUrl()); + + # create request class + $token = request()->get('token'); + $request = new \Iyzipay\Request\RetrievePayWithIyzicoRequest(); + $request->setLocale(\Iyzipay\Model\Locale::EN); + $request->setToken($token); + # make request + $payWithIyzico = \Iyzipay\Model\PayWithIyzico::retrieve($request,$options); + + if ($payWithIyzico->getStatus() === 'success'){ + $order_id = is_array($payWithIyzico->getPaymentItems()) && count($payWithIyzico->getPaymentItems()) > 0 ? Str::of(current($payWithIyzico->getPaymentItems())?->getItemId())->after('__')->toString() : 'unknown'; + $order_type = is_array($payWithIyzico->getPaymentItems()) && count($payWithIyzico->getPaymentItems()) > 0 ? Str::of(current($payWithIyzico->getPaymentItems())?->getItemId())->before('__')->toString() : 'unknown'; + return $this->verified_data([ + 'status' => 'complete', + 'transaction_id' => $payWithIyzico->getPaymentId(), + 'order_id' => PaymentGatewayHelpers::unwrapped_id($order_id), //get order id + 'payment_type' => $order_type //todo:: return reference + ]); + } + return $this->verified_data([ + 'status' => 'failed' + ]); + } + + /** + * geteway_name(); + * return @string + * */ + public function gateway_name() + { + return 'iyzipay'; + } + + /** + * charge_currency(); + * return @string + * */ + public function charge_currency() + { + if (in_array($this->getCurrency(), $this->supported_currency_list())) { + return $this->getCurrency(); + } + return "TRY"; + } + + /** + * supported_currency_list(); + * it will return all of supported currency for the payment gateway + * return array + * */ + public function supported_currency_list() + { + return ['TRY', 'USD', 'EUR', 'GBP','IRR','NOK','RUB','CHF']; + } + + private function baseApiUrl() + { + $prefix = $this->getEnv() ? 'sandbox-' : ''; + return "https://".$prefix."api.iyzipay.com"; + } + +} diff --git a/src/Base/Gateways/KineticPay.php b/src/Base/Gateways/KineticPay.php new file mode 100644 index 0000000..4391246 --- /dev/null +++ b/src/Base/Gateways/KineticPay.php @@ -0,0 +1,156 @@ +merchant_key = $merchant_key; + return $this; + } + + public function getMerchantKey(){ + return $this->merchant_key; + } + + public function setBank($bank){ + $this->bank = $bank; + return $this; + } + + public function getBank(){ + return $this->bank; + } + + /** + * to work this payment gateway you must have this laravel package + * */ + /** + * @inheritDoc + */ + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $amount; + } + return $this->get_amount_in_myr($amount); + } + + /** + * @inheritDoc + * return array('status','transaction_id','order_id'); + */ + public function ipn_response(array $args = []) + { + + $encoded_transaction_data = json_decode(request()['encoded_transaction_data']); + $order_id = $encoded_transaction_data?->record?->order_number; + if (empty($order_id)){ + abort(501, __("order id not found")); + } + + $url = "https://manage.kineticpay.my/payment/status"; + + + $res = Http::acceptJson()->get($url . '?merchant_key=' . $this->getMerchantKey() . '&invoice=' . (string) $order_id); + + if ($res->ok()){ + + $result = $res->object(); + $order_id = $result->invoice ?? ""; + $transaction_id = $result->id ?? ''; + + return $this->verified_data([ + 'status' => 'complete', + 'transaction_id' => $transaction_id , + 'order_id' => XgPaymentGateway::unwrapped_id($order_id ?? ""), + ]); + } + return ['status' => 'failed']; + } + + private function getBaseURL(){ + return 'https://manage.kineticpay.my/payment/'; + } + + /** + * @inheritDoc + * return array() + */ + public function charge_customer(array $args) + { + + $charge_amount = round($this->charge_amount($args['amount']), 2); + $order_id = XgPaymentGateway::wrapped_id($args['order_id']); + + if (empty($this->getBank())){ + abort(501,__("you must have to select a bank for pay with kineticpay")); + } + if (empty($this->getMerchantKey())){ + abort(501,__("merchant key not provided")); + } + + + + $data = [ + 'merchant_key' => $this->getMerchantKey(), + 'invoice' => $order_id, + 'amount' => $charge_amount, + 'description' => $args['description'], + 'bank' => $this->getBank(), + 'callback_success' => $args['ipn_url'], //POST URL + 'callback_error' => $args['cancel_url'], + 'callback_status' => $args['ipn_url']."?orderid=" . $order_id + ]; + + // API Endpoint URL + $url = "https://manage.kineticpay.my/payment/create"; + $res = Http::acceptJson()->post($url,$data); + $result = $res->object(); + if (is_object($result) && property_exists($result,"html")){ + return $result?->html; + } + + abort(501,__("failed to connect kineticpay server.")); + } + + /** + * @inheritDoc + */ + public function supported_currency_list() + { + return ['MYR']; + } + + /** + * @inheritDoc + */ + public function charge_currency() + { + if (in_array($this->getCurrency(), $this->supported_currency_list())) { + return $this->getCurrency(); + } + return "MYR"; + } + + /** + * @inheritDoc + */ + public function gateway_name() + { + return 'kineticpay'; + } +} diff --git a/src/Base/Gateways/MercadoPagoPay.php b/src/Base/Gateways/MercadoPagoPay.php new file mode 100644 index 0000000..beff738 --- /dev/null +++ b/src/Base/Gateways/MercadoPagoPay.php @@ -0,0 +1,153 @@ +getCurrency(), $this->supported_currency_list(), true)){ + return $amount; + } + return $this->get_amount_in_brl($amount); + } + + /** + * get_amount_in_brl() + * @since 1.0.0 + * this function return any amount to usd based on user given currency conversation value, + * it will not work if admin did not give currency conversation rate + * */ + protected function get_amount_in_brl($amount){ + if ($this->getCurrency() === 'BRL'){ + return $amount; + } + $payable_amount = $this->make_amount_in_brl($amount, $this->getCurrency()); + if ($payable_amount < 1) { + return $payable_amount . __('amount is not supported by '.$this->gateway_name()); + } + return $payable_amount; + } + + /** + * convert amount to brl currency base on conversation given by admin + * */ + protected function make_amount_in_brl($amount,$currency){ + $output = 0; + $all_currency = GlobalCurrency::script_currency_list(); + foreach ($all_currency as $cur => $symbol) { + if ($cur === 'BRL') { + continue; + } + if ($cur == $currency) { + $exchange_rate = !empty($this->getExchangeRate()) ? $this->getExchangeRate() : config('paymentgateway.brl_exchange_rate'); + $output = $amount * $exchange_rate ; + } + } + return $output; + } + + public function ipn_response(array $args = []) + { + $this->setAccessToken(); + $request = request(); + $return_status = $request->status; + $return_merchant_order_id = $request->merchant_order_id; + $return_payment_id = $request->payment_id; + $payment_details = \MercadoPago\Payment::find_by_id($return_payment_id); + $order_id = $payment_details->order->id; + $payment_status = $payment_details->status; + $payment_metadata =$payment_details->metadata; + $payment_metadata_order_id =$payment_details->metadata->order_id; + + if ($return_status === $payment_status && $return_merchant_order_id === $order_id){ + return $this->verified_data([ + 'transaction_id' => $return_payment_id, + 'order_id' => substr($payment_metadata_order_id,5,-5) + ]); + } + return ['status' => 'failed']; + } + + public function charge_customer(array $args) + { + + $charge_amount = $this->charge_amount($args['amount']); + $order_id = random_int(01234,99999).$args['order_id'].random_int(01234,99999); + $this->setAccessToken(); + $preference = new \MercadoPago\Preference(); + # Building an item + $item = new \MercadoPago\Item(); + $item->id = $order_id; + $item->title = $args['title']; + $item->quantity = 1; + $item->unit_price = $charge_amount; + + $preference->items = array($item); + + $preference->back_urls = array( + "success" => $args['ipn_url'], + "failure" => $args['cancel_url'], + "pending" => $args['cancel_url'] + ); + $preference->auto_return = "approved"; + $preference->metadata = array( + "order_id" => $order_id, + ); + $preference->save(); # Save the preference and send the HTTP Request to create + + return redirect()->away($preference->init_point); + + } + protected function setAccessToken(){ + return \MercadoPago\SDK::setAccessToken($this->getClientSecret()); + } + + public function supported_currency_list() + { + return ['BRL','ARS','BOB','CLF','CLP','COP','CRC','CUC','CUP','DOP','EUR','GTQ','HNL','MXN','NIO','PAB','PEN','PYG','USD','UYU','VEF','VES']; + } + + public function charge_currency() + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $this->getCurrency(); + } + return "BRL"; + } + + /* set app secret */ + public function setClientSecret($client_secret){ + $this->client_secret = $client_secret; + return $this; + } + /* get app id */ + private function getClientSecret(){ + return $this->client_secret; + } + /* get app id */ + private function getClientId(){ + return $this->client_id ; + } + /* set app id */ + public function setClientId($client_id){ + $this->client_id = $client_id; + return $this; + } + + public function gateway_name() + { + return 'mercadopago'; + } +} diff --git a/src/Base/Gateways/MidtransPay.php b/src/Base/Gateways/MidtransPay.php new file mode 100644 index 0000000..62b9117 --- /dev/null +++ b/src/Base/Gateways/MidtransPay.php @@ -0,0 +1,202 @@ +getCurrency(), $this->supported_currency_list())){ + return $amount; + } + return $this->get_amount_in_idr($amount); + } + + /** + * convert amount to idr currency base on conversation given by admin + * */ + private function make_amount_in_idr($amount, $currency) + { + $output = 0; + $all_currency = GlobalCurrency::script_currency_list(); + foreach ($all_currency as $cur => $symbol) { + if ($cur == 'IDR') { + continue; + } + if ($cur == $currency) { + $exchange_rate = $this->getExchangeRate(); + $output = $amount * $exchange_rate; + } + } + + return $output; + } + /** + * get_amount_in_idr() + * @since 1.0.0 + * this function return any amount to usd based on user given currency conversation value, + * it will not work if admin did not give currency conversation rate + * */ + protected function get_amount_in_idr($amount){ + if ($this->getCurrency() === 'IDR'){ + return $amount; + } + $payable_amount = $this->make_amount_in_idr($amount, $this->getCurrency() ); + if ($payable_amount < 1) { + return $payable_amount . __('amount is not supported by '.$this->gateway_name()); + } + return $payable_amount; + } + + + /** + * @required param list + * $args['amount'] + * $args['description'] + * $args['item_name'] + * $args['ipn_url'] + * $args['cancel_url'] + * $args['payment_track'] + * return redirect url for paypal + * */ + + public function charge_customer($args) + { + $order_id = random_int(12345,99999).$args['order_id'].random_int(12345,99999); + $this->setConfig([ + 'order_id' => $order_id, + 'ipn_url' => $args['ipn_url'] + ]); + $params = array( + 'transaction_details' => array( + 'order_id' => $order_id, + 'gross_amount' => ceil($this->charge_amount($args['amount'])), + ), + "callbacks" => [ + "finish" => $args['ipn_url'] + ] + ); + + session()->put('midtrans_last_order_id',$order_id); + try { + $paymentUrl = \Midtrans\Snap::createTransaction($params)->redirect_url; + return redirect()->away($paymentUrl); + } + catch (\Exception $e) { + return $e->getMessage(); + } + } + + + /** + * @required param list + * $args['request'] + * $args['cancel_url'] + * $args['success_url'] + * + * return @void + * */ + public function ipn_response($args = []){ + + $midtrans_last_order_id = session()->get('midtrans_last_order_id'); + session()->forget('midtrans_last_order_id'); + if (empty($midtrans_last_order_id)){ + abort(405,'midtrans order missing'); + } + if ($midtrans_last_order_id !== request()->get('order_id')){ + abort(403); + } + $this->setConfig([ + 'order_id' => $midtrans_last_order_id, + 'ipn_url' => $args['ipn_url'] ?? '' + ]); + + $status = \Midtrans\Transaction::status($midtrans_last_order_id); + $status_message = Str::contains($status->status_message,['Success']); + if (in_array($status->transaction_status, ['settlement','capture']) && $status->fraud_status === 'accept' && $status_message ){ + return $this->verified_data(['transaction_id' => $status->transaction_id,'order_id' => substr($midtrans_last_order_id,5,-5)]); + } + + abort(404); + } + + /** + * geteway_name(); + * return @string + * */ + public function gateway_name(){ + return 'midtrans'; + } + /** + * charge_currency(); + * return @string + * */ + public function charge_currency() + { + if (in_array($this->getCurrency(), $this->supported_currency_list())) { + return $this->getCurrency(); + } + return "IDR"; + } + /** + * supported_currency_list(); + * it will returl all of supported currency for the payment gateway + * return array + * */ + public function supported_currency_list(){ + return ['IDR']; + } + + /* set app id */ + public function setClientKey($client_key){ + $this->client_key = $client_key; + return $this; + } + /* set app secret */ + public function setServerKey($server_key){ + $this->server_key = $server_key; + return $this; + } + /* get app id */ + private function getClientKey(){ + return $this->client_key; + } + /* get secret key */ + private function getServerKey(){ + return $this->server_key; + } + + + private function setConfig(array $args = []) + { + // Set your Merchant Server Key + \Midtrans\Config::$serverKey = $this->getServerKey(); +// Set to Development/Sandbox Environment (default). Set to true for Production Environment (accept real transaction). + \Midtrans\Config::$isProduction = !$this->getEnv(); +// Set sanitization on (default) + \Midtrans\Config::$isSanitized = true; +// Set 3DS transaction for credit card to true + \Midtrans\Config::$is3ds = true; + \Midtrans\Config::$overrideNotifUrl = $args['ipn_url']; + \Midtrans\Config::$paymentIdempotencyKey = $args['order_id']; + } + + +} diff --git a/src/Base/Gateways/MolliePay.php b/src/Base/Gateways/MolliePay.php new file mode 100644 index 0000000..943712a --- /dev/null +++ b/src/Base/Gateways/MolliePay.php @@ -0,0 +1,173 @@ +api_key = $key; + return $this; + } + + public function getApiKey(){ + return $this->api_key; + } + + use PaymentEnvironment,CurrencySupport,ConvertUsdSupport; + /** + * to work this payment gateway you must have this laravel package + * https://github.com/mollie/laravel-mollie + * */ + /** + * @inheritDoc + */ + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $amount; + } + return $this->get_amount_in_usd($amount); + } + + /** + * @inheritDoc + * return array('status','transaction_id','order_id'); + */ + public function ipn_response(array $args = []) + { + $this->setConfig(); + $payment_id = session()->get('mollie_payment_id'); + $payment = Mollie::api()->payments->get($payment_id); + session()->forget('mollie_payment_id'); + + if ($payment->isPaid()) { + return $this->verified_data([ + 'status' => 'complete', + 'transaction_id' => $payment->id, + 'order_id' => substr($payment->metadata->order_id,5,-5) + ]); + } + return ['status' => 'failed']; + } + + /** + * @inheritDoc + * return array() + */ + public function charge_customer(array $args) + { + $this->setConfig(); + $charge_amount = round($this->charge_amount($args['amount']), 2); + $order_id = random_int(12345,99999).$args['order_id'].random_int(12345,99999); + try{ + $payment = Mollie::api()->payments->create([ + "amount" => [ + "currency" => $this->charge_currency(), + "value" => number_format( $charge_amount, 2, '.', ''),//"10.00" // You must send the correct number of decimals, thus we enforce the use of strings + ], + "description" => $args['description'], + "redirectUrl" => $args['ipn_url'], + "metadata" => [ + "order_id" => $order_id, + "track" => $args['track'], + ], + ]); + + }catch(\Exception $e){ + $msg = ''; + switch($e->getCode()){ + case(400): + $msg = __('Bad Request – The Mollie API was unable to understand your request. There might be an error in your syntax.'); + break; + case(401): + $msg = __('Unauthorized – Your request was not executed due to failed authentication. Check your API key.'); + break; + case(403): + $msg = __('Forbidden – You do not have access to the requested resource.'); + break; + case(404): + $msg = __('Not Found – The object referenced by your URL does not exist.'); + break; + case(405): + $msg = __('Method Not Allowed – You are trying to use an HTTP method that is not applicable on this URL or resource. Refer to the Allow header to see which methods the endpoint supports.'); + break; + case(409): + $msg = __('Conflict – You are making a duplicate API call that was probably a mistake (only in v2).'); + break; + case(410): + $msg = __('Gone – You are trying to access an object, which has previously been deleted (only in v2).'); + break; + case(415): + $msg = __('Unsupported Media Type – Your request’s encoding is not supported or is incorrectly understood. Please always use JSON.'); + break; + case(422): + $msg = $e->getMessage(); + break; + case(429): + $msg = __('Too Many Requests – Your request has hit a rate limit. Please wait for a bit and retry.'); + break; + case(500): + $msg = __('Internal Server Error – An internal server error occurred while processing your request. Our developers are notified automatically, but if you have any information on how you triggered the problem, please contact us.'); + break; + case(502): + $msg = __('Bad Gateway – The service is temporarily unavailable, either due to calamity or (planned) maintenance. Please retry the request at a later time.'); + break; + case(503): + $msg = __('Service Unavailable – The service is temporarily unavailable, either due to calamity or (planned) maintenance. Please retry the request at a later time.'); + break; + case(504): + $msg = __('Gateway Timeout – Your request is causing an unusually long process time.'); + break; + default: + $msg = $charge_amount.' '.config('paymentgateway.global_currency').' '. __('This amount is higher than the maximum.'); + break; + } + abort(405,$msg); + } + + $payment = Mollie::api()->payments->get($payment->id); + + session()->put('mollie_payment_id', $payment->id); + return redirect($payment->getCheckoutUrl(), 303); + } + + /** + * @inheritDoc + */ + public function supported_currency_list() + { + return ['AED', 'AUD', 'BGN', 'BRL', 'CAD', 'CHF', 'CZK', 'DKK', 'EUR', 'GBP', 'HKD', 'HRK', 'HUF', 'ILS', 'ISK', 'JPY', 'MXN', 'MYR', 'NOK', 'NZD', 'PHP', 'PLN', 'RON', 'RUB', 'SEK', 'SGD', 'THB', 'TWD', 'USD', 'ZAR']; + } + private function setConfig(){ + Config::set([ + 'mollie.key' => $this->getApiKey() + ]); + } + /** + * @inheritDoc + */ + public function charge_currency() + { + if (in_array($this->getCurrency(), $this->supported_currency_list())) { + return $this->getCurrency(); + } + return "USD"; + } + + /** + * @inheritDoc + */ + public function gateway_name() + { + return 'mollie'; + } +} diff --git a/src/Base/Gateways/PagaliPay.php b/src/Base/Gateways/PagaliPay.php new file mode 100644 index 0000000..2520574 --- /dev/null +++ b/src/Base/Gateways/PagaliPay.php @@ -0,0 +1,101 @@ +pageId; + } + public function setPageId($pageId){ + $this->pageId = $pageId; + return $this; + } + + public function getEntityId(){ + return $this->entityId; + } + public function setEntityId($entityId){ + $this->entityId = $entityId; + return $this; + } + + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $amount; + } + return $this->get_amount_in_usd($amount); + } + + public function ipn_response(array $args = []) + { + //todo:: write code for verify payment + $payment_status = request()->payment_status; + $order_id = request()->order_id; + $get_host = parse_url(request()->headers->get('referer'), PHP_URL_HOST); + if ($payment_status === 'Completed'){ + request()->getUri(); + return $this->verified_data([ + 'status' => 'complete', + 'order_id' => substr( request()->order_id,5,-5) + ]); + } + return ['status' => 'failed','order_id' => substr( request()->order_id,5,-5)]; + } + + public function pagali_view($args){ + return view('paymentgateway::pagali', ['pagali_data' => array_merge($args,[ + 'order_id' => PaymentGatewayHelpers::wrapped_id($args['order_id']), + 'page_id' => $this->getPageId(), + 'currency' => $this->getCurrency(), + 'entity_id' => $this->getEntityId(), + 'charge_amount' => $this->charge_amount($args['amount']), + ])]); + } + + /** + * @throws \Exception + */ + public function charge_customer(array $args) + { + $order_id = PaymentGatewayHelpers::wrapped_id($args['order_id']); + //build the argument for pagali blade file + return $this->pagali_view($args); + } + + public function supported_currency_list() + { + return ['MYR','USD','EUR','CVE']; + } + + public function charge_currency() + { + return 'USD'; + } + + public function gateway_name() + { + return 'pagali'; + } +} diff --git a/src/Base/Gateways/PayFastPay.php b/src/Base/Gateways/PayFastPay.php new file mode 100644 index 0000000..85729c6 --- /dev/null +++ b/src/Base/Gateways/PayFastPay.php @@ -0,0 +1,163 @@ +merchant_id = $merchant_id; + return $this; + } + public function getMerchantId(){ + return $this->merchant_id; + } + public function setMerchantKey($merchant_key){ + $this->merchant_key = $merchant_key; + return $this; + } + public function getMerchantKey(){ + return $this->merchant_key; + } + public function setPassphrase($passphrase){ + $this->passphrase = $passphrase; + return $this; + } + public function getPassphrase(){ + return $this->passphrase; + } + + /** + * @inheritDoc + * + * this payment gateway will not work without this package + * @ https://github.com/kingflamez/laravelrave + * + */ + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $this->is_decimal($amount) ? $amount : number_format((float)$amount,2,'.',''); + } + return $this->is_decimal( $this->get_amount_in_zar($amount)) ? $this->get_amount_in_zar($amount) :number_format((float) $this->get_amount_in_zar($amount),2,'.',''); + } + + /** + * @inheritDoc + * * @param array $args + * @required param list + * request + * + * @return array + */ + public function ipn_response(array $args = []) + { + $this->setConfig(); + $payfast = new \Billow\Payfast(); + $payfast->setMerchant([ + 'merchant_id' => $this->getMerchantId(), // TEST Credentials. Replace with your merchant ID from Payfast. + 'merchant_key' => $this->getMerchantKey(), // TEST Credentials. Replace with your merchant key from Payfast. + ]); + $payfast->setPassphrase($this->getPassphrase()); + $status = $payfast->verify( request(), request()->amount_gross, request()->m_payment_id)->status(); + $return_val = ['status' => 'failed']; + // Handle the result of the transaction. + switch( $status ) + { + case 'COMPLETE': // Things went as planned, update your order status and notify the customer/admins. + $return_val = $this->verified_data([ + 'status' => 'complete', + 'order_id' => substr( request()->m_payment_id,5,-5) , + 'transaction_id' => request()->pf_payment_id, + ]); + break; + case 'FAILED': // We've got problems, notify admin and contact Payfast Support. + $return_val = $this->verified_data([ + 'status' => 'failed', + 'order_id' => substr( request()->m_payment_id,5,-5) + ]); + break; + case 'PENDING': // We've got problems, notify admin and contact Payfast Support. + break; + default: // We've got problems, notify admin to check logs. + break; + } + + return $return_val; + } + + /** + * @inheritDoc + */ + public function charge_customer(array $args) + { + if($this->charge_amount($args['amount']) > 500000){ + return back()->with(['msg' => __('We could not process your request due to your amount is higher than the maximum.'),'type' => 'danger']); + } + $this->setConfig(); + $order_id = random_int(12345,99999).$args['order_id'].random_int(12345,99999); + $payfast = new \Billow\Payfast(); + $payfast->setMerchant([ + 'merchant_id' => $this->getMerchantId(), // TEST Credentials. Replace with your merchant ID from Payfast. + 'merchant_key' => $this->getMerchantKey(), // TEST Credentials. Replace with your merchant key from Payfast. + 'return_url' => $args['success_url'], // Redirect URL on Success. + 'cancel_url' => $args['cancel_url'], // Redirect URL on Cancellation. + 'notify_url' => $args['ipn_url'], // ITN URL. + ]); + $payfast->setPassphrase($this->getPassphrase()); + $payfast->setBuyer( $args['name'], null, $args['email']); + $payfast->setAmount($this->charge_amount($args['amount'])); + $payfast->setItem( $args['description'] , null); + $payfast->setMerchantReference($order_id); + $payfast->setCancelUrl($args['cancel_url']); + $payfast->setReturnUrl($args['success_url']); + $payfast->setNotifyUrl($args['ipn_url']); + $submit_form = $payfast->paymentForm(__('Pay Now')); + + return view('paymentgateway::payfast',compact('submit_form')); + } + + /** + * @inheritDoc + */ + public function supported_currency_list() + { + return ['ZAR']; + } + + /** + * @inheritDoc + */ + public function charge_currency() + { + if (in_array($this->getCurrency(), $this->supported_currency_list())) { + return $this->getCurrency(); + } + return "ZAR"; + } + + /** + * @inheritDoc + */ + public function gateway_name() + { + return 'payfast'; + } + + protected function setConfig(){ + Config::set([ + 'payfast.testing' => $this->getEnv(), // Set to false when in production. + ]); + } +} diff --git a/src/Base/Gateways/PayTabsPay.php b/src/Base/Gateways/PayTabsPay.php new file mode 100644 index 0000000..5e730dc --- /dev/null +++ b/src/Base/Gateways/PayTabsPay.php @@ -0,0 +1,138 @@ +profile_id = $profile_id; + return $this; + } + public function getProfileId(){ + return $this->profile_id; + } + + public function setRegion(string $region = 'GLOBAL'): PayTabsPay + { + $this->region = $region; + return $this; + } + public function getRegion(){ + return $this->region; + } + + public function setServerKey($server_key): PayTabsPay + { + $this->server_key = $server_key; + return $this; + } + public function getServerKey(){ + return $this->server_key; + } + + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $amount; + } + return $this->get_amount_in_usd($amount); + } + + public function ipn_response(array $args = []) + { + $transaction_id = request()->tranRef; + if (!empty($transaction_id)) { + try { + $this->setConfig(); + $transaction = Paypage::queryTransaction($transaction_id); + if ($transaction->success){ + return $this->verified_data([ + 'transaction_id' => $transaction->transaction_id, + 'order_id' => substr($transaction->cart_id,5,-5) + ]); + } + } catch (\Exception $e) { + // Une erreur s'est produite + return "Erreur :" . $e->getMessage(); + } + } + return ['status' => 'failed']; + } + + /** + * @throws \Exception + */ + public function charge_customer(array $args) + { + + $this->setConfig(); + + $order_id = random_int(12345,99999).$args['order_id'].random_int(12345,99999); + + try { + $pay= paypage::sendPaymentCode('all') + ->sendTransaction('sale',PaytabsEnum::TRAN_CLASS_ECOM) +// ->sendTransaction('sale') + ->sendCart($order_id,$this->charge_amount($args['amount']), $args['description']) //1st param cart id or oorder id, 2nd param charge amount , 3rd param card description +// ->sendCustomerDetails('Walaa Elsaeed', 'w.elsaeed@paytabs.com', '0101111111', 'test', 'Nasr City', 'Cairo', 'EG', '1234','100.279.20.10') // 1st param name, 2nd param email, 3rd param phone, +// ->sendShippingDetails('Walaa Elsaeed', 'w.elsaeed@paytabs.com', '0101111111', 'test', 'Nasr City', 'Cairo', 'EG', '1234','100.279.20.10') + ->sendURLs( $args['ipn_url'],$args[ 'success_url']) //first param is callback_url, 2nd param is return url + ->sendLanguage('en') + ->sendHideShipping(true) +// ->sendFramed(true) + ->create_pay_page(); + return $pay; + + }catch (\Exception $e){ + abort(401,$e->getMessage()); + } + } + + private function setConfig(){ + \Config::set([ + 'paytabs.currency' => $this->getCurrency(), //['AED','EGP','SAR','OMR','JOD','USD'] + 'paytabs.profile_id' => $this->getProfileId(), + 'paytabs.region' => $this->getRegion(), // ['ARE','EGY','SAU','OMN','JOR','GLOBAL'] + 'paytabs.server_key' => $this->getServerKey() + ]); + + } + + public function supported_currency_list() : array + { + return ['AED','EGP','SAR','OMR','JOD','USD']; + } + + public function charge_currency() : string + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $this->getCurrency(); + } + return "USD"; + } + + public function gateway_name() : string + { + return 'paytabs'; + } +} diff --git a/src/Base/Gateways/PayUmoneyPay.php b/src/Base/Gateways/PayUmoneyPay.php new file mode 100644 index 0000000..7fe4969 --- /dev/null +++ b/src/Base/Gateways/PayUmoneyPay.php @@ -0,0 +1,111 @@ + 'JP***g', + 'txnid' => 'xVoehYja6N6UXo', + 'amount'=>'10.00', + 'firstname'=> "PayU User", + 'email' => 'test@gmail.com', + 'phone' => '9876543210', + 'productinfo'=>'iPhone', + 'bankcode' => '', // nor required + 'surl'=>'https://apiplayground-response.herokuapp.com/', // success url + 'furl' => 'https://apiplayground-response.herokuapp.com/', //failed url, +// 'hash'=> '33e5d638040036ba195049cb0d75cbc37cf8345a52a5478503462bb75f79d2d8b9d18c444438a725f5e514e54d566be9a6b201b371da9119fa9a0f9b5e956309' + 'hash'=> $this->createHash($args) + ]; + $data = "key=JP***g&txnid=xVoehYja6N6UXo&amount=10.00&firstname=PayU User&email=test@gmail.com&phone=9876543210&productinfo=iPhone&pg=&bankcode=&surl=https://apiplayground-response.herokuapp.com/&furl=https://apiplayground-response.herokuapp.com/&ccnum=&ccexpmon=&ccexpyr=&ccvv=&ccname=&txn_s2s_flow=&hash=33e5d638040036ba195049cb0d75cbc37cf8345a52a5478503462bb75f79d2d8b9d18c444438a725f5e514e54d566be9a6b201b371da9119fa9a0f9b5e956309"; + +curl_setopt($req, CURLOPT_POSTFIELDS, $data); +$resp = curl_exec($req); +curl_close($req); +var_dump($resp); + + // TODO: Implement charge_customer() method. + // Generated by curl-to-PHP: http://incarnate.github.io/curl-to-php/ +// $ch = curl_init(); +// +// curl_setopt($ch, CURLOPT_URL, 'https://test.payu.in/_payment-H'); +// curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); +// curl_setopt($ch, CURLOPT_POST, 1); +// +// // generate hash +// curl_setopt($ch, CURLOPT_POSTFIELDS, "key=mji6olvE&txnid=SU0CsnMBP2AYQt&amount=10.00&firstname=PayU User&email=test@gmail.com&phone=9876543210&productinfo=iPhone&surl=https://apiplayground-response.herokuapp.com/&furl=https://apiplayground-response.herokuapp.com/&hash=3fe4bb610aaa84ed23ff1f3605e0e58d8613895cdf68ffd890d9954b41ecaa788f635851db20c9a8735b53d220676847328b9e7836920c75d51a1c17122cc651"); +// +// $headers = array(); +// $headers[] = 'Content-Type: application/x-www-form-urlencoded'; +// curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); +// +// $result = curl_exec($ch); +// if (curl_errno($ch)) { +// echo 'Error:' . curl_error($ch); +// } +// curl_close($ch); +// return $result; +// dd($result); + } + + public function supported_currency_list() + { + // TODO: Implement supported_currency_list() method. + } + + public function charge_currency() + { + // TODO: Implement charge_currency() method. + } + + public function gateway_name() + { + // TODO: Implement gateway_name() method. + } + + protected function createHash($args){ + $hashSequence = "key|txnid|amount|productinfo|firstname|email|udf1|udf2|udf3|udf4|udf5|udf6|udf7|udf8|udf9|udf10"; + + //$posted['productinfo'] = json_encode(json_decode('[{"name":"tutionfee","description":"","value":"500","isRequired":"false"},{"name":"developmentfee","description":"monthly tution fee","value":"1500","isRequired":"false"}]')); + $hashVarsSeq = explode('|', $hashSequence); + $hash_string = ''; + foreach($hashVarsSeq as $hash_var) { + $hash_string .= isset($posted[$hash_var]) ? $posted[$hash_var] : ''; + $hash_string .= '|'; + } + + $hash_string .= $SALT; + + + $hash = strtolower(hash('sha512', $hash_string)); + } +} diff --git a/src/Base/Gateways/PaymobPay.php b/src/Base/Gateways/PaymobPay.php new file mode 100644 index 0000000..4cd9044 --- /dev/null +++ b/src/Base/Gateways/PaymobPay.php @@ -0,0 +1,624 @@ +walletMobileNumber = $walletMobileNumber; + return $this; + } + + public function getWalletMobileNumber() + { + return $this->walletMobileNumber; + } + + public function setPublicKey($publicKey) + { + $this->publicKey = $publicKey; + return $this; + } + + public function getPublicKey() + { + return $this->publicKey; + } + + public function setSecretKey($secretKay) + { + $this->secretKay = $secretKay; + return $this; + } + + public function getSecretKey() + { + return $this->secretKay; + } + + + public function setIframeId($iframeId) + { + $this->iframeId = $iframeId; + return $this; + } + + public function getIframeId() + { + return $this->iframeId; + } + + public function setGatewayType($gatewayType) + { + $this->gatewayType = $gatewayType; + return $this; + } + + public function getGatewayType() + { + return $this->gatewayType; + } + + public function setApiKey($apiKey) + { + $this->apiKey = $apiKey; + return $this; + } + + public function getApiKey() + { + return $this->apiKey; + } + + public function setHmacSecret($hmacSecret) + { + $this->hmacSecret = $hmacSecret; + return $this; + } + + public function getHmacSecret() + { + return $this->hmacSecret; + } + + public function setIntegrationId($integrationId) + { + $this->integrationId = $integrationId; + return $this; + } + + public function getIntegrationId() + { + return $this->integrationId; + } + + + /* + * charge_amount(); + * @required param list + * $amount + * + * + * */ + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())) { + return $amount * 100; + } + return $this->get_amount_in_usd($amount) * 100; + } + + + /** + * @required param list + * $args['amount'] + * $args['description'] + * $args['item_name'] + * $args['ipn_url'] + * $args['cancel_url'] + * $args['payment_track'] + * return redirect url for + * */ + + public function charge_customer($args) + { + $authorize_token = $this->authentication_request(); + /* make eCommerce Order */ + $order_request = $this->order_registration_request($authorize_token,$args); + + /* work on payment key request */ + $payment_key_request_token = $this->payment_key_request($authorize_token,$args,($order_request['order_id'] ?? "")); + + $payment_url = ''; + + + /** + Available Gateway Type + * + "accept-online" //card payment + "accept-kiosk" + "accept-wallet" + "accept-valu" + "accept-installments" + "accept-sympl" + "accept-premium" + "accept-souhoola" + "accept-shahry" + "accept-get_go" + "accept-lucky" + "accept-forsa" + "accept-tabby" + "accept-nowpay" + * */ + + /* get payment page url based on the payment gateway type */ + if ($this->getGatewayType() === 'accept-online'){ + $payment_url = 'https://accept.paymobsolutions.com/api/acceptance/iframes/'.$this->getIframeId().'?payment_token='.$payment_key_request_token; + }elseif ($this->getGatewayType() === 'accept-valu'){ + /* iframe id should be fore valU */ + $payment_url = 'https://accept.paymobsolutions.com/api/acceptance/iframes/'.$this->getIframeId().'?payment_token='.$payment_key_request_token; + }elseif ($this->getGatewayType() === 'accept-kiosk'){ + // api request for kiosk, need to show bill_reference to the user for pay it from koisok + $bill_reference = $this->process_kiosk_payment_request($payment_key_request_token,$authorize_token,$args); + return "your kiosk payment bill reference id:". $bill_reference; + }elseif ($this->getGatewayType() === 'accept-wallet'){ + //todo:: call wallet api and redirect them to redirect_url + $redirect_url = $this->process_wallet_payment_request($payment_key_request_token,$authorize_token,$args); + return redirect()->away($redirect_url); + } + return view('paymentgateway::paymob',[ + "payment_url" => $payment_url + ]); + } + + + /** + * @required param list + * $args['request'] + * $args['cancel_url'] + * $args['success_url'] + * + * return @void + * */ + public function ipn_response($args = []) + { + + $request = request(); + + //todo:: need to check it is is post or get request, + //post request mean == transaction process callback + //get request mean == transaction response callback + + //todo:: need to verify hmac + $request_method = strtolower($request->method()); + $hmac_type = $request_method === 'get' ? 'TRANSACTION' : 'TRANSACTION'; + $hash_value = $this->getHasvalue(); + $order_id = request()->get('merchant_order_id'); + + $callback_type = 'TRANSACTION'; + if (strtolower(request()->method()) === 'post') { + $callback_type = request()->type; + } + + if(hash_equals($hash_value,$request->hmac)){ + if ($request_method === 'post'){ + //handle post request + if ($callback_type == 'TRANSACTION') { + if ( + $request->success === true && + $request->is_voided === false && + $request->is_refunded === false && + $request->pending === false && + $request->is_void === false && + $request->is_refund === false && + $request->error_occured === false + ) { + return $this->verified_data([ + 'status' => 'processing', + 'order_id' => PaymentGatewayHelpers::unwrapped_id($order_id), + 'order_type' => null + ]); + } else if ( + $request->success === true && + $request->is_refunded === true && + $request->is_voided === false && + $request->pending === false && + $request->is_void === false && + $request->is_refund === false + ) { + return $this->verified_data([ + 'status' => 'refunded', + 'order_id' => PaymentGatewayHelpers::unwrapped_id($order_id), + 'order_type' => null + ]); + + } else if ( + $request->success === true && + $request->is_voided === true && + $request->is_refunded === false && + $request->pending === false && + $request->is_void === false && + $request->is_refund === false + ) { + return $this->verified_data([ + 'status' => 'cancelled', + 'order_id' => PaymentGatewayHelpers::unwrapped_id($order_id), + 'order_type' => null + ]); + + } else if ( + $request->success === false && + $request->is_voided === false && + $request->is_refunded === false && + $request->is_void === false && + $request->is_refund === false + ) { + return $this->verified_data([ + 'status' => 'pending-payment', + 'order_id' => PaymentGatewayHelpers::unwrapped_id($order_id), + 'order_type' => null + ]); + } + }else if ($callback_type == 'TOKEN'){ + //handle if token accept + } + + }elseif ($request_method === 'get'){ + //handle get request + + if ( + $request->success === "true" && + $request->is_voided === "false" && + $request->is_refunded === "false" && + $request->pending === "false" && + $request->is_void === "false" && + $request->is_refund === "false" && + $request->error_occured === "false" + ) { + return $this->verified_data([ + 'status' => 'complete', + 'transaction_id' => request()->get('id'), + 'order_id' => PaymentGatewayHelpers::unwrapped_id($order_id), + 'order_type' => null + ]); + } + elseif($request->data_message ==="Approved" ) { + return $this->verified_data([ + 'status' => 'complete', + 'transaction_id' => request()->get('id'), + 'order_id' => PaymentGatewayHelpers::unwrapped_id($order_id), + 'order_type' => null + ]); + } + } + } + + return $this->verified_data([ + 'status' => 'failed', + 'order_id' => PaymentGatewayHelpers::unwrapped_id($order_id), + 'order_type' => null + ]); + } + + /** + * geteway_name(); + * return @string + * */ + public function gateway_name() + { + return 'paymob'; + } + + /** + * charge_currency(); + * return @string + * */ + public function charge_currency() + { + if (in_array($this->getCurrency(), $this->supported_currency_list())) { + return $this->getCurrency(); + } + return "EGP"; + } + + /** + * supported_currency_list(); + * it will returl all of supported currency for the payment gateway + * return array + * */ + public function supported_currency_list() + { + $supported_currency = ['EGP']; + if ($this->getGatewayType() === "accept-online"){ + $supported_currency = ['EGP', 'USD', 'EUR', 'GBP']; + } + return $supported_currency; + } + + + private function base_api_url() { + return 'https://accept.paymob.com/api/'; + } + + private function authentication_request() { + $url = $this->base_api_url().'auth/tokens'; + //todo:: post request + $response = Http::post($url,[ + "api_key" => $this->getApiKey() + ]); + if ($response->status() === 201){ + $result = $response->object(); + $authorise_token = $result->token; + if(!empty($authorise_token)){ + return $authorise_token; + } + abort(500,'authentication request token generate failed'); + } + abort(500,'authentication_request failed'); + } + + private function order_registration_request($authorize_token,$args) { + $response = Http::post($this->base_api_url().'ecommerce/orders',[ + "auth_token" => $authorize_token, + "delivery_needed" => "false", + "amount_cents" => $this->charge_amount($args['amount']), + "currency" => $this->getCurrency(), + "merchant_order_id" => PaymentGatewayHelpers::wrapped_id($args['order_id']), + "items" => [ + [ + "name" => $args['title'], + "amount_cents" => $this->charge_amount($args['amount']), + "description" => $args['description'], + "quantity" => "1" + ] + ] + ]); + + if($response->status() === 201){ + return [ + 'order_id' => $response->object()?->id, + 'token' => $response->object()?->token + ]; + } + abort(500,'order_registration_request failed'); + } + + private function payment_key_request($authorize_token, array $args,$order_request_id) + { + $response = Http::post($this->base_api_url().'acceptance/payment_keys',[ + "auth_token" => $authorize_token, + "amount_cents" => $this->charge_amount($args['amount']), + "expiration" => 3600, + "order_id" => $order_request_id, + "billing_data" => [ + "first_name" => "Clifford", + "last_name" => "Nicolas", + "email" => "claudette09@exa.com", + "phone_number" => "+86(8)9135210487", + "apartment" => "NA", + "floor" => "NA", + "street" => "NA", + "building" => "NA", + "shipping_method" => "NA", + "postal_code" => "NA", + "city" => "NA", + "country" => "NA", + "state" => "NA" + ], + "currency" => $this->getCurrency(), + "integration_id" => $this->getIntegrationId(), + "lock_order_when_paid" => "false" + ]); + if($response->status() === 201){ + return $response->object()?->token; + } + abort(500,'payment_key_request failed'); + } + + private function process_kiosk_payment_request($payment_key_request_token,$authorize_token,$args) + { + //todo api request + $response = Http::asJson()->post($this->base_api_url().'acceptance/payment_keys',[ + "payment_token" => $payment_key_request_token, + "auth_token" => $authorize_token, + "source" => [ + "identifier" => "AGGREGATOR", + "subtype" => "AGGREGATOR" + ], + 'amount_cents' => $this->charge_amount($args['amount']), + 'currency' => $this->getCurrency() + ]); + if($response->status() === 201){ + return $response->object()?->data?->bill_reference; + } + abort(500,'process_kiosk_payment_request bill_reference generate failed'); + } + private function process_wallet_payment_request($payment_key_request_token,$authorize_token,$args) + { + //todo api request + $response = Http::asJson()->post($this->base_api_url().'acceptance/payment_keys',[ + "payment_token" => $payment_key_request_token, + "auth_token" => $authorize_token, + "source" => [ + "identifier" => $this->getWalletMobileNumber(), + "subtype" => "WALLET" + ], + 'amount_cents' => $this->charge_amount($args['amount']), + 'currency' => $this->getCurrency() + ]); + + if($response->status() === 201){ + return $response->object()->redirect_url; + } + abort(500,'process_wallet_payment_request redirect_url generate failed'); + } + + private function getHmacStringArray() + { + $return_string = request()->all(); + if (strtolower(request()->method()) === 'post'){ + $return_string = ''; + $callback_type = request()->type; + $object = request()->obj; + $return_string = request()->obj; + + if ($callback_type === 'TRANSACTION'){ + + $return_string->order = $object->order?->id; + $return_string->order = $object->order?->id; + $return_string->is_3d_secure = ($object->is_3d_secure === true) ? 'true' : 'false'; + $return_string->is_auth = ($object->is_auth === true) ? 'true' : 'false'; + $return_string->is_capture = ($object->is_capture === true) ? 'true' : 'false'; + $return_string->is_refunded = ($object->is_refunded === true) ? 'true' : 'false'; + $return_string->is_standalone_payment = ($object->is_standalone_payment === true) ? 'true' : 'false'; + $return_string->is_voided = ($object->is_voided === true) ? 'true' : 'false'; + $return_string->success = ($object->success === true) ? 'true' : 'false'; + $return_string->error_occured = ($object->error_occured === true) ? 'true' : 'false'; + $return_string->has_parent_transaction = ($object->has_parent_transaction === true) ? 'true' : 'false'; + $return_string->pending = ($object->pending === true) ? 'true' : 'false'; + $return_string->source_data_pan = $object->source_data?->pan; + $return_string->source_data_type = $object->source_data?->type; + $return_string->source_data_sub_type = $object->source_data?->sub_type; + + /* + amount_cents + created_at + currency + error_occured + has_parent_transaction + id + integration_id + is_3d_secure + is_auth + is_capture + is_refunded + is_standalone_payment + is_voided + order.id + owner + pending + source_data.pan + source_data.sub_type + source_data.type + success + */ + + }elseif ($callback_type === 'DELIVERY_STATUS'){ + $return_string->order = $object->order?->id; + } + }elseif(strtolower(request()->method()) === 'get'){ + //handle if the callback if get request transaction callback. + $callback_type = 'TRANSACTION'; + $return_string = request()->all(); + } + + return $return_string; + } + + private function getHasvalue() + { + $callback_type = 'TRANSACTION'; + if (strtolower(request()->method()) === 'post') { + $callback_type = request()->type; + } + + $hmac_string = $this->getHmacStringArray(); + $str = ''; + switch ($callback_type) { + + case 'TRANSACTION': + + $str = + $hmac_string['amount_cents'] . + $hmac_string['created_at'] . + $hmac_string['currency'] . + $hmac_string['error_occured'] . + $hmac_string['has_parent_transaction'] . + $hmac_string['id'] . + $hmac_string['integration_id'] . + $hmac_string['is_3d_secure'] . + $hmac_string['is_auth'] . + $hmac_string['is_capture'] . + $hmac_string['is_refunded'] . + $hmac_string['is_standalone_payment'] . + $hmac_string['is_voided'] . + $hmac_string['order'] . + $hmac_string['owner'] . + $hmac_string['pending'] . + $hmac_string['source_data_pan'] . + $hmac_string['source_data_sub_type'] . + $hmac_string['source_data_type'] . + $hmac_string['success']; + break; + case 'TOKEN': + $str = + $hmac_string['card_subtype'] . + $hmac_string['created_at'] . + $hmac_string['email'] . + $hmac_string['id'] . + $hmac_string['masked_pan'] . + $hmac_string['merchant_id'] . + $hmac_string['order_id'] . + $hmac_string['token']; + break; + case 'DELIVERY_STATUS': + $str = + $hmac_string['created_at'] . + $hmac_string['extra_description'] . + $hmac_string['gps_lat'] . + $hmac_string['gps_long'] . + $hmac_string['id'] . + $hmac_string['merchant'] . + $hmac_string['order'] . + $hmac_string['status']; + break; + } + $hash = hash_hmac('sha512', $str, $this->getHmacSecret()); + return $hash; + } + +} diff --git a/src/Base/Gateways/PaypalPay.php b/src/Base/Gateways/PaypalPay.php new file mode 100644 index 0000000..e5b9530 --- /dev/null +++ b/src/Base/Gateways/PaypalPay.php @@ -0,0 +1,205 @@ +app_id; + } + /* set app id */ + public function setAppId($app_id){ + $this->app_id = $app_id; + return $this; + } + /* set app id */ + public function setClientId($client_id){ + $this->client_id = $client_id; + return $this; + } + /* set app secret */ + public function setClientSecret($client_secret){ + $this->client_secret = $client_secret; + return $this; + } + /* get app id */ + private function getClientId(){ + return $this->client_id; + } + /* get secret key */ + private function getClientSecret(){ + return $this->client_secret; + } + /* + * charge_amount(); + * @required param list + * $amount + * + * + * */ + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $amount; + } + return $this->get_amount_in_usd($amount); + } + + + protected function getPaymentProvider($args){ + Config::set([ + 'paypal.mode' => $this->getEnv() ? 'sandbox' : 'live', + 'paypal.sandbox' => [ + 'client_id' => $this->getClientId(), + 'client_secret' => $this->getClientSecret(), + 'app_id' => $this->getAppId(), + ], + 'paypal.live' => [ + 'client_id' => $this->getClientId(), + 'client_secret' => $this->getClientSecret(), + 'app_id' => $this->getAppId(), + ], + 'paypal.payment_action' => 'Sale', + 'paypal.currency' => $this->charge_currency(), + 'paypal.notify_url' => $args['ipn_url'], + 'paypal.locale' => app()->getLocale(), + 'paypal.validate_ssl' => true, + ]); + $provider = new PayPalClient; + $access_token = $provider->getAccessToken(); + + abort_if(isset($access_token['type']) && $access_token['type'] === 'error',405,$access_token['message'] ?? ''); + $provider->setAccessToken($access_token); + return $provider; + } + /** + * @required param list + * $args['amount'] + * $args['description'] + * $args['item_name'] + * $args['ipn_url'] + * $args['cancel_url'] + * $args['payment_track'] + * return redirect url for paypal + * */ + + public function charge_customer($args) + { + $provider = $this->getPaymentProvider($args); + + if($args['amount'] < 1){ + abort(500,__('minimum payable amount is 1')); + } + + $order = $provider->createOrder([ + "intent"=> "CAPTURE", + "purchase_units"=> [ + 0 => [ + "amount"=> [ + "currency_code"=> $this->charge_currency(), + "value"=> number_format($this->charge_amount($args['amount']), 2, ".", "") + ] + ] + ], + 'application_context' => [ + 'cancel_url' => $args['cancel_url'], + 'return_url' => $args['ipn_url'] + ] + ]); + + // throw exception + if(isset($order['error'])){ + abort(422, $order['error']['message']); + } + + abort_if(isset($order['type']) && $order['type'] === 'error',405,$order['message'] ?? ''); + $order_id = $order['id']; + + session()->put('paypal_order_id',$order_id); + session()->put('paypal_ipn_url',$args['ipn_url']); + session()->put('paypal_cancel_url',$args['cancel_url']); + session()->put('script_order_id', $args['order_id']); + $redirect_url = $order['links'][1]['href']; + return redirect($redirect_url)->send(); + } + + + /** + * @required param list + * $args['request'] + * $args['cancel_url'] + * $args['success_url'] + * + * return @void + * */ + public function ipn_response($args = []){ + + /** Get the payment ID before session clear **/ + $payment_id = session()->get('paypal_order_id'); + $script_order_id = session()->get('script_order_id'); + $paypal_ipn_url = session()->get('paypal_ipn_url'); + $paypal_cancel_url = session()->get('paypal_cancel_url'); + $request = request(); + /** clear the session payment ID **/ + session()->forget(['paypal_order_id','script_order_id','paypal_cancel_url','paypal_ipn_url']); + + if (empty($request->get('PayerID')) || empty($request->get('token'))) { + return abort(404); + } + + $provider = $this->getPaymentProvider(['ipn_url' => $paypal_ipn_url]); + $order_details = $provider->capturePaymentOrder($payment_id); + if (isset($order_details['status']) && $order_details['status'] === 'COMPLETED') { + return $this->verified_data([ + 'transaction_id' => $payment_id, + 'order_id' => $script_order_id + ]); + } + + return $this->verified_data([ + 'status' => 'pending', + 'order_id' => $script_order_id + ]); + } + + /** + * geteway_name(); + * return @string + * */ + public function gateway_name(){ + return 'paypal'; + } + /** + * charge_currency(); + * return @string + * */ + public function charge_currency() + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $this->getCurrency(); + } + return "USD"; + } + /** + * supported_currency_list(); + * it will returl all of supported currency for the payment gateway + * return array + * */ + public function supported_currency_list(){ + return ['AUD', 'BRL', 'CAD', 'CNY', 'CZK', 'DKK', 'EUR', 'HKD', 'HUF', 'INR', 'ILS', 'JPY', 'MYR', 'MXN', 'TWD', 'NZD', 'NOK', 'PHP', 'PLN', 'GBP', 'RUB', 'SGD', 'SEK', 'CHF', 'THB', 'USD']; + } +} diff --git a/src/Base/Gateways/PaystackPay.php b/src/Base/Gateways/PaystackPay.php new file mode 100644 index 0000000..62cea7f --- /dev/null +++ b/src/Base/Gateways/PaystackPay.php @@ -0,0 +1,167 @@ +public_key = $public_key; + return $this; + } + public function getPublicKey(){ + return $this->public_key; + } + public function setSecretKey($secret_key){ + $this->secret_key = $secret_key; + return $this; + } + public function getSecretKey(){ + return $this->secret_key; + } + public function setMerchantEmail($merchant_email){ + $this->merchant_email = $merchant_email; + return $this; + } + public function getMerchantEmail(){ + return $this->merchant_email; + } + + /** + * @inheritDoc + * @ https://github.com/unicodeveloper/laravel-paystack + * @param int|float $amount + */ + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $amount; + } + return $this->get_amount_in_ngn($amount); + } + + protected function get_amount_in_ngn($amount){ + if ($this->getCurrency() === 'NGN'){ + return $amount; + } + $payable_amount = $this->make_amount_in_ngn($amount, $this->getCurrency()); + if ($payable_amount < 1) { + return $payable_amount . __('USD amount is not supported by '.$this->gateway_name()); + } + return $payable_amount; + } + /** + * convert amount to ngn currency base on conversation given by admin + * */ + private function make_amount_in_ngn($amount, $currency) + { + $output = 0; + $all_currency = GlobalCurrency::script_currency_list(); + foreach ($all_currency as $cur => $symbol) { + if ($cur === 'NGN') { + continue; + } + if ($cur === $currency) { + $exchange_rate = $this->getExchangeRate(); + $output = $amount * $exchange_rate; + } + } + + return $output; + } + /** + * @inheritDoc + * @param array $args; + * @return array ['status','type','order_id','transaction_id']; + */ + public function ipn_response(array $args = []) + { + $this->setConfig(); + // $paystack_ipn_url = session()->get('paystack_ipn_url'); + // abort_unless(!empty($paystack_ipn_url),405,__('ipn route not found')); + $paymentDetails = Paystack::getPaymentData(); + if ($paymentDetails['status']) { + $meta_data = $paymentDetails['data']['metadata']; + return $this->verified_data([ + 'transaction_id' => $paymentDetails['data']['reference'], + 'type' => $meta_data['type'], + 'order_id' => substr( $meta_data['order_id'],5,-5), + // 'ipn_url' => $paystack_ipn_url, + ]); + } + return ['status' => 'failed']; + } + + /** + * @inheritDoc + */ + public function charge_customer(array $args) + { +// if($args['amount'] > 25000 && $this->charge_currency() !== 'NGN'){ +// return back()->with(['msg' => __('We could not process your request due to your amount is higher than the maximum.'),'type' => 'danger']); +// } + $order_id = random_int(12345,99999).$args['order_id'].random_int(12345,99999); + $paystack_data['currency'] = $this->charge_currency(); + $paystack_data['price'] = $this->charge_amount($args['amount']); + $paystack_data['package_name'] = $args['title']; + $paystack_data['name'] = $args['name']; + $paystack_data['email'] = $args['email']; + $paystack_data['order_id'] = $order_id; + $paystack_data['track'] = $args['track']; + $paystack_data['route'] = route('xg.payment.gateway.paystack'); + $paystack_data['type'] = $args['payment_type'] ?? 'random'; + $paystack_data['merchantEmail'] = $this->getMerchantEmail(); + $paystack_data['secretKey'] = $this->getSecretKey(); + $paystack_data['publicKey'] = $this->getPublicKey(); + + return view('paymentgateway::paystack')->with(['paystack_data' => $paystack_data]); + } + + /** + * @inheritDoc + */ + public function supported_currency_list() + { + return ['GHS','NGN','ZAR']; + } + + /** + * @inheritDoc + */ + public function charge_currency() + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $this->getCurrency(); + } + return "NGN"; + } + + /** + * @inheritDoc + */ + public function gateway_name() + { + return 'paystack'; + } + + public function setConfig($config = []){ + config(array_merge($config,[ + 'paystack.merchantEmail' => $this->getMerchantEmail(), + 'paystack.secretKey' => $this->getSecretKey(), + 'paystack.publicKey' => $this->getPublicKey(), + 'paystack.paymentUrl' => 'https://api.paystack.co', + ])); + } +} diff --git a/src/Base/Gateways/PaytmPay.php b/src/Base/Gateways/PaytmPay.php new file mode 100644 index 0000000..fb869b0 --- /dev/null +++ b/src/Base/Gateways/PaytmPay.php @@ -0,0 +1,174 @@ +merchant_id = $merchant_id; + return $this; + } + public function getMerchantId(){ + return $this->merchant_id; + } + public function setMerchantKey($merchant_key){ + $this->merchant_key = $merchant_key; + return $this; + } + public function getMerchantKey(){ + return $this->merchant_key; + } + public function setMerchantWebsite($merchant_website){ + $this->merchant_website = $merchant_website; + return $this; + } + public function getMerchantWebsite(){ + return $this->merchant_website; + } + public function setChannel($channel){ + $this->channel = $channel; + return $this; + } + public function getChannel(){ + return $this->channel; + } + public function setIndustryType($industry_type){ + $this->industry_type = $industry_type; + return $this; + } + public function getIndustryType(){ + return $this->industry_type; + } + + /* + * charge_amount(); + * @required param list + * $amount + * + * + * */ + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $amount; + } + return $this->get_amount_in_inr($amount); + } + + + /** + * @required param list + * $args['amount'] + * $args['description'] + * $args['item_name'] + * $args['ipn_url'] + * $args['cancel_url'] + * $args['payment_track'] + * return redirect url for paypal + * + * @throws \Exception + */ + + public function charge_customer($args) + { + $charge_amount = $this->charge_amount($args['amount']); + $order_id = random_int(11111,99999).$args['order_id'].random_int(11111,99999); + $payment = $this->createReceiveDriver(); + $payment->prepare([ + 'order' => $order_id, + 'user' => Str::slug($args['name']), + 'mobile_number' => random_int(99999999, 99999999), + 'email' => $args['email'], + 'amount' => number_format((float) $charge_amount, 2, '.', ''), + 'callback_url' => $args['ipn_url'] + ]); + return $payment->receive(); + } + protected function createReceiveDriver(){ + + return $this->buildProvider( + 'Anand\LaravelPaytmWallet\Providers\ReceivePaymentProvider', + [ + 'env' => $this->getEnv() ? 'local': 'production', //env('PAYTM_ENVIRONMENT','local'), // values : (local | production) + 'merchant_id' => $this->getMerchantId(),// env('PAYTM_MERCHANT_ID'), + 'merchant_key' => $this->getMerchantKey(),// env('PAYTM_MERCHANT_KEY'), + 'merchant_website' => $this->getMerchantWebsite(),// env('PAYTM_MERCHANT_WEBSITE'), + 'channel' => $this->getChannel(),//env('PAYTM_CHANNEL'), + 'industry_type' => $this->getIndustryType(),//env('PAYTM_INDUSTRY_TYPE'), + ] + ); + } + public function buildProvider($provider, $config){ + return new $provider( + request(), + $config + ); + } + + /** + * @required param list + * $args['request'] + * $args['cancel_url'] + * $args['success_url'] + * + * return @void + * */ + public function ipn_response($args = []){ + + $order_id = request()->get('ORDERID'); + $transaction = $this->createReceiveDriver(); + $response = $transaction->response(); // To get raw response as array + //Check out response parameters sent by paytm here -> http://paywithpaytm.com/developer/paytm_api_doc?target=interpreting-response-sent-by-paytm + if ($transaction->isSuccessful()) { + + return $this->verified_data([ + 'transaction_id' => $response['TXNID'], + 'order_id' => substr($order_id,5,-5) + ]); + + } + return ['status' => 'failed']; + } + + /** + * geteway_name(); + * return @string + * */ + public function gateway_name(){ + return 'paytm'; + } + /** + * charge_currency(); + * return @string + * */ + public function charge_currency() + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $this->getCurrency(); + } + return "INR"; + } + /** + * supported_currency_list(); + * it will return all of supported currency for the payment gateway + * return array + * */ + public function supported_currency_list(){ + return ['INR']; + } + +} diff --git a/src/Base/Gateways/PowertranzPay.php b/src/Base/Gateways/PowertranzPay.php new file mode 100644 index 0000000..103f28e --- /dev/null +++ b/src/Base/Gateways/PowertranzPay.php @@ -0,0 +1,237 @@ +gateway_key = $gateway_key; + return $this; + } + public function getGatewayKey(){ + return $this->gateway_key; + } + + public function setMerchantId(string $merchant_id) : PowertranzPay + { + $this->merchant_id = $merchant_id; + return $this; + } + public function getMerchantId(){ + return $this->merchant_id; + } + + public function setMerchantProcessingPassword(string $merchant_processing_password) : PowertranzPay + { + $this->merchant_processing_password = $merchant_processing_password; + return $this; + } + public function getMerchantProcessingPassword(){ + return $this->merchant_processing_password; + } + + + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $amount; + } + return $this->get_amount_in_usd($amount); + } + + public function ipn_response(array $args = []) + { + $SpiToken = request()->get('SpiToken'); + + $payment_url = $this->base_url($this->getEnv()).'payment'; + $response = Http::post($payment_url,$SpiToken); + $result = $response->object(); + $order_id = Str::of($result->OrderIdentifier)->before('__')->toString(); + $payment_type = Str::of($result->OrderIdentifier)->after('__')->toString(); + if ($result->Approved && $result->ResponseMessage === "Transaction is approved"){ + return $this->verified_data([ + 'transaction_id' => $result->TransactionIdentifier, + 'order_id' => PaymentGatewayHelpers::unwrapped_id($order_id), + 'payment_type' => $payment_type + ]); + } + + return [ + 'status' => 'failed', + 'order_id' => $order_id, + 'payment_type' => $payment_type + ]; + } + + /** + * @throws \Exception + */ + + public function view($args){ + return view('paymentgateway::powertransz', ['powertransz_data' => array_merge($args,[ + 'merchant_id' => Crypt::encrypt($this->getMerchantId()), + 'currency' => $this->getCurrency(), + 'merchant_password' => Crypt::encrypt($this->getMerchantProcessingPassword()), + 'gateway_key' => Crypt::encrypt($this->getGatewayKey()), + 'charge_amount' => $this->charge_amount($args['amount']), + 'environment' => $this->getEnv(), + 'order_id' => PaymentGatewayHelpers::wrapped_id($args['order_id']) + ])]); + } + public function charge_customer($args) + { + return $this->view($args); + //todo:: format data for send in blade file for get user card details + } + + public function charge_customer_from_controller(){ + + + $input = request()->input(); + + /* Create a merchantAuthenticationType object with authentication details retrieved from the constants file */ + $merchant_password = \Crypt::decrypt(request()->merchant_password); + $merchant_id = \Crypt::decrypt(request()->merchant_id); + $gateway_key = \Crypt::decrypt(request()->gateway_key); + $currency = request()->currency; + + $payment_url = $this->base_url(request()->environment).'sale'; + + $header_data = [ + 'PowerTranz-PowerTranzId'=> $merchant_id, + 'PowerTranz-PowerTranzPassword' => $merchant_password, + 'Content-Type' => 'application/json; charset=utf-8' + ]; + if (!empty($gateway_key)){ + $header_data['PowerTranz-GatewayKey '] = $gateway_key; + } + $cardNumber = preg_replace('/\s+/', '', $input['number']); + $card_date = explode('/',request()->get('expiry')); + $expiration_month = trim($card_date[0]); //detect if year value is full number like 2024 get only last two digit¥¥¥¥¥¥¥¥^-09oi87uy68uy6t5rewqsdw34e5 + $expiration_year = strlen(trim($card_date[1])) == 4 ? trim($card_date[1]) : trim($card_date[1]); + $expiration_date = $expiration_year .$expiration_month; + $response = Http::withHeaders($header_data) + ->post($payment_url,[ + 'TransactionIdentifier' => Str::uuid()->toString(), // Guid Ex: F388373D-9FD8-7AA0-B64B-0E51FF97227E ( 36 Char Long string ) + 'TotalAmount' => request()->get('charge_amount'), //need in decimal format + 'CurrencyCode' => $this->getCurrencyNumber($currency),//388,//$currency, // Must use numeric currency code (ISO 4217) + 'ThreeDSecure' => true, + 'AddressMatch' => false, + 'OrderIdentifier' => $input['order_id'].'__'.$input['payment_type'], + 'Source' => [ + 'CardPan' => $cardNumber, //card number for test 4012000000020071 + 'CardCvv' => $input['cvc'], + 'CardExpiration' => $expiration_date, //Expiry date in YYMM format + 'CardholderName' => $input['name'] + ], + 'BillingAddress' => [ + 'Line2' => 'line 2', + 'City' => 'city', + 'PostalCode' => '123456', // Postal or Zip code (required for AVS) Strictly Alphanumeric only - No special characters, no accents, no spaces, no dashes…etc. + 'CountryCode' => 388,//'USA', //For USA ISO Code + 'FirstName' => $input['name'], + 'LastName' => ' ', + 'Line1' => 'unknown', + 'EmailAddress' => $input['email'], + ], + + 'ExtendedData' => [ + "ThreeDSecure" => [ + "ChallengeWindowSize" => 1, // Merchants preferred sized of challenge window presented to cardholder + /* + 1 – 250 x 400 + 2 – 390x400 + 3 – 500x600 + 4 – 600x400 + 5 – 100% + */ + + "ChallengeIndicator" => "01" , // Conditional value – if supported + /* + 01 = No preference + 02 = No challenge requested + 03 = Challenge requested: 3DS Requestor Preference + 04 = Challenge requested: Mandate Default value if not provided is that ACS would interpret as: 01 = No preference. + */ + ], + 'MerchantResponseURL' => $input['ipn_url'] + ] + ]); + $result = $response->object(); + if (property_exists($result,'RedirectData')){ + return $result->RedirectData; + } + $error_message = 'payment failed'; + if (property_exists($result,'Errors')){ + $error = $result->Errors; + $error_message = current($error)->Message ?? __("payment credentials failed"); + } + abort(501,$error_message); + } + + + public function supported_currency_list() : array + { +/* + * Supported Currencies + * +United States (USD) +East Caribbean (XCD) +Trinidad and Tobago (TTD) +Jamaica (JMD) +Barbados (BBD) +Bahamas (BSD) +Belize (BZD) +Dominican Republic (DOP) +Guyana (GYD) +Cayman Islands (KYD) +Honduras (HNL) +El Salvador (SVC) +Costa Rica (CRC) +Nicaragua (NIO) +Panama (PAB) + + * + * */ + return ['USD','XCD','TTD','JMD','BBD','BSD','BZD','DOP','GYD','KYD','HNL','SVC','CRC','NIO','PAB']; + } + + public function charge_currency() : string + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $this->getCurrency(); + } + return "USD"; + } + + public function gateway_name() : string + { + return 'powertranz'; + } + + private function base_url($environment =false){ + return $environment ? 'https://staging.ptranz.com/api/spi/' : 'https://TBD.ptranz.com/api/spi/'; + } +} diff --git a/src/Base/Gateways/RazorPay.php b/src/Base/Gateways/RazorPay.php new file mode 100644 index 0000000..646eb0a --- /dev/null +++ b/src/Base/Gateways/RazorPay.php @@ -0,0 +1,142 @@ +api_key = $api_key; + return $this; + } + private function getApiKey(){ + return $this->api_key; + } + public function setApiSecret($api_secret){ + $this->api_secret = $api_secret; + return $this; + } + private function getApiSecret(){ + return $this->api_secret; + } + + /* + * charge_amount(); + * @required param list + * $amount + * + * + * */ + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $this->is_decimal($amount) ? $amount : $amount; + } + return $this->is_decimal( $this->get_amount_in_inr($amount)) ? $this->get_amount_in_inr($amount) : $this->get_amount_in_inr($amount); + } + + + /** + * @required param list + * */ + + public function charge_customer($args) + { + $order_id = random_int(12345,99999).$args['order_id'].random_int(12345,99999); + $razorpay_data['currency'] = $this->charge_currency(); + $razorpay_data['price'] = $this->charge_amount($args['amount']); + $razorpay_data['title'] = $args['title']; + $razorpay_data['description'] = $args['description']; + $razorpay_data['route'] = $args['ipn_url']; + $razorpay_data['order_id'] = $order_id; + $razorpay_data['api_key'] = $this->getApiKey(); + session()->put('razorpay_last_order_id',$order_id); + + abort_if(is_null($this->getApiKey()),405,'razorpay api key is missing'); + + return view('paymentgateway::razorpay')->with('razorpay_data', $razorpay_data); + } + + + /** + * @required param list + * $args['request'] + * $args['cancel_url'] + * $args['success_url'] + * + * return @void + * */ + public function ipn_response($args = []){ + + $request = request(); + $razorpay_payment_id = request()->razorpay_payment_id; + + abort_if(is_null($this->getApiKey()),405,'razorpay api key is missing'); + abort_if(is_null($this->getApiSecret()),405,'razorpay api secret is missing'); + //get API Configuration + //Fetch payment information by razorpay_payment_id + $reponse = Http::withBasicAuth( + $this->getApiKey(), + $this->getApiSecret() + )->get($this->baseApi(). 'payments/'.$razorpay_payment_id); + + if ($reponse->ok()){ + $res_object = $reponse->object(); + $amount = $res_object->amount; + $currency =$this->getCurrency(); + + if (in_array($res_object->status,['paid','authorized'])){ + return $this->verified_data([ + 'status' => 'complete', + 'order_id' => substr( request()->order_id,5,-5), + 'payment_amount' => $amount, + 'transaction_id' => $razorpay_payment_id + ]); + } + } + + return ['status' => 'failed']; + } + + /** + * geteway_name(); + * return @string + * */ + public function gateway_name(){ + return 'razorpay'; + } + /** + * charge_currency(); + * return @string + * */ + public function charge_currency() + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $this->getCurrency(); + } + return "INR"; + } + /** + * supported_currency_list(); + * it will returl all of supported currency for the payment gateway + * return array + * */ + public function supported_currency_list(){ + return ['INR']; + } + + public function baseApi(){ + return 'https://api.razorpay.com/v1/'; + } +} diff --git a/src/Base/Gateways/SaltPay.php b/src/Base/Gateways/SaltPay.php new file mode 100644 index 0000000..0f8134d --- /dev/null +++ b/src/Base/Gateways/SaltPay.php @@ -0,0 +1,302 @@ +merchantId = $merchantId; + return $this; + } + + public function getMerchantId() + { + return $this->merchantId; + } + + public function setSecretKey($secretkey) + { + $this->secretkey = $secretkey; + return $this; + } + + public function getSecretKey() + { + return $this->secretkey; + } + + public function setLangPaymentPage($langpaymentPage) + { + $this->langpaymentPage = $langpaymentPage; + return $this; + } + + public function getLangPaymentPage() + { + return $this->langpaymentPage; + } + + public function setPaymentGatewayId($paymentGatewayId) + { + $this->paymentGatewayId = $paymentGatewayId; + return $this; + } + + public function getPaymentGatewayId() + { + return $this->paymentGatewayId; + } + + + /* + Available Languages + + 'is' => Icelandi + 'en' => English + 'de' => German + 'fr' => French + 'it' => Italian + 'pt' => Portugese + 'ru' => Russian + 'es' => Spanish + 'se' => Swedish + 'hu' => Hungarian + 'si' => Slovene + + */ + + + /* + * charge_amount(); + * @required param list + * $amount + * + * + * */ + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())) { + return number_format($amount,2); + } + return $this->get_amount_in_usd($amount); + } + + + /** + * @required param list + * $args['amount'] + * $args['description'] + * $args['item_name'] + * $args['ipn_url'] + * $args['cancel_url'] + * $args['payment_track'] + * return redirect url for + * */ + + public function view($args) + { + $salt_pay_args = array_merge($args, [ + 'gateway_id' => $this->getPaymentGatewayId(), + 'merchantid' => $this->getMerchantId(), + 'language' => in_array($this->getLangPaymentPage(), $this->getAvilableLanguage()) ? $this->getLangPaymentPage() : 'en', + 'currency' => $this->getCurrency(), + 'charge_amount' => $this->charge_amount($args['amount']), + 'environment' => $this->getEnv(), + 'order_id' => PaymentGatewayHelpers::wrapped_id($args['order_id']), + 'action_url' => $this->getBaseUrl() . 'default.aspx', + 'reference' => $args['payment_type'] + ]); + $salt_pay_args['checkhash'] = $this->generateCheckHash($salt_pay_args); + + return view('paymentgateway::saltpay', ['saltpay_data' => $salt_pay_args]); + } + + public function charge_customer($args) + { + //todo:: format data for send in blade file for get user card details + return $this->view($args); + } + + + /** + * @required param list + * $args['request'] + * $args['cancel_url'] + * $args['success_url'] + * + * return @void + * */ + public function ipn_response($args = []) + { + + $request = request(); + $status = $request->status; + $orderid = $request->orderid; + $reference_string = $request->reference; + $reference = $reference_string; + $order_amount = $request->amount; + + $orderhash = $request->orderhash; + $step = $request->step; + + $errordescription = $request->errordescription; + $errorcode = $request->errorcode; + $errordescription = $request->errordescription; + + + + $authorizationcode = $request->authorizationcode; + $refundid = $request->refundid; + + + + if($status === 'OK' && !empty($orderid)){ + if (hash_equals($orderhash,$this->getCheckoutHash($order_amount,$orderid))){ + //todo:: hash verified, now make an api call to cross check the payment is actually maid or not + if ( strpos( $step, 'Payment' ) !== false ) { + $xml = 'Accepted'; + + //send resopnse to saltpay that we have received the notification + try + { + Http:: + withHeaders([ + 'Content-Type' => 'text/xml' + ]) + ->timeout(60) + ->withoutVerifying() + ->maxRedirects(5) + ->post($this->getBaseUrl(). 'default.aspx',[ + 'postdata' => $xml, 'postfield' => 'value' + ]); + + + }catch (\Exception $e){ + // abort(501,'failed to send data to salt pay'); + } + } + + + return $this->verified_data([ + 'status' => 'complete', + 'transaction_id' => $authorizationcode, + 'order_id' => PaymentGatewayHelpers::unwrapped_id($orderid), + 'order_type' => $reference + ]); + } + } + + return $this->verified_data([ + 'status' => 'failed', + 'order_id' => PaymentGatewayHelpers::unwrapped_id(request()->get('order_id')), + 'order_type' => $reference + ]); + } + + /** + * geteway_name(); + * return @string + * */ + public function gateway_name() + { + return 'saltpay'; + } + + /** + * charge_currency(); + * return @string + * */ + public function charge_currency() + { + if (in_array($this->getCurrency(), $this->supported_currency_list())) { + return $this->getCurrency(); + } + return "USD"; + } + + /** + * supported_currency_list(); + * it will returl all of supported currency for the payment gateway + * return array + * */ + public function supported_currency_list() + { + return ['ISK', 'USD', 'EUR', 'GBP', 'DKK', 'NOK', 'SEK', 'CHF', 'JPY', 'CAD', 'HUF']; + } + + + private function getBaseUrl() + { + //true=sandbox, false=live + return $this->getEnv() ? 'https://test.borgun.is/securepay/' : 'https://securepay.borgun.is/securepay/'; + } + + private function getAvilableLanguage() + { + return ['is', 'en', 'de', 'fr', 'it', 'pt', 'ru', 'es', 'se', 'hu', 'si']; + } + + private function generateCheckHash($args) + { + +//Formual +//CheckHashMessage = MerchantId|ReturnUrlSuccess|ReturnUrlSuccessServer|OrderId|Amount|Currency -> this is for payment page +//OrderHashMessage = OrderId|Amount|Currency -> this is for payment verify + + $secretKey = $this->getSecretKey(); + $hashMessagesParams = [ + $args['merchantid'], + $args['ipn_url'], + $args['ipn_url'], + $args['order_id'], + $args['charge_amount'], + $args['currency'], + ]; + $CheckHashMessage = implode('|', $hashMessagesParams); + + $message = utf8_encode(trim($CheckHashMessage)); + $checkhash = hash_hmac('sha256', $message, $secretKey); + return $checkhash; + } + + private function getCheckoutHash(string $order_amount, mixed $orderid) + { + //formula + //orderid|amount|Currency + + $secretKey = $this->getSecretKey(); + $hashMessagesParams = [ + $orderid, + $order_amount, + $this->getCurrency() + ]; + $CheckHashMessage = implode('|', $hashMessagesParams); + + $message = utf8_encode(trim($CheckHashMessage)); + $checkhash = hash_hmac('sha256', $message, $secretKey); + return $checkhash; + } +} diff --git a/src/Base/Gateways/Senangpay.php b/src/Base/Gateways/Senangpay.php new file mode 100644 index 0000000..f8293fe --- /dev/null +++ b/src/Base/Gateways/Senangpay.php @@ -0,0 +1,296 @@ +merchant_id = $merchant_id; + return $this; + } + public function getMerchantId(){ + return $this->merchant_id; + } + + public function setSecretKey($secret_key){ + $this->secret_key = $secret_key; + return $this; + } + public function getSecretKey(){ + return $this->secret_key; + } + + public function setHashMethod($hash_method){ + $this->hash_method = $hash_method; + return $this; + } + public function getHashMethod(){ + return $this->hash_method; + } + + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $amount; + } + return $this->get_amount_in_myr($amount); + } + + public function ipn_response(array $args = []) + { + + + + $response = $this->verifyTransaction(); + // dd($response,request()->all()); + if ($response->ok()){ + //write code for verify the transaction + $response = $response->object(); + $data = current($response->data); + $transaction_reference = $data->payment_info?->transaction_reference; + if ($data->payment_info?->status !== "failed" && !empty($transaction_reference)){ + $pname = $data->product?->product_name; + $payment_type = Str::of($pname)->after("##")->trim()->__toString(); + return [ + 'status' => 'complete', + "order_id" => XgPaymentGateway::unwrapped_id(request()->get('order_id')), + "payment_type" => $payment_type, + 'transaction_id' => $transaction_reference + ]; + } + } + + return ['status' => 'failed',"order_id" => XgPaymentGateway::unwrapped_id(request()->get('order_id'))]; + } + + private function getTransactionStatusCheckApiUrl(){ + return $this->getEnv() ? 'https://sandbox.senangpay.my/apiv1/query_transaction_status/' : 'https://app.senangpay.my/apiv1/query_transaction_status/'; + } + + /** + * @throws \Exception + */ + public function charge_customer(array $args) + { + + $merchant_id = $this->getMerchantId(); + $api_url = $this->getApiBaseUrl(); + + # Prepare the data to send to senangPay + $order_id = XgPaymentGateway::wrapped_id($args['order_id']); + $detail = "payment_type_##" . $args["payment_type"]; //here we can append payment_type + $amount = $this->charge_amount($args['amount']); + + if($amount < 2){ + abort(501,__("minimum amount should be getter than 2RM")); + } + + $hash_value = $this->getHasKey($detail,$amount,$order_id);; + $name = $args['name']; + $email = $args['email']; + $phone = $args['phone'] ?? " "; + + /* post data */ + $post_args = array( + 'detail' => $detail, + 'amount' => $amount, + 'order_id' => $order_id, + 'hash' => $hash_value, + 'name' => $name, + 'email' => $email, + 'phone' => $phone + ); + + # Format it properly using get + $senangpay_args = http_build_query($post_args); + $url = $api_url . $merchant_id . '?' . $senangpay_args; + return redirect($url); + } + + + + public function supported_currency_list() + { + return ["MYR"]; + } + + public function charge_currency() + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $this->getCurrency(); + } + return "MYR"; + } + + public function gateway_name() + { + return 'senangpay'; + } + + private function getApiBaseUrl() + { + return $this->getEnv() ? 'https://sandbox.senangpay.my/payment/' : 'https://app.senangpay.my/payment/'; + } + + + private function getApiBaseUrlRecurring() + { + return $this->getEnv() ? 'https://api.sandbox.senangpay.my/recurring/payment/' : 'https://api.senangpay.my/recurring/payment/'; + } + + private function getHasKey(string $detail, mixed $amount, string $order_id) + { + return match ($this->getHashMethod()) { + 'md5' => $this->getMd5Hash($detail, $amount, $order_id), + default => $this->getSha256Hash($detail, $amount, $order_id) + }; + } + + private function getMd5Hash(string $detail, mixed $amount, string $order_id) + { + return md5($this->getSecretKey() . $detail . $amount . $order_id); + } + + private function getSha256Hash(string $detail, mixed $amount, string $order_id) + { + return hash_hmac('sha256', $this->getSecretKey() . $detail . $amount . $order_id, $this->getSecretKey()); + } + + private function hashKeyForTransactionVerify(string $secretkey, string $hash_type, string $merchant_id, mixed $transaction_reference) + { + return match ($hash_type) { + 'md5' => $this->getMd5HashForTransactionVerify($secretkey, $merchant_id, $transaction_reference), + default => $this->getSha256HashForTransactionVerify($secretkey, $merchant_id, $transaction_reference) + }; + } + + private function getMd5HashForTransactionVerify(string $secretkey, string $merchant_id, mixed $transaction_reference) + { + return md5($merchant_id . $secretkey . $transaction_reference); + } + + private function getSha256HashForTransactionVerify(string $secretkey, string $merchant_id, mixed $transaction_reference) + { + return hash_hmac('sha256', $merchant_id . $secretkey . $transaction_reference, $secretkey); + } + + + public function charge_customer_recurring(array $args) + { + $url = $this->getApiBaseUrlRecurring().$this->getMerchantId(); + + + $order_param = 'payment_type_###'.$args['payment_type'].'##'.XgPaymentGateway::wrapped_id($args['order_id']); + $amount = $this->charge_amount($args['amount']); + + if($amount < 2){ + abort(501,__("minimum amount should be getter than 2RM")); + } + + $params = http_build_query([ + 'order_id' => $order_param, + 'recurring_id' => $this->getRecurringId(), + 'hash' => $this->getHashForRecurringPayment($order_param,$amount), + 'name' => $args['name'], + 'email' => $args['email'], + 'phone' => $args['phone'] ?? " ", + 'amount' => $amount + ]); + + // dd($url,$params); + $url = $url.'?'.$params; + + return redirect($url); + } + + public function ipn_response_recurring(array $args = []) + { + $response = $this->verifyTransaction(); + if ($response->ok()){ + //write code for verify the transaction + $response = $response->object(); + $data = current($response->data); + $transaction_reference = $data->payment_info?->transaction_reference; + if ($data->payment_info?->status !== "failed" && !empty($transaction_reference)){ + $payment_type = Str::of(request()->get('order_id'))->after('###')->before('##')->__toString(); + $order_id = Str::of(request()->get('order_id'))->after('##')->after('##')->__toString(); + return [ + 'status' => 'complete', + "order_id" => XgPaymentGateway::unwrapped_id($order_id), + "payment_type" => $payment_type, + 'transaction_id' => $transaction_reference + ]; + } + } + + return ['status' => 'failed',"order_id" => XgPaymentGateway::unwrapped_id(request()->get('order_id'))]; + } + + private function getHashForRecurringPayment(mixed $order_id,$amount) + { + return match ($this->getHashMethod()) { + 'md5' => $this->getMd5HashForRecurringPayment($order_id,$amount), + default => $this->getSha256HashForRecurringPayment($order_id,$amount) + }; + } + + private function getMd5HashForRecurringPayment(mixed $order_id,float|string|int $amount) + { + return md5($this->getSecretKey() . $this->getRecurringId() . $order_id.$amount); + } + + private function getSha256HashForRecurringPayment(mixed $order_id,float|string|int $amount) + { + return hash('sha256', $this->getSecretKey() . $this->getRecurringId() . $order_id.$amount); + } + + public function setRecurringId($recurring_id) + { + $this->recurring_id = $recurring_id; + return $this; + } + public function getRecurringId(){ + return $this->recurring_id; + } + + private function verifyTransaction() + { + $secretkey = $this->getSecretKey(); + $hash_type = $this->getHashMethod(); + $merchant_id = $this->getMerchantId(); + $transaction_reference = request()->get('transaction_id'); + + $hash = $this->hashKeyForTransactionVerify($secretkey,$hash_type,$merchant_id,$transaction_reference); + $url = $this->getTransactionStatusCheckApiUrl().$transaction_reference; + + $response = Http::withBasicAuth($this->getMerchantId(),'')->get($url,[ + 'merchant_id' => $this->getMerchantId(), + 'transaction_reference' => $transaction_reference, + 'hash' => $hash + ]); + return $response; + } +} diff --git a/src/Base/Gateways/SitesWayPay.php b/src/Base/Gateways/SitesWayPay.php new file mode 100644 index 0000000..4630725 --- /dev/null +++ b/src/Base/Gateways/SitesWayPay.php @@ -0,0 +1,321 @@ +brand_id; + } + /* set setBrandId */ + public function setBrandId($brand_id){ + $this->brand_id = $brand_id; + return $this; + } + /* set setApiKey */ + public function setApiKey($api_key){ + $this->api_key = $api_key; + return $this; + } + /* get getApiKey */ + private function getApiKey(){ + return $this->api_key; + } + /* + * charge_amount(); + * @required param list + * $amount + * + * + * */ + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $amount; + } + return $this->get_amount_in_usd($amount); + } + + + /** + * @required param list + * $args['amount'] + * $args['description'] + * $args['item_name'] + * $args['ipn_url'] + * $args['cancel_url'] + * $args['payment_track'] + * return redirect url for paypal + * */ + + + public function charge_customer($args) + { + + try { + $res = Http::withToken($this->getApiKey())->asJson()->post($this->endpoint.'purchases/', [ + "client" => [ + "email" => $args['email'], + "full_name" => $args['name'] + ], + "purchase" => [ + "currency" => $this->getCurrency(), //default SAR + "products" => [ + [ + "name" => $args['title'], + "price" => $this->charge_amount($args['amount']) * 100 //price need to multiply by 100 + ] + ] + ], + "brand_id" => $this->getBrandId(), + "success_redirect" => $args['success_url'], + "failure_redirect" => $args['cancel_url'], + "cancel_redirect" => $args['cancel_url'], + "success_callback" => $args['ipn_url'], + "reference" => json_encode([ + 'order_id' => PaymentGatewayHelpers::wrapped_id($args['order_id']), + 'payment_type' => $args['payment_type'] + ]) + ]); + + $response_object = $res->object(); + + if (is_object($response_object) && property_exists($response_object,"checkout_url")){ + $redirect_url = $response_object->checkout_url; + return redirect()->away($redirect_url); //redirect to the payment provider website for complete payment + } + if (is_object($response_object) && property_exists($response_object,'__all__')){ + abort(500,current($response_object->__all__)->message); + } + + }catch (\Exception $e){ + abort(500,$e->getMessage()); + } + + } + + /** + * @required param list + * $args['request'] + * $args['cancel_url'] + * $args['success_url'] + * + * return @void + * */ + public function ipn_response($args = []){ + + $purchase_id = request()->id; + $reference = json_decode(request()->reference); + $res = Http::withToken($this->getApiKey()) + ->acceptJson() + ->get($this->endpoint."purchases/{$purchase_id}/"); + $response_object = $res->object(); + if (is_object($response_object) && property_exists($response_object,"status")){ + + + if ($response_object->status === "paid"){ + return $this->verified_data([ + 'status' => 'complete', + 'transaction_id' => $purchase_id , + 'order_id' => PaymentGatewayHelpers::unwrapped_id($reference->order_id ?? ""), + 'order_type' => $reference->payment_type ?? "" + ]); + } + + } + if (is_object($response_object) && property_exists($response_object,'__all__')){ + abort(500,current($response_object->__all__)->message); + } + + return $this->verified_data([ + 'status' => 'failed', + 'order_id' => PaymentGatewayHelpers::unwrapped_id($reference->order_id ?? ""), + 'order_type' => $reference->payment_type ?? "" + ]); + + } + + /** + * geteway_name(); + * return @string + * */ + public function gateway_name(){ + return 'sitesway'; + } + /** + * charge_currency(); + * return @string + * */ + public function charge_currency() + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $this->getCurrency(); + } + return "USD"; + } + /** + * supported_currency_list(); + * it will returl all of supported currency for the payment gateway + * return array + * */ + public function supported_currency_list(){ + return [ + 'USD', + 'EUR', + 'INR', + 'IDR', + 'AUD', + 'SGD', + 'JPY', + 'GBP', + 'MYR', + 'PHP', + 'THB', + 'KRW', + 'NGN', + 'GHS', + 'BRL', + 'BIF', + 'CAD', + 'CDF', + 'CVE', + 'GHP', + 'GMD', + 'GNF', + 'KES', + 'LRD', + 'MWK', + 'MZN', + 'RWF', + 'SLL', + 'STD', + 'TZS', + 'UGX', + 'XAF', + 'XOF', + 'ZMK', + 'ZMW', + 'ZWD', + 'AED', + 'AFN', + 'ALL', + 'AMD', + 'ANG', + 'AOA', + 'ARS', + 'AWG', + 'AZN', + 'BAM', + 'BBD', + 'BDT', + 'BGN', + 'BMD', + 'BND', + 'BOB', + 'BSD', + 'BWP', + 'BZD', + 'CHF', + 'CNY', + 'CLP', + 'COP', + 'CRC', + 'CZK', + 'DJF', + 'DKK', + 'DOP', + 'DZD', + 'EGP', + 'ETB', + 'FJD', + 'FKP', + 'GEL', + 'GIP', + 'GTQ', + 'GYD', + 'HKD', + 'HNL', + 'HRK', + 'HTG', + 'HUF', + 'ILS', + 'ISK', + 'JMD', + 'KGS', + 'KHR', + 'KMF', + 'KYD', + 'KZT', + 'LAK', + 'LBP', + 'LKR', + 'LSL', + 'MAD', + 'MDL', + 'MGA', + 'MKD', + 'MMK', + 'MNT', + 'MOP', + 'MRO', + 'MUR', + 'MVR', + 'MXN', + 'NAD', + 'NIO', + 'NOK', + 'NPR', + 'NZD', + 'PAB', + 'PEN', + 'PGK', + 'PKR', + 'PLN', + 'PYG', + 'QAR', + 'RON', + 'RSD', + 'RUB', + 'SAR', + 'SBD', + 'SCR', + 'SEK', + 'SHP', + 'SOS', + 'SRD', + 'SZL', + 'TJS', + 'TRY', + 'TTD', + 'TWD', + 'UAH', + 'UYU', + 'UZS', + 'VND', + 'VUV', + 'WST', + 'XCD', + 'XPF', + 'YER', + 'ZAR', + 'BHD' + ]; + } +} diff --git a/src/Base/Gateways/SquarePay.php b/src/Base/Gateways/SquarePay.php new file mode 100644 index 0000000..d00223b --- /dev/null +++ b/src/Base/Gateways/SquarePay.php @@ -0,0 +1,410 @@ +application_id = $application_id; + return $this; + } + + public function getApplicationId() + { + return $this->application_id; + } + + public function setAccessToken($access_token) + { + $this->access_token = $access_token; + return $this; + } + + public function getAccessToken() + { + return $this->access_token; + } + + public function setLocationId($location_id) + { + $this->location_id = $location_id; + return $this; + } + + public function getLocationId() + { + return $this->location_id; + } + + /** + * this payment gateway will not work without this package + * @https://github.com/stripe/stripe-php + * @since .0.01 + * */ + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())) { + return $amount * 100; + } + return $amount * 100; + } + + /** + * + * @param array $args + * required param list + * + * @return string[] + * @since 0.0.1 + */ + public function ipn_response(array $args = []): array + { + + $square_order_id = session()->get('square_order_id'); + session()->forget('square_order_id'); + + $client = $this->setConfig(); + $transaction_id = \request()->get('transactionId'); + try { + $orders_api = $client->getOrdersApi(); + $response = $orders_api->retrieveOrder($transaction_id); + } catch (ApiException $e) { + // If an error occurs, output the message + echo 'Caught exception!
'; + echo 'Response body:
'; + echo '
';
+            var_dump($e->getResponseBody());
+            echo '
'; + echo '
Context:
'; + echo '
';
+            var_dump($e->getContext());
+            echo '
'; + exit(); + } + +// If there was an error with the request we will +// print them to the browser screen here + if ($response->isError()) { + echo 'Api response has Errors'; + $errors = $response->getErrors(); + echo ''; + exit(); + } else { + $order = $response->getResult()->getOrder(); + if($order->getState() === 'COMPLETED'){ + + return $this->verified_data([ + 'transaction_id' => $order->getId(), + 'order_id' => $square_order_id + ]); + } + } + return ['status' => 'failed']; + } + + /** + * + * @param array $args + * required param list + * + * product_name + * amount + * description + * ipn_url + * cancel_url + * order_id + * + * @return \Illuminate\Http\RedirectResponse + * @since 0.0.1 + */ + public function charge_customer(array $args) + { + $client = $this->setConfig(); + $location_id = $this->getLocationId(); + + try { + $checkout_api = $client->getCheckoutApi(); + $currency = $client->getLocationsApi()->retrieveLocation($location_id)->getResult()->getLocation()->getCurrency(); + $money_A = new Money(); + $money_A->setCurrency($this->getCurrency()); + $money_A->setAmount(round($this->charge_amount($args['amount']),2)); + + $item_A = new OrderLineItem(1); + $item_A->setName($args['title']); + $item_A->setBasePriceMoney($money_A); + + // Create a new order and add the line items as necessary. + $order = new Order($location_id); + $order->setLineItems([$item_A]); + $create_order_request = new CreateOrderRequest(); + $create_order_request->setOrder($order); + + // Similar to payments you must have a unique idempotency key. + $checkout_request = new CreateCheckoutRequest(uniqid(), $create_order_request); + // Set a custom redirect URL, otherwise a default Square confirmation page will be used + $checkout_request->setRedirectUrl($args['ipn_url']); + session()->put('square_order_id', $args['order_id']); + $response = $checkout_api->createCheckout($location_id, $checkout_request); + } catch (ApiException $e) { + // If an error occurs, output the message + abort(401,$e->getResponseBody().' '.$e->getContext()); + } + + if ($response->isError()) { + echo 'Api response has Errors'; + $errors = $response->getErrors(); + echo ''; + exit(); + } + + return redirect()->away($response->getResult()->getCheckout()->getCheckoutPageUrl()); + } + + private function setConfig(){ + $client = new SquareClient([ + 'accessToken' => $this->getAccessToken(), + 'environment' => $this->getEnv() ? 'sandbox' : 'production', //Environment::PRODUCTION, + ]); + return $client; + } + + /** + * this will refund payment gateway charge currency + * @since 0.0.1 + * */ + public function supported_currency_list(): array + { + return [ + "AUD", + "CAD", + "EUR", + "GBP", + "JPY", + "USD", + "AED", + "AFN", + "ALL", + "AMD", + "ANG", + "AOA", + "ARS", + "AUD", + "AWG", + "AZN", + "BAM", + "BBD", + "BDT", + "BGN", + "BHD", + "BIF", + "BMD", + "BND", + "BOB", + "BOV", + "BRL", + "BSD", + "BTN", + "BWP", + "BYR", + "BZD", + "CAD", + "CDF", + "CHE", + "CHF", + "CHW", + "CLF", + "CLP", + "CNY", + "COP", + "COU", + "CRC", + "CUC", + "CUP", + "CVE", + "CZK", + "DJF", + "DKK", + "DOP", + "DZD", + "EGP", + "ERN", + "ETB", + "EUR", + "FJD", + "FKP", + "GBP", + "GEL", + "GHS", + "GIP", + "GMD", + "GNF", + "GTQ", + "GYD", + "HKD", + "HNL", + "HRK", + "HTG", + "HUF", + "IDR", + "ILS", + "INR", + "IQD", + "IRR", + "ISK", + "JMD", + "JOD", + "JPY", + "KES", + "KGS", + "KHR", + "KMF", + "KPW", + "KRW", + "KWD", + "KYD", + "KZT", + "LAK", + "LBP", + "LKR", + "LRD", + "LSL", + "LTL", + "LVL", + "LYD", + "MAD", + "MDL", + "MGA", + "MKD", + "MMK", + "MNT", + "MOP", + "MRO", + "MUR", + "MVR", + "MWK", + "MXN", + "MXV", + "MYR", + "MZN", + "NAD", + "NGN", + "NIO", + "NOK", + "NPR", + "NZD", + "OMR", + "PAB", + "PEN", + "PGK", + "PHP", + "PKR", + "PLN", + "PYG", + "QAR", + "RON", + "RSD", + "RUB", + "RWF", + "SAR", + "SBD", + "SCR", + "SDG", + "SEK", + "SGD", + "SHP", + "SLL", + "SOS", + "SRD", + "SSP", + "STD", + "SVC", + "SYP", + "SZL", + "THB", + "TJS", + "TMT", + "TND", + "TOP", + "TRY", + "TTD", + "TWD", + "TZS", + "UAH", + "UGX", + "USD", + "USN", + "USS", + "UYI", + "UYU", + "UZS", + "VEF", + "VND", + "VUV", + "WST", + "XAF", + "XAG", + "XAU", + "XBA", + "XBB", + "XBC", + "XBD", + "XCD", + "XDR", + "XOF", + "XPD", + "XPF", + "XPT", + "XTS", + "XXX", + "YER", + "ZAR", + "ZMK", + "ZMW", + "BTC", + ]; + } + + /** + * this will refund payment gateway charge currency + * */ + public function charge_currency() + { + return $this->getCurrency(); + } + + /** + * this will refund payment gateway name + * */ + public function gateway_name(): string + { + return 'squareup'; + } +} diff --git a/src/Base/Gateways/StripePay.php b/src/Base/Gateways/StripePay.php new file mode 100644 index 0000000..fa3b00e --- /dev/null +++ b/src/Base/Gateways/StripePay.php @@ -0,0 +1,317 @@ +secret_key = $secret_key; + return $this; + } + private function getSecretKey(){ + return $this->secret_key; + } + public function setPublicKey($public_key){ + $this->public_key = $public_key; + return $this; + } + private function getPublicKey(){ + return $this->public_key; + } + + + /** + * this payment gateway will not work without this package + * @https://github.com/stripe/stripe-php + * @since .0.01 + * */ + public function charge_amount($amount) + { + $return_amount = $amount; + if (in_array($this->getCurrency(), $this->supported_currency_list(), true)){ + if(in_array($this->getCurrency(), $this->zero_decimal_currencies())){ + return $return_amount; + } + return $amount * 100; + } + } + private function zero_decimal_currencies(){ + return [ + 'BIF','CLP','DJF','GNF','JPY', 'KMF','KRW', 'MGA', 'PYG','RWF','UGX','VND','VUV', 'XAF','XOF', 'XPF' + ]; + } + + /** + * + * @param array $args + * required param list + * + * @return string[] + * @throws \Stripe\Exception\ApiErrorException + * @since 0.0.1 + */ + public function ipn_response(array $args = []) : array + { + $stripe_session_id = session()->get('stripe_session_id'); + session()->forget('stripe_session_id'); + $stripe_order_id = session()->get('stripe_order_id'); + session()->forget('stripe_order_id'); + + $stripe = new StripeClient($this->getSecretKey()); + $response = $stripe->checkout->sessions->retrieve($stripe_session_id, []); + $payment_intent = $response['payment_intent'] ?? ''; + $payment_status = $response['payment_status'] ?? ''; + + $capture = $stripe->paymentIntents->retrieve($payment_intent); + if (!empty($payment_status) && $payment_status === 'paid' && $capture->status === 'succeeded') { + $transaction_id = $payment_intent; + if (!empty($transaction_id)) { + return $this->verified_data([ + 'transaction_id' => $transaction_id, + 'order_id' => $stripe_order_id + ]); + } + } + + return ['status' => 'failed','order_id' => $stripe_order_id]; + } + + /** + * + * @param array $args + * required param list + * + * product_name + * amount + * description + * ipn_url + * cancel_url + * order_id + * + * @return array + * @throws \Stripe\Exception\ApiErrorException + * @since 0.0.1 + */ + public function charge_customer(array $args) + { + return $this->stripe_view($args); + } + + public function stripe_view($args){ + return view('paymentgateway::stripe', ['stripe_data' => array_merge($args,[ + 'public_key' => $this->getPublicKey(), + 'currency' => $this->getCurrency(), + 'secret_key' => base64_encode($this->getSecretKey()), + 'charge_amount' => ceil($this->charge_amount($args['amount'])), + ])]); + } + + public function charge_customer_from_controller(array $args){ + Stripe::setApiKey(base64_decode($args['secret_key'])); + + $payment_types = ['card']; + + if( strtolower($args['currency']) === "myr" ){ + $payment_types[] = 'fpx'; + } + + $session = Session::create([ + 'payment_method_types' => $payment_types, + 'line_items' => [[ + 'price_data' => [ + 'currency' => $args['currency'], + 'product_data' => [ + 'name' => $args['title'], + 'description' => $args['description'] + ], + 'unit_amount' => $args['charge_amount'], + ], + 'quantity' => 1 + ]], + 'mode' => 'payment', + 'success_url' => $args['ipn_url'], + 'cancel_url' => $args['cancel_url'], + ]); + + session()->put('stripe_session_id', $session->id); + session()->put('stripe_order_id', $args['order_id']); + + return ['id' => $session->id]; + } + + /** + * this will refund payment gateway charge currency + * @since 0.0.1 + * */ + public function supported_currency_list() : array + { + return [ + 'USD', + 'EUR', + 'INR', + 'IDR', + 'AUD', + 'SGD', + 'JPY', + 'GBP', + 'MYR', + 'PHP', + 'THB', + 'KRW', + 'NGN', + 'GHS', + 'BRL', + 'BIF', + 'CAD', + 'CDF', + 'CVE', + 'GHP', + 'GMD', + 'GNF', + 'KES', + 'LRD', + 'MWK', + 'MZN', + 'RWF', + 'SLL', + 'STD', + 'TZS', + 'UGX', + 'XAF', + 'XOF', + 'ZMK', + 'ZMW', + 'ZWD', + 'AED', + 'AFN', + 'ALL', + 'AMD', + 'ANG', + 'AOA', + 'ARS', + 'AWG', + 'AZN', + 'BAM', + 'BBD', + 'BDT', + 'BGN', + 'BMD', + 'BND', + 'BOB', + 'BSD', + 'BWP', + 'BZD', + 'CHF', + 'CNY', + 'CLP', + 'COP', + 'CRC', + 'CZK', + 'DJF', + 'DKK', + 'DOP', + 'DZD', + 'EGP', + 'ETB', + 'FJD', + 'FKP', + 'GEL', + 'GIP', + 'GTQ', + 'GYD', + 'HKD', + 'HNL', + 'HRK', + 'HTG', + 'HUF', + 'ILS', + 'ISK', + 'JMD', + 'KGS', + 'KHR', + 'KMF', + 'KYD', + 'KZT', + 'LAK', + 'LBP', + 'LKR', + 'LSL', + 'MAD', + 'MDL', + 'MGA', + 'MKD', + 'MMK', + 'MNT', + 'MOP', + 'MRO', + 'MUR', + 'MVR', + 'MXN', + 'NAD', + 'NIO', + 'NOK', + 'NPR', + 'NZD', + 'PAB', + 'PEN', + 'PGK', + 'PKR', + 'PLN', + 'PYG', + 'QAR', + 'RON', + 'RSD', + 'RUB', + 'SAR', + 'SBD', + 'SCR', + 'SEK', + 'SHP', + 'SOS', + 'SRD', + 'SZL', + 'TJS', + 'TRY', + 'TTD', + 'TWD', + 'UAH', + 'UYU', + 'UZS', + 'VND', + 'VUV', + 'WST', + 'XCD', + 'XPF', + 'YER', + 'ZAR' + ]; + } + /** + * this will refund payment gateway charge currency + * */ + public function charge_currency() + { + return $this->getCurrency(); + } + /** + * this will refund payment gateway name + * */ + public function gateway_name() : string + { + return 'stripe'; + } +} diff --git a/src/Base/Gateways/Toyyibpay.php b/src/Base/Gateways/Toyyibpay.php new file mode 100644 index 0000000..0baab16 --- /dev/null +++ b/src/Base/Gateways/Toyyibpay.php @@ -0,0 +1,142 @@ +userSecretKey; + } + public function setUserSecretKey($userSecretKey){ + $this->userSecretKey = $userSecretKey; + return $this; + } + + public function getCategoryCode(){ + return $this->categoryCode; + } + public function setCategoryCode($categoryCode){ + $this->categoryCode = $categoryCode; + return $this; + } + + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $amount * 100; + } + return $this->get_amount_in_myr($amount); + } + + public function ipn_response(array $args = []) + { + + $some_data = [ + 'billCode' => request()->billcode, + 'billpaymentStatus' => '1' + ]; + + //todo:: write code for verify payment + $response = Http::asForm()->post($this->getBaseUrl().'/getBillTransactions',$some_data); + if ($response->ok()) { + if(!empty($response->json())){ + return $this->verified_data([ + 'status' => 'complete', + 'order_id' => substr( request()->order_id,5,-5), + 'payment_amount' => request()->amount, + 'transaction_id' => request()->billcode , + ]); + } + else{ + return ['status' => 'failed','order_id' => substr( request()->SettlementReferenceNo,5,-5)]; + } + } + return ['status' => 'failed','order_id' => substr( request()->SettlementReferenceNo,5,-5)]; + } + + /** + * @throws \Exception + */ + public function charge_customer(array $args) + { + $order_id = PaymentGatewayHelpers::wrapped_id($args['order_id']); + $some_data = array( + 'userSecretKey'=> $this->getUserSecretKey(), + 'categoryCode'=> $this->getCategoryCode(), + 'billName'=> Str::limit($args['dtitleescription'],25), + 'billDescription'=> Str::limit($args['description'],90), + 'billPriceSetting'=>1, + 'billPayorInfo'=>1, + 'billAmount'=> $this->charge_amount($args['amount']), //100=1myr or 1RM + 'billReturnUrl'=> $args['success_url'], //return get url + 'billCallbackUrl'=> $args['ipn_url'], //webhook post url + 'billExternalReferenceNo' => $order_id, //order_id + 'billTo'=> $args['name'], + 'billEmail'=> $args['email'], + 'billPhone'=> $args['mobile'] ?? '123456789', + 'billSplitPayment'=>0, + //'billSplitPaymentArgs'=>'', + 'billPaymentChannel'=>'2', + //'billContentEmail'=>'Thank you for purchasing our product!', + 'billChargeToCustomer'=>1, + 'billExpiryDate'=> Carbon::now()->addDays(5)->format('d-m-Y h:i:s'),//'17-12-2020 17:00:00', + 'billExpiryDays'=>5 + ); + + $response = Http::asForm()->post($this->getBaseUrl().'/createBill',$some_data); + + $result = $response->object(); + if ($response->ok() && !is_null($result)) { + + if (!is_array($result) && property_exists($result,'status') && $result->status === 'error'){ + abort(422,$result->msg); + } + + $billCode = current($result)->BillCode; + $redirect_url = $this->getBaseUrl(false) . $billCode; + return redirect()->away($redirect_url); + } + + abort(422,__('Toyyibpay authorization failed')); + } + + public function supported_currency_list() + { + return ['MYR']; + } + + public function charge_currency() + { + return 'MYR'; + } + + public function gateway_name() + { + return 'toyyibpay'; + } + + private function getBaseUrl($api = true){ + $sandbox_prefix = $this->getEnv() ? 'dev.' : "";//sandbox + $api_slug = $api ? 'index.php/api' : ''; + return 'https://'.$sandbox_prefix.'toyyibpay.com/'.$api_slug; + } +} diff --git a/src/Base/Gateways/TransactionCloudPay.php b/src/Base/Gateways/TransactionCloudPay.php new file mode 100644 index 0000000..46c7560 --- /dev/null +++ b/src/Base/Gateways/TransactionCloudPay.php @@ -0,0 +1,138 @@ +apiLogin; + } + public function setApiLogin($apiLogin){ + $this->apiLogin = $apiLogin; + return $this; + } + + public function getProductID(){ + return $this->productID; + } + public function setProductID($productID){ + $this->productID = $productID; + return $this; + } + public function getApiPassword(){ + return $this->apiPassword; + } + public function setApiPassword($apiPassword){ + $this->apiPassword = $apiPassword; + return $this; + } + + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $amount; + } + return $this->get_amount_in_usd($amount); + } + + public function ipn_response(array $args = []) + { + //todo:: retrieve transaction by transaction id + if (empty(request()->get("id"))){ + abort(500,__("transaction id not found")); + } + $res = Http::withHeaders($this->getHeaders()) + ->get($this->getBaseUrl()."/v1/transaction/".request()->id); + + if ($res->status() === 200){ + //get response from transaction cloud + $result = $res->object(); + if ($result->transactionStatus === "ONE_TIME_PAYMENT_STATUS_PAID" && $result->transactionType === "ONETIME" && $result->productId === $this->getProductID()){ + $payloads = json_decode(Crypt::decryptString($result->payload)); + return $this->verified_data([ + 'status' => 'complete', + 'order_id' => PaymentGatewayHelpers::unwrapped_id($payloads->order_id), + "payment_type" => $payloads->payment_type + ]); + + } + + } + + return ['status' => 'failed','order_id' => null]; + + } + + /** + * @throws \Exception + */ + public function charge_customer(array $args) + { + $order_id = PaymentGatewayHelpers::wrapped_id($args['order_id']); + + //todo:: set customised product + $res = Http::withHeaders($this->getHeaders()) + ->acceptJson() + ->post($this->getBaseUrl().'/v1/customize-product/'.$this->getProductID(),[ + 'prices' => [ + [ + 'currency' => $this->getCurrency(), + 'value' => $this->charge_amount($args['amount']) + ] + ], + 'description' => $args["description"], + 'payload' => Crypt::encryptString(json_encode(["order_id" => $order_id,"payment_type" => $args['payment_type'] ?? " "])), + 'transactionIdToMigrate' => 'TC-TR_X'.random_int(111111,999999), + 'expiresIn' => 60 + ]); + + if ($res->status() === 200){ + $query_param = http_build_query([ + "email" => $args["email"], + "firstname" => $args["name"], + ]); + return redirect()->away($res->object()?->link."?".$query_param); + } + + abort(500,__("checkout url generate failed, check your api credentials")); + } + + public function supported_currency_list() + { + return ['USD','EUR','PLN','INR','CAD','CNY','AUD','JPY','NOK','GBP','CHF','SGD','BRL','RUB','BGN','CZK','DKK','HUF','RON','SEK','GEL']; + } + + public function charge_currency() + { + return 'USD'; + } + + public function gateway_name() + { + return 'transactionclud'; + } + private function getHeaders(){ + return [ + 'User-Agent' => 'parthenon/transaction-cloud 0.1', + 'Authorization' => sprintf('%s:%s', $this->getApiLogin(), $this->getApiPassword()), + ]; + } + private function getBaseUrl(){ + $sandbox_prefix = $this->getEnv() ? 'sandbox-' : "";//sandbox + return 'https://'.$sandbox_prefix.'api.transaction.cloud'; + } +} diff --git a/src/Base/Gateways/WiPay.php b/src/Base/Gateways/WiPay.php new file mode 100644 index 0000000..86f8943 --- /dev/null +++ b/src/Base/Gateways/WiPay.php @@ -0,0 +1,150 @@ +accountNumber; + } + public function setAccountNumber($accountNumber){ + $this->accountNumber = $accountNumber; + return $this; + } + + public function getAccountApi(){ + return $this->accountApi; + } + public function setAccountApi($accountApi){ + $this->accountApi = $accountApi; + return $this; + } + + public function getFeeStructure(){ + return $this->feeStructure; + } + + public function setFeeStructure($feeStructure){ + $this->feeStructure = $feeStructure; + return $this; + } + + public function setCountryCode($countryCode){ + $this->countryCode = $countryCode; + return $this; + } + + public function getCountryCode(){ + return $this->countryCode; + } + + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $amount; + } + return $this->get_amount_in_usd($amount); + } + + public function ipn_response(array $args = []) + { + + //todo check status is success + $status = \request()->status; + $hash = \request()->hash; + $order_id = \request()->order_id; + $transaction_id = \request()->transaction_id; + $data = json_decode(\request()->data); + $data = json_decode($data); + + if (!empty($hash) && !empty($transaction_id) && !empty($order_id) && $status === 'success'){ + // add condition + $charge_amount = \session()->get('wipay_total_amount'); + \session()->forget('wipay_total_amount'); + $generate_hash = md5($transaction_id.number_format($charge_amount,2).$this->getAccountApi()); + if (hash_equals($hash,$generate_hash)){ + return $this->verified_data([ + 'status' => 'complete', + 'transaction_id' => $transaction_id , + 'order_id' => PaymentGatewayHelpers::unwrapped_id($order_id ?? ""), + 'order_type' => $data->payment_type ?? "" + ]); + } + } + + return ['status' => 'failed','order_id' => PaymentGatewayHelpers::unwrapped_id($order_id),'order_type' => $data->payment_type ?? ""]; + } + + /** + * @throws \Exception + */ + public function charge_customer(array $args) + { + $order_id = PaymentGatewayHelpers::wrapped_id($args['order_id']); + + //https://tt.wipayfinancial.com/plugins/payments/request + //https://jm.wipayfinancial.com/plugins/payments/request + //https://bb.wipayfinancial.com/plugins/payments/request + \session()->put('wipay_total_amount',number_format($this->charge_amount($args['amount']),2)); + $res = Http::acceptJson()->asForm()->post("https://".strtolower($this->getCountryCode()).".wipayfinancial.com/plugins/payments/request",[ + "account_number" => $this->getAccountNumber() , //If environment is sandbox, then you must use the WiPay SANDBOX Account Number 1234567890. + "currency" => $this->getCurrency(), // JMD, TTD, USD + "environment" => $this->getEnv() ? 'sandbox' : 'live' , //live, sandbox, + "fee_structure" => $this->getFeeStructure(), //customer_pay, merchant_absorb, split, who will pay wipay transaction fee, + "method" => "credit_card", + "order_id" => $order_id, //order_id by application + "origin" => env('APP_NAME'), //Your application's custom unique identifier for this transaction. + "total" => number_format($this->charge_amount($args['amount']),2), //decimal value, + "email" => $args['email'], + "name" => $args['name'], + 'avs' => '0', + "data" => json_encode($reference = [ + 'order_id' => $order_id, + 'payment_type' => $args['payment_type'] + ]), + 'country_code' => $this->getCountryCode(), + 'response_url' => $args['ipn_url'], //get: callback for get data about the payment + ]); + + $redirect_url = $res->object()?->url; + if (is_null($redirect_url)){ + abort(501,$res->object()?->message); + } + return redirect()->away($redirect_url); + } + + public function supported_currency_list() + { + return ['JMD', 'TTD', 'USD']; + } + + public function charge_currency() + { + return 'USD'; + } + + public function gateway_name() + { + return 'wipay'; + } + +} diff --git a/src/Base/Gateways/ZitoPay.php b/src/Base/Gateways/ZitoPay.php new file mode 100644 index 0000000..b5a77a3 --- /dev/null +++ b/src/Base/Gateways/ZitoPay.php @@ -0,0 +1,231 @@ +username; + } + public function setUsername($username){ + $this->username = $username; + return $this; + } + + public function charge_amount($amount) + { + if (in_array($this->getCurrency(), $this->supported_currency_list())){ + return $amount; + } + return $this->get_amount_in_usd($amount); + } + + public function ipn_response(array $args = []) + { + + if (request()->has('ref')){ + $response = Http::acceptJson()->asForm()->post('https://zitopay.africa/api_v1',[ + "action" => 'get_transaction', + 'receiver' => $this->getUsername(), + 'ref' => request()->get('ref'), + 'trade_id' => 0 + ]); + + if ($response->ok()){ + $result = $response->object(); + if (!empty($result) && !property_exists($result,'error')){ + if ($result->status_msg === 'COMPLETED'){ + return $this->verified_data([ + 'status' => $result->status_msg === 'COMPLETED' ? 'complete' : strtolower($result->status_msg), + 'transaction_id' => request()->get('zitopay_transaction_reference'), + 'order_id' => Str::of(request()->get('ref'))->after('#')->__toString() , + ]); + } + } + } + } + return ['status' => 'failed']; + } + + public function charge_customer(array $args) + { + $args['username'] = $this->getUsername(); + $args['currency'] = $this->getCurrency(); + return view('paymentgateway::zitopay',compact('args')); + } + + public function supported_currency_list() + { + return [ + "USD", + "EUR", + "GBP", + "AED", + "AFN", + "ALL", + "AMD", + "ANG", + "AOA", + "ARS", + "AUD", + "AWG", + "AZN", + "BAM", + "BBD", + "BDT", + "BGN", + "BHD", + "BIF", + "BMD", + "BND", + "BOB", + "BRL", + "BSD", + "BTN", + "BWP", + "BYN", + "BZD", + "CAD", + "CDF", + "CHF", + "CLP", + "CNY", + "COP", + "CRC", + "CUP", + "CVE", + "CZK", + "DJF", + "DKK", + "DOP", + "DZD", + "EGP", + "ERN", + "ETB", + "FJD", + "GEL", + "GHS", + "GMD", + "GNF", + "GTQ", + "GYD", + "HNL", + "HRK", + "HTG", + "HUF", + "IDR", + "ILS", + "INR", + "IQD", + "IRR", + "ISK", + "JMD", + "JOD", + "JPY", + "KES", + "KGS", + "KHR", + "KMF", + "KPW", + "KRW", + "KWD", + "KZT", + "LAK", + "LBP", + "LKR", + "LRD", + "LSL", + "LTL", + "LVL", + "LYD", + "MAD", + "MDL", + "MGA", + "MKD", + "MMK", + "MNT", + "MRO", + "MUR", + "MVR", + "MWK", + "MXN", + "MYR", + "MZN", + "NAD", + "NGN", + "NIO", + "NOK", + "NPR", + "NZD", + "OMR", + "PAB", + "PEN", + "PGK", + "PHP", + "PKR", + "PLN", + "PYG", + "QAR", + "RON", + "RSD", + "RUB", + "RWF", + "SAR", + "SCR", + "SDG", + "SEK", + "SGD", + "SLL", + "SOS", + "SRD", + "STD", + "SVC", + "SYP", + "SZL", + "THB", + "TJS", + "TMT", + "TND", + "TOP", + "TRY", + "TTD", + "TWD", + "TZS", + "UAH", + "UGX", + "UYU", + "UZS", + "VEF", + "VND", + "VUV", + "WST", + "XCD", + "XOF", + "YER", + "ZAR", + "ZMW", + "ZWD", + "XAF", + ]; + } + public function charge_currency() + { + return "USD"; + } + + public function gateway_name() + { + return 'zitopay'; + } +} diff --git a/src/Base/GlobalCurrency.php b/src/Base/GlobalCurrency.php new file mode 100644 index 0000000..aa36159 --- /dev/null +++ b/src/Base/GlobalCurrency.php @@ -0,0 +1,183 @@ + "DBD", + 'USD' => '$', + 'EUR' => '€', + 'INR' => '₹', + 'IDR' => 'Rp', + 'AUD' => 'A$', + 'SGD' => 'S$', + 'JPY' => '¥', + 'GBP' => '£', + 'MYR' => 'RM', + 'PHP' => '₱', + 'THB' => '฿', + 'KRW' => '₩', + 'NGN' => '₦', + 'GHS' => 'GH₵', + 'BRL' => 'R$', + 'BIF' => 'FBu', + 'CAD' => 'C$', + 'CDF' => 'FC', + 'CVE' => 'Esc', + 'GHP' => 'GH₵', + 'GMD' => 'D', + 'GNF' => 'FG', + 'KES' => 'Ksh', + 'LRD' => 'L$', + 'MWK' => 'MK', + 'MZN' => 'MT', + 'RWF' => 'R₣', + 'SLL' => 'Le', + 'STD' => 'Db', + 'TZS' => 'TSh', + 'UGX' => 'UGX', + 'XAF' => 'FCFA', + 'XOF' => 'CFA', + 'ZMK' => 'ZK', + 'ZMW' => 'ZK', + 'ZWD' => 'Z$', + 'AED' => 'د.إ', + 'AFN' => '؋', + 'ALL' => 'L', + 'AMD' => '֏', + 'ANG' => 'NAf', + 'AOA' => 'Kz', + 'ARS' => '$', + 'AWG' => 'ƒ', + 'AZN' => '₼', + 'BAM' => 'KM', + 'BBD' => 'Bds$', + 'BDT' => '৳', + 'BGN' => 'Лв', + 'BMD' => '$', + 'BND' => 'B$', + 'BOB' => 'Bs', + 'BSD' => 'B$', + 'BWP' => 'P', + 'BZD' => '$', + 'CHF' => 'CHF', + 'CNY' => '¥', + 'CLP' => '$', + 'COP' => '$', + 'CRC' => '₡', + 'CZK' => 'Kč', + 'DJF' => 'Fdj', + 'DKK' => 'Kr', + 'DOP' => 'RD$', + 'DZD' => 'دج', + 'EGP' => 'E£', + 'ETB' => 'ብር', + 'FJD' => 'FJ$', + 'FKP' => '£', + 'GEL' => 'ლ', + 'GIP' => '£', + 'GTQ' => 'Q', + 'GYD' => 'G$', + 'HKD' => 'HK$', + 'HNL' => 'L', + 'HRK' => 'kn', + 'HTG' => 'G', + 'HUF' => 'Ft', + 'ILS' => '₪', + 'ISK' => 'kr', + 'JMD' => '$', + 'KGS' => 'Лв', + 'KHR' => '៛', + 'KMF' => 'CF', + 'KYD' => '$', + 'KZT' => '₸', + 'LAK' => '₭', + 'LBP' => 'ل.ل.', + 'LKR' => 'ரூ', + 'LSL' => 'L', + 'MAD' => 'MAD', + 'MDL' => 'L', + 'MGA' => 'Ar', + 'MKD' => 'Ден', + 'MMK' => 'K', + 'MNT' => '₮', + 'MOP' => 'MOP$', + 'MRO' => 'MRU', + 'MUR' => '₨', + 'MVR' => 'Rf', + 'MXN' => '$', + 'NAD' => 'N$', + 'NIO' => 'C$', + 'NOK' => 'kr', + 'NPR' => 'रू', + 'NZD' => '$', + 'PAB' => 'B/.', + 'PEN' => 'S/', + 'PGK' => 'K', + 'PKR' => '₨', + 'PLN' => 'zł', + 'PYG' => '₲', + 'QAR' => 'QR', + 'RON' => 'lei', + 'RSD' => 'din', + 'RUB' => '₽', + 'SAR' => 'SR', + 'SBD' => 'Si$', + 'SCR' => 'SR', + 'SEK' => 'kr', + 'SHP' => '£', + 'SOS' => 'Sh.so.', + 'SRD' => '$', + 'SZL' => 'E', + 'TJS' => 'ЅM', + 'TRY' => '₺', + 'TTD' => 'TT$', + 'TWD' => 'NT$', + 'UAH' => '₴', + 'UYU' => '$U', + 'UZS' => 'so\'m', + 'VND' => '₫', + 'VUV' => 'VT', + 'WST' => 'WS$', + 'XCD' => '$', + 'XPF' => '₣', + 'YER' => '﷼', + 'ZAR' => 'R', + 'BHD' => 'BHD', + 'KWD' => 'د.ك', + 'LYD' => 'د.ل', + 'IRR' => '﷼', + 'IRT' => 'تومان', + 'JOD' => 'د.أ' + ]; + } + + public static function get_currency_number($currencyCode = 'USD'){ + return strval( + (new static())->getCurrencyProperty($currencyCode,'numeric_code') + ); + } + + protected function getCurrencyProperty($currencyCode,$property){ + $currencyCode = trim(strtoupper($currencyCode.'')); + $data = json_decode(static::ENCODED_DATA,true); + if( + !empty($currencyCode) && + isset($data[$currencyCode]) && + isset($data[$currencyCode][$property]) + ){ + return $data[$currencyCode][$property]; + } + + return null; + } +} diff --git a/src/Base/PaymentGatewayBase.php b/src/Base/PaymentGatewayBase.php new file mode 100644 index 0000000..b8c6572 --- /dev/null +++ b/src/Base/PaymentGatewayBase.php @@ -0,0 +1,60 @@ + 'complete'],$args); + } + /** + * @since 1.0.0 + * charge customer account by this method + * */ + abstract public function charge_customer(array $args); + /** + * @since 1.0.0 + * list of all supported currency by payment gateway + * */ + abstract public function supported_currency_list(); + /** + * charge_currency() + * @since 1.0.0 + * get charge currency for payment gateway + * */ + abstract public function charge_currency(); + /** + * gateway_name() + * @since 1.0.0 + * add payment gateway name + * */ + abstract public function gateway_name(); + /** + * global_currency() + * @since 1.0.0 + * get global currency + * */ + protected static function global_currency(){ + return config('paymentgateway.global_currency'); + } + + +} diff --git a/src/Base/PaymentGatewayHelpers.php b/src/Base/PaymentGatewayHelpers.php new file mode 100644 index 0000000..3b1da33 --- /dev/null +++ b/src/Base/PaymentGatewayHelpers.php @@ -0,0 +1,201 @@ +charge_customer_from_controller(); + $transaction_id = $payment_data['transaction_id'] ?? ""; + Session::put('authorizenet_last_transaction_id',$transaction_id); + return redirect($request->ipn_url."?transaction_id=".$transaction_id."&order_id=".$request->order_id."&order_type=".$request->payment_type."&status=".$payment_data['status']); + } +} diff --git a/src/Http/Controllers/Controller.php b/src/Http/Controllers/Controller.php new file mode 100644 index 0000000..20825c4 --- /dev/null +++ b/src/Http/Controllers/Controller.php @@ -0,0 +1,12 @@ + $request->merchantEmail, + 'paystack.secretKey' => base64_decode($request->secretKey), + 'paystack.publicKey' => $request->publicKey, + 'paystack.paymentUrl' => 'https://api.paystack.co', + ])); + + try{ + return Paystack::getAuthorizationUrl()->redirectNow(); + }catch(\Exception $e) { + abort(405,$e->getMessage()); + } + } +} diff --git a/src/Http/Controllers/PowertranszPaymentController.php b/src/Http/Controllers/PowertranszPaymentController.php new file mode 100644 index 0000000..6388adc --- /dev/null +++ b/src/Http/Controllers/PowertranszPaymentController.php @@ -0,0 +1,16 @@ +charge_customer_from_controller(); + return $payment_data; + } +} diff --git a/src/Http/Controllers/StripePaymentController.php b/src/Http/Controllers/StripePaymentController.php new file mode 100644 index 0000000..d39444d --- /dev/null +++ b/src/Http/Controllers/StripePaymentController.php @@ -0,0 +1,34 @@ +charge_customer_from_controller([ + 'amount' => $request->amount, + 'charge_amount' => $request->charge_amount, + 'title' => $request->title, + 'description' => $request->description, + 'ipn_url' => $request->ipn_url, + 'order_id' => $request->order_id, + 'track' => $request->track, + 'cancel_url' => $request->cancel_url, + 'success_url' => $request->success_url, + 'email' => $request->email, + 'name' => $request->name, + 'payment_type' => $request->payment_type, + 'secret_key' => $request->secret_key, + 'currency' => $request->currency, + ]); + return response()->json(['id' => $stripe_session['id']]); + }catch(\Exception $e){ + return response()->json(['msg' => $e->getMessage(),'type' => 'danger']); + } + } +} diff --git a/src/Providers/PaymentgatewayServiceProvider.php b/src/Providers/PaymentgatewayServiceProvider.php new file mode 100644 index 0000000..9cc7925 --- /dev/null +++ b/src/Providers/PaymentgatewayServiceProvider.php @@ -0,0 +1,118 @@ +publishes([ + __DIR__.'/../../config/paymentgateway.php' => config_path('paymentgateway.php'), + ], 'paymentgateway-config'); + + /** + * Routes + * + * Uncomment this function call to load the route files. + * A web.php file has already been generated. + */ + $this->loadRoutesFrom(__DIR__.'/../../routes/web.php'); + + /** + * Translations + * + * Uncomment the first function call to load the translations. + * Uncomment the second function call to load the JSON translations. + * Uncomment the third function call to make the translations publishable using the 'translations' tag. + */ + $this->loadTranslationsFrom(__DIR__.'/../../resources/lang', 'paymentgateway'); + $this->loadJsonTranslationsFrom(__DIR__.'/../../resources/lang', 'paymentgateway'); + $this->publishes([ + __DIR__.'/../../resources/lang' => resource_path('lang/vendor/paymentgateway'), + ], 'translations'); + + /** + * Views + * + * Uncomment the first section to load the views. + * Uncomment the second section to make the view publishable using the 'view' tags. + */ + $this->loadViewsFrom(__DIR__.'/../../resources/views', 'paymentgateway'); + $this->publishes([ + __DIR__.'/../../resources/views' => resource_path('views/vendor/paymentgateway'), + ], 'views'); + + /** + * Commands + * + * Uncomment this section to load the commands. + * A basic command file has already been generated in 'src\Console\Commands\MyPackageCommand.php'. + */ + // if ($this->app->runningInConsole()) { + // $this->commands([ + // \Xgenious\Paymentgateway\Console\Commands\PaymentgatewayCommand::class, + // ]); + // } + + /** + * Public assets + * + * Uncomment this functin call to make the public assets publishable using the 'public' tag. + */ + // $this->publishes([ + // __DIR__.'/../../public' => public_path('vendor/paymentgateway'), + // ], 'public'); + + /** + * Migrations + * + * Uncomment the first function call to load the migrations. + * Uncomment the second function call to make the migrations publishable using the 'migrations' tags. + */ + // $this->loadMigrationsFrom(__DIR__.'/../../database/migrations'); + // $this->publishes([ + // __DIR__.'/../../database/migrations/' => database_path('migrations') + // ], 'migrations'); + } + + /** + * Register the application services. + * + * @return void + */ + public function register() + { + /** + * Config file + * + * Uncomment this function call to load the config file. + * If the config file is also publishable, it will merge with that file + */ + $this->mergeConfigFrom( + __DIR__.'/../../config/paymentgateway.php', 'paymentgateway' + ); + + /** + * register facades + * + * */ + app()->bind('XgPaymentGateway',function (){ + return new PaymentGatewayHelpers(); + }); + + } +} diff --git a/src/Traits/ConvertUsdSupport.php b/src/Traits/ConvertUsdSupport.php new file mode 100644 index 0000000..50cbd2e --- /dev/null +++ b/src/Traits/ConvertUsdSupport.php @@ -0,0 +1,44 @@ +getCurrency())){ + report("you have not yet set your global currency"); + } + if ($this->getCurrency() === 'USD'){ + return $amount; + } + $payable_amount = $this->make_amount_in_usd($amount, $this->getCurrency()); + if ($payable_amount < 1) { + return $payable_amount . __('USD amount is not supported by '.$this->gateway_name()); + } + return $payable_amount; + } + protected function make_amount_in_usd($amount,$currency){ + $output = 0; + $all_currency = GlobalCurrency::script_currency_list(); + foreach ($all_currency as $cur => $symbol) { + if ($cur === 'USD') { + continue; + } + if ($cur === $currency) { + $exchange_rate = $this->getExchangeRate(); // exchange rate + $output = $amount * $exchange_rate; + } + } + + return $output; + } +} diff --git a/src/Traits/CurrencySupport.php b/src/Traits/CurrencySupport.php new file mode 100644 index 0000000..a098120 --- /dev/null +++ b/src/Traits/CurrencySupport.php @@ -0,0 +1,39 @@ +currency; + } + public function getExchangeRate() + { + return $this->exchange_rate ; + } + public function setExchangeRate($rate) + { + $this->exchange_rate = $rate; + return $this; + } + public function setCurrency($currency = "USD") + { + $this->currency = $currency; + return $this; + } + public function getCurrencyNumber($currency = "USD"): string + { + return GlobalCurrency::get_currency_number($currency); + } + + private function is_decimal($n) { + // Note that floor returns a float + return is_numeric($n) && floor($n) != $n; + } +} diff --git a/src/Traits/IndianCurrencySupport.php b/src/Traits/IndianCurrencySupport.php new file mode 100644 index 0000000..1ea9394 --- /dev/null +++ b/src/Traits/IndianCurrencySupport.php @@ -0,0 +1,45 @@ +getCurrency() === 'INR'){ + return $amount; + } + $payable_amount = $this->make_amount_in_inr($amount, $this->getCurrency()); + if ($payable_amount < 1) { + return $payable_amount . __('USD amount is not supported by '.$this->gateway_name()); + } + return $payable_amount; + } + /** + * convert amount to ngn currency base on conversation given by admin + * */ + private function make_amount_in_inr($amount, $currency) + { + $output = 0; + $all_currency = GlobalCurrency::script_currency_list(); + foreach ($all_currency as $cur => $symbol) { + if ($cur === 'INR') { + continue; + } + if ($cur == $currency) { + $exchange_rate = $this->getExchangeRate(); + $output = $amount * $exchange_rate; + } + } + + return $output; + } + +} diff --git a/src/Traits/LocationSupport.php b/src/Traits/LocationSupport.php new file mode 100644 index 0000000..17f5171 --- /dev/null +++ b/src/Traits/LocationSupport.php @@ -0,0 +1,23 @@ + $position->countryName, + 'city' => 'unknown' + ]; + } + + return [ + 'country' => 'unknown', + 'city' => 'unknown' + ]; + } +} + diff --git a/src/Traits/MalaysiaCurrencySupport.php b/src/Traits/MalaysiaCurrencySupport.php new file mode 100644 index 0000000..6ab7213 --- /dev/null +++ b/src/Traits/MalaysiaCurrencySupport.php @@ -0,0 +1,45 @@ +getCurrency() === 'MYR'){ + return $amount * 100; + } + $payable_amount = $this->make_amount_in_myr($amount, $this->getCurrency()); + if ($payable_amount < 1) { + return $payable_amount . __('USD amount is not supported by '.$this->gateway_name()); + } + return $payable_amount * 100; + } + /** + * convert amount to ngn currency base on conversation given by admin + * */ + private function make_amount_in_myr($amount, $currency) + { + $output = 0; + $all_currency = GlobalCurrency::script_currency_list(); + foreach ($all_currency as $cur => $symbol) { + if ($cur === 'MYR') { + continue; + } + if ($cur == $currency) { + $exchange_rate = $this->getExchangeRate(); + $output = $amount * $exchange_rate; + } + } + + return $output; + } + +} diff --git a/src/Traits/MyanmarCurrencySupport.php b/src/Traits/MyanmarCurrencySupport.php new file mode 100644 index 0000000..96519d0 --- /dev/null +++ b/src/Traits/MyanmarCurrencySupport.php @@ -0,0 +1,45 @@ +getCurrency() === 'MYR'){ + return $multiply ? $amount * 100 : $amount; + } + $payable_amount = $this->make_amount_in_myr($amount, $this->getCurrency()); + if ($payable_amount < 1) { + return $payable_amount . __('MYR amount is not supported by '.$this->gateway_name()); + } + return $multiply ? $payable_amount * 100 : $payable_amount; + } + /** + * convert amount to ngn currency base on conversation given by admin + * */ + private function make_amount_in_myr($amount, $currency) + { + $output = 0; + $all_currency = GlobalCurrency::script_currency_list(); + foreach ($all_currency as $cur => $symbol) { + if ($cur === 'MYR') { + continue; + } + if ($cur == $currency) { + $exchange_rate = $this->getExchangeRate(); + $output = $amount * $exchange_rate; + } + } + + return $output; + } + +} diff --git a/src/Traits/PaymentEnvironment.php b/src/Traits/PaymentEnvironment.php new file mode 100644 index 0000000..6d3f2d1 --- /dev/null +++ b/src/Traits/PaymentEnvironment.php @@ -0,0 +1,20 @@ +env = $env; + return $this; + } + /* get environment: true or false */ + private function getEnv(){ + return $this->env; + } +} diff --git a/src/Traits/ZarCurrencySupport.php b/src/Traits/ZarCurrencySupport.php new file mode 100644 index 0000000..0236dea --- /dev/null +++ b/src/Traits/ZarCurrencySupport.php @@ -0,0 +1,34 @@ +getCurrency() === 'ZAR'){ + return $amount; + } + $payable_amount = $this->make_amount_in_zar($amount, $this->getCurrency()); + if ($payable_amount < 1) { + return $payable_amount . __('amount is not supported by '.$this->gateway_name()); + } + return $payable_amount; + } + protected function make_amount_in_zar($amount,$currency){ + $output = 0; + $all_currency = GlobalCurrency::script_currency_list(); + foreach ($all_currency as $cur => $symbol) { + if ($cur === 'ZAR') { + continue; + } + if ($cur == $currency) { + $exchange_rate = $this->getExchangeRate(); + $output = $amount * $exchange_rate ; + } + } + + return $output; + } +} diff --git a/tests/.DS_Store b/tests/.DS_Store new file mode 100644 index 0000000..9afa863 Binary files /dev/null and b/tests/.DS_Store differ diff --git a/tests/Gateways/SenangpayTest.php b/tests/Gateways/SenangpayTest.php new file mode 100644 index 0000000..9983302 --- /dev/null +++ b/tests/Gateways/SenangpayTest.php @@ -0,0 +1,42 @@ +setCurrency('MYR'); + $this->assertEquals(10.00, $zitopay->charge_amount(10.00)); + } + + public function test_charge_customer() + { + $zitopay = new Senangpay(); + $zitopay->setMerchantId('358169193868945'); + $zitopay->setSecretKey('5876-708'); + $zitopay->setEnv(true); + $zitopay->setHashMethod('sha256'); + $zitopay->setCurrency('MYR'); + $response = $zitopay->charge_customer([ + 'amount' => 25.5, + 'title' => 'this is test title', + 'description' => 'this is test description', + 'ipn_url' => route('post.ipn'), //post route + 'order_id' => 56, + 'track' => 'asdfasdfsdf', + 'cancel_url' => route('payment.failed'), + 'success_url' => route('payment.success'), + 'email' => 'dvrobin4@gmail.com', + 'name' => 'sharifur rahman', + 'payment_type' => 'order', + ]); + $this->assertArrayHasKey('url', $response); + } + +} diff --git a/tests/Gateways/ZitoPayTest.php b/tests/Gateways/ZitoPayTest.php new file mode 100644 index 0000000..4bc82b4 --- /dev/null +++ b/tests/Gateways/ZitoPayTest.php @@ -0,0 +1,70 @@ +setCurrency('USD'); + $this->assertEquals(10.00, $zitopay->charge_amount(10.00)); + } + + public function test_charge_amount_converts_to_usd_if_not_supported_currency() + { + $zitopay = new ZitoPay(); + $zitopay->setCurrency('DBD'); + $zitopay->setEnv(true); + $zitopay->setExchangeRate(5); + $this->assertEquals(50, $zitopay->charge_amount(10)); + } + + public function test_supported_currency_list_returns_array() + { + $zitopay = new ZitoPay(); + $this->assertIsArray($zitopay->supported_currency_list()); + } + + public function test_gateway_name_returns_zitopay() + { + $zitopay = new ZitoPay(); + $this->assertEquals('zitopay', $zitopay->gateway_name()); + } + /* need to fix this code test */ + // public function test_ipn_response_returns_complete_if_transaction_is_successful() + // { + // Http::fake([ + // 'zitopay.africa/api_v1' => Http::response([ + // 'status_msg' => 'COMPLETED', + // 'zitopay_transaction_reference' => '123456', + // ], 200), + // ]); + + // $zitopay = new ZitoPay(); + // $result = $zitopay->ipn_response(); + + // $this->assertEquals('COMPLETED', $result['status']); + // $this->assertEquals('123456', $result['transaction_id']); + // $this->assertEquals('123', $result['order_id']); + // } + + public function test_ipn_response_returns_failed_if_transaction_is_not_successful() + { + Http::fake([ + 'zitopay.africa/api_v1' => Http::response([ + 'status_msg' => 'DECLINED', + 'zitopay_transaction_reference' => '123456', + ], 200), + ]); + + $zitopay = new ZitoPay(); + $result = $zitopay->ipn_response(['ref' => 'order#123']); + + $this->assertEquals('failed', $result['status']); + } +} diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 0000000..9642ccc --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,28 @@ +