first upload all files

This commit is contained in:
NW
2023-06-11 13:14:03 +01:00
parent f14dbc52b5
commit c08b36d1b6
1705 changed files with 106852 additions and 0 deletions

View File

@@ -0,0 +1,29 @@
<?php
namespace Modules\Payment\Facades;
use Illuminate\Support\Facades\Facade;
/**
* @method static \Illuminate\Support\Collection all()
* @method static array names()
* @method static \Modules\Payment\GatewayInterface get(string $name)
* @method static \Modules\Payment\GatewayManager register(string $name, callable|object $driver)
* @method static int count()
* @method static bool isEmpty()
* @method static bool isNotEmpty()
*
* @see \Modules\Payment\GatewayManager
*/
class Gateway extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return \Modules\Payment\GatewayManager::class;
}
}

View File

@@ -0,0 +1,13 @@
<?php
namespace Modules\Payment;
use Illuminate\Http\Request;
use Modules\Order\Entities\Order;
interface GatewayInterface
{
public function purchase(Order $order, Request $request);
public function complete(Order $order);
}

View File

@@ -0,0 +1,10 @@
<?php
namespace Modules\Payment;
use Modules\Support\Manager;
class GatewayManager extends Manager
{
//
}

View File

@@ -0,0 +1,31 @@
<?php
namespace Modules\Payment;
use JsonSerializable;
abstract class GatewayResponse implements JsonSerializable
{
abstract public function getOrderId();
public function toArray()
{
$data = ['orderId' => $this->getOrderId()];
if ($this instanceof ShouldRedirect) {
$data['redirectUrl'] = $this->getRedirectUrl();
}
return $data;
}
public function jsonSerialize()
{
return $this->toArray();
}
public function __toString()
{
return json_encode($this->jsonSerialize());
}
}

View File

@@ -0,0 +1,117 @@
<?php
namespace Modules\Payment\Gateways;
use Exception;
use Illuminate\Http\Request;
use Modules\Order\Entities\Order;
use Modules\Payment\GatewayInterface;
use Modules\Payment\Responses\AuthorizenetResponse;
use net\authorize\api\contract\v1 as AnetAPI;
use net\authorize\api\controller as AnetController;
use stdClass;
class AuthorizeNet implements GatewayInterface
{
public $label;
public $description;
public const SUPPORTED_CURRENCIES = ['CHF', 'DKK', 'EUR', 'GBP', 'NOK', 'PLN', 'SEK', 'USD', 'AUD', 'NZD', 'CAD'];
public function __construct()
{
$this->label = setting('authorizenet_label');
$this->description = setting('authorizenet_description');
}
public function purchase(Order $order, Request $request)
{
if (!in_array(currency(), self::SUPPORTED_CURRENCIES)) {
throw new Exception(trans('payment::messages.currency_not_supported'));
}
$response = $this->getAnAcceptPaymentPage($order);
return new AuthorizenetResponse($order, $response);
}
public function complete(Order $order)
{
return new AuthorizenetResponse($order, request());
}
private function getAnAcceptPaymentPage(Order $order)
{
define('AUTHORIZENET_LOG_FILE', 'phplog');
$reference = 'ref' . time();
$callbackUrl = env('APP_ENV') === 'local' ? 'https://example.com/receipt' : $this->getRedirectUrl($order, $reference);
$cancelUrl = env('APP_ENV') === 'local' ? 'https://example.com/cancel' : route('checkout.create');
//encode ampersand of the query parameter to make it compatible for api usage
$encodedCallbackUrl = str_replace('&', '%26', $callbackUrl);
/* Create a merchantAuthenticationType object with authentication details
retrieved from the constants file */
$merchantAuthentication = new AnetAPI\MerchantAuthenticationType();
$merchantAuthentication->setName(setting('authorizenet_merchant_login_id'));
$merchantAuthentication->setTransactionKey(setting('authorizenet_merchant_transaction_key'));
//create a transaction
$transactionRequestType = new AnetAPI\TransactionRequestType();
$transactionRequestType->setTransactionType('authCaptureTransaction');
$transactionRequestType->setAmount($order->total->convertToCurrentCurrency()->amount());
$transactionRequestType->setCurrencyCode(currency());
// Set Hosted Form options
$hostedPaymentButtonOptions = new AnetAPI\SettingType();
$hostedPaymentButtonOptions->setSettingName('hostedPaymentButtonOptions');
$hostedPaymentButtonOptions->setSettingValue("{\"text\": \"Pay\"}");
$hostedPaymentOrderOptions = new AnetAPI\SettingType();
$hostedPaymentOrderOptions->setSettingName('hostedPaymentOrderOptions');
$hostedPaymentOrderOptions->setSettingValue("{\"show\": false}");
$hostedPaymentReturnOptions = new AnetAPI\SettingType();
$hostedPaymentReturnOptions->setSettingName('hostedPaymentReturnOptions');
$hostedPaymentReturnOptions->setSettingValue("{\"url\": \"$encodedCallbackUrl\", \"cancelUrl\": \"$cancelUrl\", \"showReceipt\": true}");
// Build transaction request
$request = new AnetAPI\GetHostedPaymentPageRequest();
$request->setMerchantAuthentication($merchantAuthentication);
// Set the transaction's refId
$request->setRefId($reference);
$request->setTransactionRequest($transactionRequestType);
$request->addToHostedPaymentSettings($hostedPaymentButtonOptions);
$request->addToHostedPaymentSettings($hostedPaymentOrderOptions);
$request->addToHostedPaymentSettings($hostedPaymentReturnOptions);
//execute request
$controller = new AnetController\GetHostedPaymentPageController($request);
$response = $controller->executeWithApiResponse(setting('authorizenet_test_mode') ? \net\authorize\api\constants\ANetEnvironment::SANDBOX : \net\authorize\api\constants\ANetEnvironment::PRODUCTION);
$extendedResponse = new stdClass();
if ($response != null && $response->getMessages()->getResultCode() == 'Ok') {
$extendedResponse->token = $response->getToken();
} else {
$errorMessages = $response->getMessages()->getMessage();
throw new Exception(trans('payment::messages.payment_gateway_error'));
}
$extendedResponse->data = $response;
$extendedResponse->reference = $reference;
return $extendedResponse;
}
private function getRedirectUrl($order, $reference)
{
return route('checkout.complete.store', ['orderId' => $order->id, 'paymentMethod' => 'authorizenet', 'reference' => $reference]);
}
}

