In the following guide, I will explain to you how you can integrate PayPal payment gateway on your Laravel site using PayPal Rest API.
Let’s Prepare some stuff :
- Go to PayPal Developer account and login with your credentials.
- Search for ‘My Apps & Credentials’ menu and click on ‘Create Program’ button.
- Find the client id and secret of from sandbox mode and copy it for later use.
It’s Time to Code :
For accomplishing this task we need a table.
Now, create a migration using the following command:
php artisan make:migration create_pay_table
Open the newly created migration file and add the below code in the (up) method.
<?php
public function up()
{
Schema::create(‘pay’, function (Blueprint $table) {
$table->bigIncrements(‘id’);
$table->string(‘payment_id’);
$table->string(‘payer_id’);
$table->string(‘payer_email’);
$table->float(‘amount’, 10, 2);
$table->string(‘currency’);
$table->string(‘payment_status’);
$table->timestamps();
});
}
Just migration the above data using the below command.
php artisan migrate
This command will create a ‘pay’ table in the database.
Now, create a model for ‘pay’ table.
php artisan make:model Payment
Add the below Code in .env file and change credentials accordingly
PAYPAL_CLIENT_ID=PASTE_HERE_CLIENT_ID
PAYPAL_CLIENT_SECRET=PASTE_HERE_CLIENT_SECRET
PAYPAL_CURRENCY=USD
php artisan config:cache
Let’s define our routes which we will require in the next steps.
routes/web.php
<?php
Route::get(‘payment’, ‘PaymentControllers@index’);
Route::post(‘paynow’, ‘PaymentControllers@charge’);
Route::get(‘paymentsuccess’, ‘PaymentController@payment_success’);
Route::get(‘paymenterror’, ‘PaymentController@payment_error’);
Package for PayPal Payment Gateway Integration
Omnipay is the most popular payment processing library for Laravel. That gives you an effortless code for integrating various types of payment gateway.
Installing Omnipay library:
composer require league/omnipay omnipay/paypal
It’s time to create a controller PaymentControllers and define the all methods mentioned in our route file.
php artisan make:controller PaymentControllers
Paste the Below Code in PaymentControllers file
PaymentControllers.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Omnipay\Omnipay;
use App\Payment;
class PaymentControllers extends Controller
{
public $gateway;
public function __construct()
{
$this->gateway = Omnipay::create(‘PayPal_Rest’);
$this->gateway->setClientId(env(‘PAYPAL_CLIENT_ID’));
$this->gateway->setSecret(env(‘PAYPAL_CLIENT_SECRET’));
$this->gateway->setTestMode(true); //set it to ‘false’ when go live
}
public function index()
{
return view(‘payment’);
}
public function charge(Request $request)
{
if($request->input(‘submit’))
{
try {
$response = $this->gateway->purchase(array(
‘amount’ => $request->input(‘amount’),
‘currency’ => env(‘PAYPAL_CURRENCY’),
‘returnUrl’ => url(‘paymentsuccess’),
‘cancelUrl’ => url(‘paymenterror’),
))->send();
if ($response->isRedirect()) {
$response->redirect(); // this will automatically forward the customer
} else {
// not successful
return $response->getMessage();
}
} catch(Exception $e) {
return $e->getMessage();
}
}
}
public function payment_success(Request $request)
{
// Once the transaction has been approved, we need to complete it.
if ($request->input(‘paymentId’) && $request->input(‘PayerID’))
{
$transaction = $this->gateway->completePurchase(array(
‘payer_id’ => $request->input(‘PayerID’),
‘transactionReference’ => $request->input(‘paymentId’),
));
$response = $transaction->send();
if ($response->isSuccessful())
{
// The customer has successfully paid.
$arr_body = $response->getData();
// Insert transaction data into the database
$isPaymentExist = Payment::where(‘payment_id’, $arr_body[‘id’])->first();
if(!$isPaymentExist)
{
$payment = new Payment;
$payment->payment_id = $arr_body[‘id’];
$payment->payer_id = $arr_body[‘payer’][‘payer_info’][‘payer_id’];
$payment->payer_email = $arr_body[‘payer’][‘payer_info’][’email’];
$payment->amount = $arr_body[‘transactions’][0][‘amount’][‘total’];
$payment->currency = env(‘PAYPAL_CURRENCY’);
$payment->payment_status = $arr_body[‘state’];
$payment->save();
}
return “Payment done. transaction id is: “. $arr_body[‘id’];
} else {
return $response->getMessage();
}
} else {
return ‘Transaction is declined’;
}
}
public function payment_error()
{
return ‘User has cancelled the payment.’;
}
}
In the above code, we take the important credentials and after that, we send a user to PayPal for payment. If the payment gets successful, then we store all the details in the ‘pay’ table.
Some small tweaks
- Create a new file named as (payment.blade.php)
- Paste the code below in it.
<form action=”{{ url(‘paynow’) }}” method=”post” class=”form-group”>
{{ csrf_field() }}
<input type=”text” name=”amount” />
<input type=”submit” value=”Pay Now”>
</form>
Final Words
Finally, we had done all the changes it’s time to submit the form. When the user submits this form, then the function called in the PaymentController for the payment process. I hope you get enough information regarding PayPal payment gateway integration in Laravel. If you get stuck between methods I’m happy to help you to fix that problem.