1. Go to this page and download the library: Download nexuspay/payment-made-easy library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
nexuspay / payment-made-easy example snippets
use Alphabalex\PaymentMadeEasy\GatewayCapabilities;
use Alphabalex\PaymentMadeEasy\Contracts\SubscriptionDriverInterface;
if (GatewayCapabilities::driverImplements('paystack', SubscriptionDriverInterface::class)) {
// safe to call subscription APIs
}
$slugs = GatewayCapabilities::gatewaysImplementing(SubscriptionDriverInterface::class);
// In callback controller after user returns from checkout
$result = Payment::driver('paystack')->pay([
'email' => '[email protected]',
'amount' => 5000,
'_auto_verify' => true,
], function ($response) {
// Payment confirmed — fulfill the order
});
use Alphabalex\PaymentMadeEasy\Events\PaymentSuccessful;
use Alphabalex\PaymentMadeEasy\Events\PaymentFailed;
use Alphabalex\PaymentMadeEasy\Events\PaymentPending;
use Alphabalex\PaymentMadeEasy\Events\RefundProcessed;
use Alphabalex\PaymentMadeEasy\Events\SubscriptionCreated;
use Alphabalex\PaymentMadeEasy\Events\SubscriptionCancelled;
use Alphabalex\PaymentMadeEasy\Events\SubscriptionRenewed;
use Alphabalex\PaymentMadeEasy\Events\TransferSuccessful;
use Alphabalex\PaymentMadeEasy\Events\TransferFailed;
use Alphabalex\PaymentMadeEasy\Events\DisputeCreated;
use Alphabalex\PaymentMadeEasy\Events\ChargebackCreated;
protected $listen = [
PaymentSuccessful::class => [App\Listeners\HandleSuccessfulPayment::class],
PaymentFailed::class => [App\Listeners\HandleFailedPayment::class],
PaymentPending::class => [App\Listeners\HandlePendingPayment::class],
RefundProcessed::class => [App\Listeners\HandleRefundProcessed::class],
SubscriptionCreated::class => [App\Listeners\HandleSubscriptionCreated::class],
SubscriptionCancelled::class => [App\Listeners\HandleSubscriptionCancelled::class],
SubscriptionRenewed::class => [App\Listeners\HandleSubscriptionRenewed::class],
TransferSuccessful::class => [App\Listeners\HandleTransferSuccessful::class],
TransferFailed::class => [App\Listeners\HandleTransferFailed::class],
DisputeCreated::class => [App\Listeners\HandleDisputeCreated::class],
ChargebackCreated::class => [App\Listeners\HandleChargebackCreated::class],
];
// app/Listeners/HandleSuccessfulPayment.php
class HandleSuccessfulPayment
{
public function handle(PaymentSuccessful $event): void
{
$gateway = $event->webhookEvent->getGateway(); // e.g. 'paystack'
$eventType = $event->webhookEvent->getEventType(); // e.g. 'charge.success'
$data = $event->paymentData;
// Normalized keys commonly
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Alphabalex\PaymentMadeEasy\WebhookManager;
use Alphabalex\PaymentMadeEasy\Exceptions\WebhookException;
class CustomWebhookController extends Controller
{
public function handle(Request $request, string $gateway, WebhookManager $webhookManager)
{
try {
$webhookManager->handle($gateway, $request);
return response()->json(['status' => 'success']);
} catch (WebhookException $e) {
return response()->json(['error' => $e->getMessage()], 400);
}
}
}
use Alphabalex\PaymentMadeEasy\Contracts\SubscriptionDriverInterface;
use Alphabalex\PaymentMadeEasy\Contracts\DisbursementDriverInterface;
use Alphabalex\PaymentMadeEasy\Contracts\VirtualAccountDriverInterface;
use Alphabalex\PaymentMadeEasy\Contracts\PaymentLinkDriverInterface;
use Alphabalex\PaymentMadeEasy\Contracts\CustomerDriverInterface;
use Alphabalex\PaymentMadeEasy\Contracts\DisputeDriverInterface;
use Alphabalex\PaymentMadeEasy\Contracts\BalanceDriverInterface;
use Alphabalex\PaymentMadeEasy\Contracts\SettlementDriverInterface;
use Alphabalex\PaymentMadeEasy\Contracts\SubaccountDriverInterface;
use Alphabalex\PaymentMadeEasy\Contracts\SplitDriverInterface;
use Alphabalex\PaymentMadeEasy\Contracts\ChargeAuthorizationDriverInterface;
$driver = Payment::driver('paystack');
if ($driver instanceof SubscriptionDriverInterface) {
$driver->createPlan([...]);
}
if ($driver instanceof DisbursementDriverInterface) {
$driver->transfer([...]);
}
if ($driver instanceof VirtualAccountDriverInterface) {
$driver->createVirtualAccount([...]);
}
if ($driver instanceof PaymentLinkDriverInterface) {
$driver->createPaymentLink([...]);
}
if ($driver instanceof CustomerDriverInterface) {
$driver->createCustomer([...]);
}
if ($driver instanceof DisputeDriverInterface) {
$driver->listDisputes();
}
if ($driver instanceof BalanceDriverInterface) {
$driver->getBalance('NGN');
}
if ($driver instanceof SettlementDriverInterface) {
$driver->listSettlements();
}
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Alphabalex\PaymentMadeEasy\PaymentManager;
use Alphabalex\PaymentMadeEasy\Contracts\SubscriptionDriverInterface;
class PaymentController extends Controller
{
public function __construct(private PaymentManager $paymentManager) {}
public function charge(Request $request)
{
$driver = $this->paymentManager->driver($request->gateway ?? 'paystack');
return $driver->initializePayment([
'email' => $request->email,
'amount' => $request->amount,
'reference' => $request->reference,
]);
}
public function createPlan(Request $request)
{
$driver = $this->paymentManager->driver($request->gateway ?? 'paystack');
if (!$driver instanceof SubscriptionDriverInterface) {
abort(422, 'Selected gateway does not support subscriptions.');
}
return $driver->createPlan($request->validated());
}
}
use Alphabalex\PaymentMadeEasy\Contracts\CustomerDriverInterface;
$driver = Payment::driver('paystack');
// Create a customer
$customer = $driver->createCustomer([
'email' => '[email protected]',
'first_name' => 'John',
'last_name' => 'Doe',
'phone' => '+2348012345678',
'metadata' => ['plan' => 'premium'],
]);
$customerCode = $customer['data']['customer_code'];
// Get a customer by email or code
$fetched = $driver->getCustomer('CUS_xxxxx');
// List all customers
$customers = $driver->listCustomers(['per_page' => 50]);
// Update a customer
$driver->updateCustomer($customerCode, ['first_name' => 'Jane']);
// Validate customer identity (Paystack)
$driver->validateCustomer($customerCode, [
'country' => 'NG',
'type' => 'bank_account',
'account_number' => '0123456789',
'bvn' => '20012345677',
'bank_code' => '058',
'first_name' => 'John',
'last_name' => 'Doe',
]);
// Whitelist or blacklist a customer (Paystack)
$driver->setCustomerRiskAction($customerCode, 'allow'); // or 'deny' or 'default'
use Alphabalex\PaymentMadeEasy\Contracts\ChargeAuthorizationDriverInterface;
$driver = Payment::driver('paystack');
// Charge a reusable authorization
$response = $driver->chargeAuthorization([
'email' => '[email protected]',
'amount' => 5000.00,
'authorization_code' => 'AUTH_xxxxx',
'reference' => 'RECURRING_001',
]);
// Get authorization details
$auth = $driver->getAuthorization('AUTH_xxxxx');
// List all authorizations
$auths = $driver->listAuthorizations(['per_page' => 50]);
// Deactivate an authorization
$driver->deactivateAuthorization('AUTH_xxxxx');
use Alphabalex\PaymentMadeEasy\Contracts\DisputeDriverInterface;
$driver = Payment::driver('paystack');
// List disputes
$disputes = $driver->listDisputes(['status' => 'pending']);
// Get a single dispute
$dispute = $driver->getDispute('2867');
// Update a dispute (e.g. set refund amount)
$driver->updateDispute('2867', ['refund_amount' => 1002]);
// Add evidence to a dispute (Paystack)
$driver->addDisputeEvidence('2867', [
'customer_email' => '[email protected]',
'customer_name' => 'John Doe',
'customer_phone' => '+2348012345678',
'service_details' => 'Service was delivered on 2025-01-15',
]);
// Get upload URL for evidence attachments (Paystack)
$upload = $driver->getDisputeUploadUrl('2867');
// Get disputes for a specific transaction (Paystack)
$txDisputes = $driver->getTransactionDisputes('12345');
// Respond to a dispute message
$driver->respondToDisputeMessage('2867', ['message' => 'We delivered the service']);
$driver = Payment::driver('flutterwave');
// List chargebacks
$chargebacks = $driver->listChargebacks();
// Accept or reject a chargeback
$driver->acceptChargeback('1');
$driver->rejectChargeback('1');
use Alphabalex\PaymentMadeEasy\Contracts\BalanceDriverInterface;
$driver = Payment::driver('paystack');
// Get available balance (all currencies)
$balance = $driver->getBalance();
// Get balance for a specific currency
$ngnBalance = $driver->getBalance('NGN');
// Get ledger balance (
use Alphabalex\PaymentMadeEasy\Contracts\SettlementDriverInterface;
$driver = Payment::driver('paystack');
// List settlements
$settlements = $driver->listSettlements(['status' => 'success']);
// Get transactions that make up a settlement
$txns = $driver->getSettlementTransactions('3090024', ['per_page' => 50]);
use Alphabalex\PaymentMadeEasy\Services\BalanceAggregator;
$aggregator = app(BalanceAggregator::class);
// Get balances from all gateways that support it
$result = $aggregator->aggregate();
// Filter by currency
$result = $aggregator->aggregate(currency: 'NGN');
// Query specific gateways only
$result = $aggregator->aggregate(gateways: ['paystack', 'flutterwave']);
$order = Payment::driver('paypal')->initializePayment([
'amount' => 50.00,
'currency' => 'USD',
'email' => '[email protected]',
]);
// Redirect to $order['links'][n]['href'] where rel == 'approve'
// After approval, capture using the order ID:
Payment::driver('paypal')->verifyPayment($order['id']);
$response = Payment::driver('mpesa')->initializePayment([
'phone' => '254712345678', // international format, no +
'amount' => 500, // KES whole number
]);
$checkoutRequestId = $response['data']['checkout_request_id'];
// Poll or wait for callback, then verify:
Payment::driver('mpesa')->verifyPayment($checkoutRequestId);
// In your test
Payment::shouldReceive('driver->initializePayment')
->once()
->andReturn(['status' => true, 'data' => ['authorization_url' => 'https://...']]);
use Alphabalex\PaymentMadeEasy\Services\PaymentRecorder;
$recorder = app(PaymentRecorder::class);
// After initializing a payment
$transaction = $recorder->recordTransaction('paystack', $requestData, $gatewayResponse);
// After verifying / receiving a webhook
$recorder->updateTransactionStatus('ORDER_001', 'successful', 'PS_GATEWAY_REF');
// Record a transfer
$transfer = $recorder->recordTransfer('paystack', $transferData, $transferResponse);
// Log a webhook event for auditing
$recorder->logWebhookEvent('paystack', $webhookEvent);
// Refunds (e.g. after a refund webhook) — appends `payment_refunds` rows and updates parent status
// (partially_refunded vs refunded from summed amounts). Optional 6th arg: provider refund id for dedupe.
$recorder->handleRefundWebhook('paystack', 'ORDER_001', 50.0, 'NGN', $rawPayload, 're_abc123');
// Attach a transaction to a user
$transaction->payable()->associate($user)->save();
// Scope helpers
PaymentTransaction::successful()->gateway('paystack')->get();
PaymentSubscription::active()->forEmail('[email protected]')->get();
PaymentTransfer::successful()->gateway('mtnmomo')->get();