View File

@@ -0,0 +1,32 @@
<?php
namespace Modules\Payment\Gateways;
use Illuminate\Http\Request;
use Modules\Order\Entities\Order;
use Modules\Payment\GatewayInterface;
use Modules\Payment\Responses\NullResponse;
class BankTransfer implements GatewayInterface
{
public $label;
public $description;
public $instructions;
public function __construct()
{
$this->label = setting('bank_transfer_label');
$this->description = setting('bank_transfer_description');
$this->instructions = setting('bank_transfer_instructions');
}
public function purchase(Order $order, Request $request)
{
return new NullResponse($order);
}
public function complete(Order $order)
{
return new NullResponse($order);
}
}

View File

@@ -0,0 +1,30 @@
<?php
namespace Modules\Payment\Gateways;
use Illuminate\Http\Request;
use Modules\Order\Entities\Order;
use Modules\Payment\GatewayInterface;
use Modules\Payment\Responses\NullResponse;
class COD implements GatewayInterface
{
public $label;
public $description;
public function __construct()
{
$this->label = setting('cod_label');
$this->description = setting('cod_description');
}
public function purchase(Order $order, Request $request)
{
return new NullResponse($order);
}
public function complete(Order $order)
{
return new NullResponse($order);
}
}

View File

@@ -0,0 +1,32 @@
<?php
namespace Modules\Payment\Gateways;
use Illuminate\Http\Request;
use Modules\Order\Entities\Order;
use Modules\Payment\GatewayInterface;
use Modules\Payment\Responses\NullResponse;
class CheckPayment implements GatewayInterface
{
public $label;
public $description;
public $instructions;
public function __construct()
{
$this->label = setting('check_payment_label');
$this->description = setting('check_payment_description');
$this->instructions = setting('check_payment_instructions');
}
public function purchase(Order $order, Request $request)
{
return new NullResponse($order);
}
public function complete(Order $order)
{
return new NullResponse($order);
}
}

View File

