Paystack is an African payment gateway used by enterprises. It is one of the most popular payment gateways in Africa, especially in Nigeria. It assists most E-commerce platforms to accept payment from their customers.
To seamlessly integrate Paystack into Laravel, we must ensure our environment has the following in place:
Let’s now integrate Paystack step by step.
To get the latest version of the Paystack package installed into your application, we need to require it using a composer command on the command line. It will be better if we use Visual Studio Code for this integration.
composer require unicodeveloper/laravel-paystack
At the composer.json file, you can add:
unicodeveloper/laravel-paystack": "1.0.*
Run composer install
or composer update
to download it and have the autoloader updated.
Once installed, open up config/app.php
and add the following to the providers
key to register the service provider
.
'providers' => [
...
Unicodeveloper\Paystack\PaystackServiceProvider::class,
...
]
Register the Facade
like so:
'aliases' => [
...
'Paystack' => Unicodeveloper\Paystack\Facades\Paystack::class,
...
]
It’s now time to make some configuration. Run the below command to publish the configuration:
php artisan vendor:publish --provider="Unicodeveloper\Paystack\PaystackServiceProvider"
At the config
directory, you will see a paystack.php
configuration:
<?php
return [
'publicKey' => 'pk_test_******************************',
'secretKey' => 'sk_test_******************************',
'paymentUrl' => 'https://api.paystack.co',
'merchantEmail' => 'yourmail.com',
];
The above is done in situations where you don’t want to make use of the .env
, so the configuration
values were entered directly.
Let’s understand the payment flow.
The end-user is redirected to the payment provider (the process is handled elegantly), as we will see in Step 9.
The end-user pays Paystack.
The end-user gets redirected back to your site.
Head over to your Paystack dashboard to make sure you have
/payment/callback
registered in Paystack Dashboard.
Let’s configure the route
. Enter the code in your web.php
file in the route
directory, as follows.
// Laravel 5.1.17
Route::post('/pay', 'PaymentController@redirectToGateway')->name('pay');
// Laravel 8
Route::post('/pay', [App\Http\Controllers\PaymentController::class, 'redirectToGateway'])->name('pay');
Route::get('/payment/callback', [App\Http\Controllers\PaymentController::class, 'handleGatewayCallback'])->name('payment');
We are done with route
. Let’s now create our PaymentController
to handle the processes, with a typical example where I process student payment.
<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;use App\Http\Requests;use App\Http\Controllers\Controller;use Illuminate\Support\Facades\Redirect;use Paystack;// Paystack packageuse Auth;use App\Student; // Student Modeluse App\Payment; // Payment Modeluse App\User; // User modelclass PaymentController extends Controller{/*** Redirect the User to Paystack Payment Page* @return Url*/public function redirectToGateway(Request $request){try{return Paystack::getAuthorizationUrl()->redirectNow();}catch(\Exception $e) {return Redirect::back()->withMessage(['msg'=>'The paystack token has expired. Please refresh the page and try again.', 'type'=>'error']);}}/*** Obtain Paystack payment information* @return void*/public function handleGatewayCallback(){//Getting authenticated user$id = Auth::id();// Getting the specific student and his details$student = Student::where('user_id',$id)->first();$class_id = $student->class_id;$section_id = $student->section_id;$level_id = $student->level_id;$student_id = $student->id;$paymentDetails = Paystack::getPaymentData(); //this comes with all the data needed to process the transaction// Getting the value via an array method$inv_id = $paymentDetails['data']['metadata']['invoiceId'];// Getting InvoiceId I passed from the form$status = $paymentDetails['data']['status']; // Getting the status of the transaction$amount = $paymentDetails['data']['amount']; //Getting the Amount$number = $randnum = rand(1111111111,9999999999);// this one is specific to application$number = 'year'.$number;// dd($status);if($status == "success"){ //Checking to Ensure the transaction was succesfulPayment::create(['student_id' => $student_id,'invoice_id'=>$inv_id,'amount'=>$amount,'status'=>1]); // Storing the payment in the databaseStudent::where('user_id', $id)->update(['register_no' => $number,'acceptance_status' => 1]);return view('student.studentFees');}// Now you have the payment details,// you can store the authorization_code in your DB to allow for recurrent subscriptions// you can then redirect or do whatever you want}}
We are done with controller
. Let’s now head over to the view
, where we will send the form values.
There are other ways to go about it, but this is just one of those ways.
<form method="POST" action="{{ route('pay') }}" accept-charset="UTF-8" class="form-horizontal d-none" role="form"><input type="hidden" name="metadata" value="{{ json_encode($array = ['invoiceId' => $fee->id]) }}" ><input type="hidden" name="email" value="{{Auth::user()->email}}"> {{-- required --}}<input type="hidden" name="orderID" value="345"><input type="hidden" name="amount" value="{{$fee->total}}"> {{-- required in kobo --}}<input type="hidden" name="currency" value="NGN"><input type="hidden" name="reference" value="{{ Paystack::genTranxRef() }}">{{ csrf_field() }}<button class="btn btn-success btn-lg btn-block" type="submit" value="Pay Now!"><i class="fa fa-plus-circle fa-lg"></i> Pay Now!</button></form>
Integrating the Paystack payment gateway is a game-changer for your application and an entry into African E-commerce. Follow the above judiciously, and you will be able to integrate Paystack easily.