@@ -0,0 +1,54 @@
<?php
namespace Modules\Payment\Gateways;
use Exception;
use Illuminate\Http\Request;
use Modules\Order\Entities\Order;
use Modules\Payment\GatewayInterface;
use Modules\Payment\Responses\FlutterwaveResponse;
use Modules\Payment\Responses\InstamojoResponse;
use stdClass;
class Flutterwave implements GatewayInterface
{
public $label;
public $description;
public const SUPPORTED_CURRENCIES = ['GBP', 'CAD', 'XAF', 'CLP', 'COP', 'EGP', 'EUR', 'GHS', 'GNF', 'KES', 'MWK', 'MAD', 'NGN', 'RWF', 'SLL', 'STD', 'ZAR', 'TZS', 'UGX', 'USD', 'XOF', 'ZMW'];
public const PAYMENT_OPTIONS = ['credit', 'ussd', 'nqr', 'barter', 'mobilemoneyzambia', 'mobilemoneyrwanda', 'mobilemoneyuganda', 'mobilemoneyfranco', 'mobilemoneyghana', 'mpesa', 'banktransfer', 'account', 'card'];
public function __construct()
{
$this->label = setting('flutterwave_label');
$this->description = setting('flutterwave_description');
}
public function purchase(Order $order, Request $request)
{
if (!in_array(currency(), self::SUPPORTED_CURRENCIES)) {
throw new Exception(trans('payment::messages.currency_not_supported'));
}
$response = new stdClass();
$response->public_key = setting('flutterwave_public_key');
$response->currency = currency();
$response->order_id = $order->id;
$response->amount = $order->total->convertToCurrentCurrency()->amount();
$response->tx_ref = 'ref' . time();
$response->payment_options = self::PAYMENT_OPTIONS;
$response->redirect_url = $this->getRedirectUrl($order);
return new FlutterwaveResponse($order, $response);
}
private function getRedirectUrl($order)
{
return route('checkout.complete.store', ['orderId' => $order->id, 'paymentMethod' => 'flutterwave']);
}
public function complete(Order $order)
{
return new FlutterwaveResponse($order, request()->all());
}
}

View File

@@ -0,0 +1,63 @@
<?php
namespace Modules\Payment\Gateways;
use Exception;
use Illuminate\Http\Request;
use Modules\Order\Entities\Order;
use Modules\Payment\GatewayInterface;
use Modules\Payment\Responses\InstamojoResponse;
class Instamojo implements GatewayInterface
{
public $label;
public $description;
public function __construct()
{
$this->label = setting('instamojo_label');
$this->description = setting('instamojo_description');
}
public function client()
{
$endpoint = setting('instamojo_test_mode') ? 'https://test.instamojo.com/api/1.1/' : null;
return new \Instamojo\Instamojo(setting('instamojo_api_key'), setting('instamojo_auth_token'), $endpoint);
}
public function purchase(Order $order, Request $request)
{
if (currency() !== 'INR') {
throw new Exception(trans('payment::messages.only_supports_inr'));
}
try {
$response = $this->client()
->paymentRequestCreate([
'purpose' => setting('store_name') . " payment for order #{$order->id}",
'amount' => $order->total->convertToCurrentCurrency()->round()->amount(),
'buyer_name' => $order->customer_full_name,
'email' => $order->customer_email,
'phone' => $order->customer_phone,
'send_sms' => true,
'redirect_url' => $this->getRedirectUrl($order),
'allow_repeated_payments' => false,
]);
} catch (Exception $e) {
throw new Exception(trim(trim($e->getMessage()), '"'));
}
return new InstamojoResponse($order, $response);
}
private function getRedirectUrl($order)
{
return route('checkout.complete.store', ['orderId' => $order->id, 'paymentMethod' => 'instamojo']);
}
public function complete(Order $order)
{
return new InstamojoResponse($order, request()->all());
}
}

View File

@@ -0,0 +1,168 @@
<?php
namespace Modules\Payment\Gateways;
use Exception;
use Illuminate\Http\Request;
use MercadoPago\SDK as MercadoPagoSDK;
use MercadoPago\Preference as MercadoPagoPreference;
use MercadoPago\Item as MercadoPagoItem;
use Modules\Order\Entities\Order;
use Modules\Payment\GatewayInterface;
use Modules\Payment\Responses\MercadoPagoResponse;
use Modules\Support\Money;
class MercadoPago implements GatewayInterface
{
public $label;
public $description;
public const CURRENCIES = ['UYU', 'PEN', 'COP', 'MXN', 'CLP', 'BRL', 'ARS'];
public function __construct()
{
$this->label = setting('mercadopago_label');
$this->description = setting('mercadopago_description');
$this->init();
}
public function init()
{
if (setting('mercadopago_enabled')) {
MercadoPagoSDK::setAccessToken(setting('mercadopago_access_token'));
}
}
public function purchase(Order $order, Request $request)
{
if (!in_array(currency(), $this->getSupportedCurrencies())) {
throw new Exception(trans('payment::messages.currency_not_supported'));
}
try {
$preference = new MercadoPagoPreference();
$preference->items = $this->prepareItems($order);
$preference->binary_mode = true;
$preference->back_urls = [
'success' => $this->getRedirectUrl($order),
'failure' => $this->getPaymentFailedUrl($order),
];
$preference->auto_return = 'approved';
$preference->external_reference = 'ref' . time();
$preference->save();
} catch (Exception $e) {
throw new Exception(trim(trim($e->getMessage()), '"'));
} finally {
if (!$preference->id) {
throw new Exception(trans('payment::messages.payment_gateway_error'));
}
}
return new MercadoPagoResponse($order, $preference);
}
private function getRedirectUrl($order)
{
return route('checkout.complete.store', ['orderId' => $order->id, 'paymentMethod' => 'mercadopago']);
}
private function getPaymentFailedUrl($order)
{
return route('checkout.payment_canceled.store', ['orderId' => $order->id, 'paymentMethod' => 'mercadopago']);
}
public function prepareItems($order): array
{
$items = $this->prepareProductItems($order->products);
$taxItem = $this->prepareTaxItem($order);
if (!empty($taxItem->unit_price)) {
$items[] = $this->prepareTaxItem($order);
}
$discountItem = $this->prepareDiscountItem($order);
if (!empty($discountItem->unit_price)) {
$items[] = $this->prepareDiscountItem($order);
}
return $items;
}
public function prepareProductItems($orderProducts): array
{
$productItems = [];
$orderProducts->each(function ($product) use (&$productItems) {
$productItem = $this->prepareProductItem($product);
if (!empty($productItem->unit_price)) {
$productItems[] = $productItem;
}
});
return $productItems;
}
public function prepareProductItem($orderProduct)
{
$item = new MercadoPagoItem();
$item->title = $orderProduct->product->name;
$item->quantity = $orderProduct->qty;
$item->currency_id = currency();
$item->unit_price = (float)$orderProduct->unit_price->convertToCurrentCurrency()->amount();
return $item;
}
public function prepareTaxItem($order)
{
$item = new MercadoPagoItem();
$item->title = trans('payment::order.tax');
$item->quantity = 1;
$item->currency_id = currency();
$item->unit_price = (float)$order
->totalTax()
->convertToCurrentCurrency()
->amount();
return $item;
}
public function prepareDiscountItem($order)
{
$item = new MercadoPagoItem();
$item->title = trans('payment::order.discount');
$item->quantity = 1;
$item->currency_id = currency();
$item->unit_price = (float)(-1 * $order->discount->convertToCurrentCurrency()->amount());
return $item;
}
public function getSupportedCurrencies()
{
return [setting('mercadopago_supported_currency'), 'USD'];
}
public function complete(Order $order)
{
return new MercadoPagoResponse($order, request());
}
}

View File

@@ -0,0 +1,113 @@
<?php
namespace Modules\Payment\Gateways;
use Exception;
use Illuminate\Http\Request;
use Modules\Order\Entities\Order;
use Modules\Payment\GatewayInterface;
use PayPalCheckoutSdk\Core\PayPalHttpClient;
use Modules\Payment\Responses\PayPalResponse;
use PayPalCheckoutSdk\Core\SandboxEnvironment;
use PayPalCheckoutSdk\Core\ProductionEnvironment;
use PayPalCheckoutSdk\Orders\OrdersCreateRequest;
use PayPalCheckoutSdk\Orders\OrdersCaptureRequest;
class PayPal implements GatewayInterface
{
public $label;
public $description;
public function __construct()
{
$this->label = setting('paypal_label');
$this->description = setting('paypal_description');
}
public function client()
{
return new PayPalHttpClient($this->environment());
}
private function environment()
{
if (setting('paypal_test_mode')) {
return new SandboxEnvironment(setting('paypal_client_id'), setting('paypal_secret'));
}
return new ProductionEnvironment(setting('paypal_client_id'), setting('paypal_secret'));
}
public function purchase(Order $order, Request $r)
{
try {
$request = new OrdersCreateRequest;
$request->prefer('return=representation');
$request->body = $this->buildRequestBody($order);
} catch (Exception $e) {
throw new Exception(json_decode($e->getMessage())->message ?? '');
}
return new PayPalResponse($order, $this->client()->execute($request));
}
public function complete(Order $order)
{
try {
$request = new OrdersCaptureRequest(request('resourceId'));
} catch (Exception $e) {
throw new Exception(json_decode($e->getMessage())->message ?? '');
}
return new PayPalResponse($order, $this->client()->execute($request));
}
private function buildRequestBody($order)
{
return [
'intent' => 'CAPTURE',
'payer' => [
'name' => [
'given_name' => $order->customer_first_name,
'surname' => $order->customer_last_name,
],
'email_address' => $order->customer_email,
'address' => [
'address_line_1' => $order->billing_address_1,
'address_line_2' => $order->billing_address_2,
'admin_area_2' => $order->billing_city,
'admin_area_1' => $order->billing_state,
'postal_code' => $order->billing_zip,
'country_code' => $order->billing_country,
],
],
'purchase_units' => [
[
'reference_id' => $order->id,
'amount' => [
'currency_code' => setting('default_currency'),
'value' => (string) $order->total->round()->amount(),
],
'shipping' => [
'name' => [
'full_name' => $order->customer_full_name,
],
'address' => [
'address_line_1' => $order->shipping_address_1,
'address_line_2' => $order->shipping_address_2,
'admin_area_2' => $order->shipping_city,
'admin_area_1' => $order->shipping_state,
'postal_code' => $order->shipping_zip,
'country_code' => $order->shipping_country,
],
],
],
],
'application_context' => [
'brand_name' => setting('store_name'),
'shipping_preferences' => 'SET_PROVIDED_ADDRESS',
'user_action' => 'PAY_NOW',
],
];
}
}

View File

@@ -0,0 +1,39 @@
<?php
namespace Modules\Payment\Gateways;
use stdClass;
use Exception;
use Illuminate\Http\Request;
use Modules\Order\Entities\Order;
use Modules\Payment\GatewayInterface;
use Modules\Payment\Responses\InstamojoResponse;
use Modules\Payment\Responses\PaystackResponse;
class Paystack implements GatewayInterface
{
public $label;
public $description;
const SUPPORTED_CURRENCIES = ['NGN', 'GHS', 'USD', 'ZAR'];
public function __construct()
{
$this->label = setting('paystack_label');
$this->description = setting('paystack_description');
}
public function purchase(Order $order, Request $request)
{
if (!in_array(currency(), self::SUPPORTED_CURRENCIES)) {
throw new Exception(trans('payment::messages.currency_not_supported'));
}
return new PaystackResponse($order, $request);
}
public function complete(Order $order)
{
return new PaystackResponse($order, request());
}
}

View File

@@ -0,0 +1,70 @@
<?php
namespace Modules\Payment\Gateways;
use Exception;
use Illuminate\Http\Request;
use Modules\Order\Entities\Order;
use Modules\Payment\GatewayInterface;
use Modules\Payment\Responses\PaytmResponse;
use Paytm\JsCheckout\Facades\Paytm as PaytmAlias;
class Paytm implements GatewayInterface
{
public $label;
public $description;
public function __construct()
{
$this->label = setting('paytm_label');
$this->description = setting('paytm_description');
config(
[
'services.paytm.env' => setting('paytm_test_mode') ? 'staging' : 'production',
'services.paytm.merchant_id' => setting('paytm_merchant_id'),
'services.paytm.merchant_key' => setting('paytm_merchant_key'),
'services.paytm.merchant_website' => setting('paytm_test_mode') ? 'WEBSTAGING' : 'DEFAULT',
'services.paytm.channel' => 'WEB',
'services.paytm.industry_type' => 'Retail',
]
);
}
public function purchase(Order $order, Request $request)
{
if (currency() !== 'INR') {
throw new Exception(trans('payment::messages.only_supports_inr'));
}
$paytm = PaytmAlias::with('receive');
$paytm->prepare(
[
'order' => $order->id,
'user' => "$order->customer_first_name $order->customer_last_name",
'mobile_number' => $order->customer_phone,
'email' => $order->customer_email,
'amount' => $order->total->convertToCurrentCurrency()->round()->amount(),
'callback_url' => $this->getRedirectUrl($order),
]
);
$response = $paytm->receive();
return new PaytmResponse($order, $response);
}
private function getRedirectUrl($order)
{
return route('checkout.complete.store', ['orderId' => $order->id, 'paymentMethod' => 'paytm']);
}
public function complete(Order $order)
{
return new PaytmResponse($order, request()->all());
}
}

View File

@@ -0,0 +1,55 @@
<?php
namespace Modules\Payment\Gateways;
use Razorpay\Api\Api;
use Illuminate\Http\Request;
use Modules\Order\Entities\Order;
use Modules\Payment\GatewayInterface;
use Razorpay\Api\Order as RazorpayOrder;
use Modules\Payment\Responses\RazorpayResponse;
class Razorpay implements GatewayInterface
{
public $label;
public $description;
public function __construct()
{
$this->label = setting('razorpay_label');
$this->description = setting('razorpay_description');
}
public function client()
{
return new Api(setting('razorpay_key_id'), setting('razorpay_key_secret'));
}
public function purchase(Order $order, Request $request)
{
$razorpayOrder = $this->client()->order->create([
'receipt' => $order->id,
'amount' => $order->total->convertToCurrentCurrency()->subunit(),
'currency' => currency(),
'payment_capture' => true,
]);
return new RazorpayResponse($razorpayOrder);
}
public function complete(Order $order)
{
$attributes = [
'razorpay_payment_id' => request('razorpay_payment_id'),
'razorpay_order_id' => request('razorpay_order_id'),
'razorpay_signature' => request('razorpay_signature'),
];
$this->client()->utility->verifyPaymentSignature($attributes);
$razorpayOrder = new RazorpayOrder;
$razorpayOrder->fill($attributes);
return new RazorpayResponse($razorpayOrder);
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace Modules\Payment\Gateways;
use Stripe\PaymentIntent;
use Illuminate\Http\Request;
use Modules\Order\Entities\Order;
use Modules\Payment\GatewayInterface;
use Modules\Payment\Responses\StripeResponse;
class Stripe implements GatewayInterface
{
public $label;
public $description;
public function __construct()
{
$this->label = setting('stripe_label');
$this->description = setting('stripe_description');
\Stripe\Stripe::setApiKey(setting('stripe_secret_key'));
}
public function purchase(Order $order, Request $request)
{
$intent = PaymentIntent::create([
'amount' => $order->total->subunit(),
'currency' => setting('default_currency'),
]);
return new StripeResponse($order, $intent);
}
public function complete(Order $order)
{
return new StripeResponse($order, new PaymentIntent(request('paymentIntent')));
}
}

View File

@@ -0,0 +1,8 @@
<?php
namespace Modules\Payment;
interface HasTransactionReference
{
public function getTransactionReference();
}

View File

@@ -0,0 +1,161 @@
<?php
namespace Modules\Payment\Providers;
use Modules\Payment\Gateways\AuthorizeNet;
use Modules\Payment\Gateways\COD;
use Modules\Payment\Gateways\Flutterwave;
use Modules\Payment\Gateways\Instamojo;
use Modules\Payment\Gateways\Paystack;
use Modules\Payment\Facades\Gateway;
use Modules\Payment\Gateways\PayPal;
use Modules\Payment\Gateways\Paytm;
use Modules\Payment\Gateways\Stripe;
use Modules\Payment\Gateways\Razorpay;
use Illuminate\Support\ServiceProvider;
use Modules\Payment\Gateways\BankTransfer;
use Modules\Payment\Gateways\CheckPayment;
use Modules\Payment\Gateways\MercadoPago;
class PaymentServiceProvider extends ServiceProvider
{
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
if (!config('app.installed')) {
return;
}
$this->registerPayPalExpress();
$this->registerStripe();
$this->registerPaytm();
$this->registerRazorpay();
$this->registerInstamojo();
$this->registerAuthorizenet();
$this->registerPaystack();
$this->registerMercadoPago();
$this->registerFlutterwave();
$this->registerCashOnDelivery();
$this->registerBankTransfer();
$this->registerCheckPayment();
}
private function enabled($paymentMethod)
{
if (app('inAdminPanel')) {
return true;
}
return setting("{$paymentMethod}_enabled");
}
private function registerPayPalExpress()
{
if ($this->enabled('paypal')) {
Gateway::register('paypal', new PayPal());
}
}
private function registerStripe()
{
if ($this->enabled('stripe')) {
Gateway::register('stripe', new Stripe());
}
}
private function registerPaytm()
{
if ($this->enabled('paytm')) {
Gateway::register('paytm', new Paytm());
}
}
private function registerRazorpay()
{
if ($this->enabled('razorpay')) {
Gateway::register('razorpay', new Razorpay());
}
}
private function registerInstamojo()
{
if ($this->enabled('instamojo')) {
Gateway::register('instamojo', new Instamojo());
}
}
private function registerPaystack()
{
if ($this->enabled('paystack')) {
Gateway::register('paystack', new Paystack());
}
}
private function registerAuthorizenet()
{
if ($this->enabled('authorizenet')) {
Gateway::register('authorizenet', new AuthorizeNet());
}
}
private function registerMercadoPago()
{
if ($this->enabled('mercadopago')) {
Gateway::register('mercadopago', new MercadoPago());
}
}
private function registerFlutterwave()
{
if ($this->enabled('flutterwave')) {
Gateway::register('flutterwave', new Flutterwave());
}
}
private function registerCashOnDelivery()
{
if ($this->enabled('cod')) {
Gateway::register('cod', new COD());
}
}
private function registerBankTransfer()
{
if ($this->enabled('bank_transfer')) {
Gateway::register('bank_transfer', new BankTransfer());
}
}
private function registerCheckPayment()
{
if ($this->enabled('check_payment')) {
Gateway::register('check_payment', new CheckPayment());
}
}
}

View File

@@ -0,0 +1,8 @@
<?php
return [
'only_supports_inr' => 'Only INR currency is supported.',
'currency_not_supported' => 'Currency not supported.',
'payment_gateway_error' => 'Payment gateway error!',
'payment_cancelled' => 'Payment cancelled!',
];

View File

@@ -0,0 +1,6 @@
<?php
return [
'tax' => 'Tax',
'discount' => 'Discount',
];

View File

@@ -0,0 +1,41 @@
<?php
namespace Modules\Payment\Responses;
use Modules\Order\Entities\Order;
use Modules\Payment\GatewayResponse;
use Modules\Payment\HasTransactionReference;
class AuthorizenetResponse extends GatewayResponse implements HasTransactionReference
{
private $order;
private $clientResponse;
public function __construct(Order $order,object $clientResponse)
{
$this->order = $order;
$this->clientResponse = $clientResponse;
}
public function getOrderId()
{
return $this->order->id;
}
public function getTransactionReference()
{
return $this->clientResponse->query('reference');
}
public function toArray()
{
return $this->order->toArray() + [
'token' => $this->clientResponse->token,
];
}
}

View File

@@ -0,0 +1,41 @@
<?php
namespace Modules\Payment\Responses;
use Modules\Order\Entities\Order;
use Modules\Payment\Gateways\MercadoPago;
use Modules\Payment\ShouldRedirect;
use Modules\Payment\GatewayResponse;
use Modules\Payment\HasTransactionReference;
class FlutterwaveResponse extends GatewayResponse implements ShouldRedirect, HasTransactionReference
{
private $order;
private $clientResponse;
public function __construct(Order $order, array|object $clientResponse)
{
$this->order = $order;
$this->clientResponse = $clientResponse;
}
public function getOrderId()
{
return $this->order->id;
}
public function getRedirectUrl()
{
return $this->clientResponse['redirect_url'];
}
public function getTransactionReference()
{
return $this->clientResponse['tx_ref'];
}
public function toArray()
{
return (array) $this->clientResponse;
}
}

View File

@@ -0,0 +1,35 @@
<?php
namespace Modules\Payment\Responses;
use Modules\Order\Entities\Order;
use Modules\Payment\ShouldRedirect;
use Modules\Payment\GatewayResponse;
use Modules\Payment\HasTransactionReference;
class InstamojoResponse extends GatewayResponse implements ShouldRedirect, HasTransactionReference
{
private $order;
private $clientResponse;
public function __construct(Order $order, array $clientResponse)
{
$this->order = $order;
$this->clientResponse = $clientResponse;
}
public function getOrderId()
{
return $this->order->id;
}
public function getRedirectUrl()
{
return $this->clientResponse['redirectUrl'];
}
public function getTransactionReference()
{
return $this->clientResponse['payment_id'];
}
}

View File

@@ -0,0 +1,44 @@
<?php
namespace Modules\Payment\Responses;
use Modules\Order\Entities\Order;
use Modules\Payment\ShouldRedirect;
use Modules\Payment\GatewayResponse;
use Modules\Payment\HasTransactionReference;
class MercadoPagoResponse extends GatewayResponse implements ShouldRedirect, HasTransactionReference
{
private $order;
private $clientResponse;
public function __construct(Order $order, object $clientResponse)
{
$this->order = $order;
$this->clientResponse = $clientResponse;
}
public function getOrderId()
{
return $this->order->id;
}
public function getRedirectUrl()
{
return $this->clientResponse->back_urls->success;
}
public function getTransactionReference()
{
return $this->clientResponse->external_reference;
}
public function toArray()
{
return [
'publicKey' => setting('mercadopago_public_key'),
'currentLocale' => locale(),
'preferenceId' => $this->clientResponse->id,
];
}
}

View File

@@ -0,0 +1,21 @@
<?php
namespace Modules\Payment\Responses;
use Modules\Order\Entities\Order;
use Modules\Payment\GatewayResponse;
class NullResponse extends GatewayResponse
{
private $order;
public function __construct(Order $order)
{
$this->order = $order;
}
public function getOrderId()
{
return $this->order->id;
}
}

View File

@@ -0,0 +1,35 @@
<?php
namespace Modules\Payment\Responses;
use PayPalHttp\HttpResponse;
use Modules\Order\Entities\Order;
use Modules\Payment\GatewayResponse;
use Modules\Payment\HasTransactionReference;
class PayPalResponse extends GatewayResponse implements HasTransactionReference
{
private $order;
private $httpResponse;
public function __construct(Order $order, HttpResponse $httpResponse)
{
$this->order = $order;
$this->httpResponse = $httpResponse;
}
public function getOrderId()
{
return $this->order->id;
}
public function getTransactionReference()
{
return $this->httpResponse->result->purchase_units[0]->payments->captures[0]->id;
}
public function toArray()
{
return parent::toArray() + ['resourceId' => $this->httpResponse->result->id];
}
}

View File

@@ -0,0 +1,40 @@
<?php
namespace Modules\Payment\Responses;
use Modules\Order\Entities\Order;
use Modules\Payment\ShouldRedirect;
use Modules\Payment\GatewayResponse;
use Modules\Payment\HasTransactionReference;
class PaystackResponse extends GatewayResponse implements HasTransactionReference
{
private $order;
public function __construct(Order $order)
{
$this->order = $order;
}
public function getOrderId()
{
return $this->order->id;
}
public function getTransactionReference()
{
return request('reference');
}
public function toArray()
{
return [
'key' => setting('paystack_public_key'),
'email' => $this->order->customer_email,
'amount' => $this->order->total->convertToCurrentCurrency()->subunit(),
'ref' => 'ref' . time(),
'currency' => currency(),
'order_id' => $this->order->id,
];
}
}

View File

@@ -0,0 +1,41 @@
<?php
namespace Modules\Payment\Responses;
use Modules\Order\Entities\Order;
use Modules\Payment\GatewayResponse;
use Modules\Payment\HasTransactionReference;
class PaytmResponse extends GatewayResponse implements HasTransactionReference
{
private $order;
private $clientResponse;
public function __construct(Order $order, $clientResponse)
{
$this->order = $order;
$this->clientResponse = $clientResponse;
}
public function getOrderId()
{
return $this->order->id;
}
public function getTransactionReference()
{
return 'ref' . time();
}
public function toArray()
{
return parent::toArray() + [
'amount' => $this->order->total->convertToCurrentCurrency()->round()->amount(),
'txnToken' => $this->clientResponse['txnToken'],
];
}
}

View File

@@ -0,0 +1,32 @@
<?php
namespace Modules\Payment\Responses;
use Modules\Payment\GatewayResponse;
use Razorpay\Api\Order as RazorpayOrder;
use Modules\Payment\HasTransactionReference;
class RazorpayResponse extends GatewayResponse implements HasTransactionReference
{
private $razorpayOrder;
public function __construct(RazorpayOrder $razorpayOrder)
{
$this->razorpayOrder = $razorpayOrder;
}
public function getOrderId()
{
return $this->razorpayOrder->receipt;
}
public function getTransactionReference()
{
return $this->razorpayOrder->razorpay_payment_id;
}
public function toArray()
{
return $this->razorpayOrder->toArray();
}
}

View File

@@ -0,0 +1,35 @@
<?php
namespace Modules\Payment\Responses;
use Stripe\PaymentIntent;
use Modules\Order\Entities\Order;
use Modules\Payment\GatewayResponse;
use Modules\Payment\HasTransactionReference;
class StripeResponse extends GatewayResponse implements HasTransactionReference
{
private $order;
private $intent;
public function __construct(Order $order, PaymentIntent $intent)
{
$this->order = $order;
$this->intent = $intent;
}
public function getOrderId()
{
return $this->order->id;
}
public function getTransactionReference()
{
return $this->intent->id;
}
public function toArray()
{
return parent::toArray() + ['clientSecret' => $this->intent->client_secret];
}
}

View File

@@ -0,0 +1,8 @@
<?php
namespace Modules\Payment;
interface ShouldRedirect
{
public function getRedirectUrl();
}

View File

@@ -0,0 +1,35 @@
{
"name": "fleetcart/payment",
"description": "The FleetCart Payment Module.",
"authors": [
{
"name": "Envay Soft",
"email": "envaysoft@gmail.com"
}
],
"require": {
"php": "^8.0.2",
"instamojo/instamojo-php": "^0.4",
"paypal/paypal-checkout-sdk": "^1.0",
"paytm/js-checkout" : "dev-master",
"razorpay/razorpay": "^2.5",
"stripe/stripe-php": "^7.28",
"authorizenet/authorizenet": "^2.0",
"yabacon/paystack-php": "^2.2",
"mercadopago/dx-php": "^2.5"
},
"autoload": {
"psr-4": {
"Modules\\Payment\\": ""
}
},
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"config": {
"sort-packages": true
},
"minimum-stability": "dev"
}

View File

@@ -0,0 +1,9 @@
{
"name": "Payment",
"alias": "payment",
"description": "The FleetCart Payment Module.",
"priority": 100,
"providers": [
"Modules\\Payment\\Providers\\PaymentServiceProvider"
]
}