Debug School

rakesh kumar
rakesh kumar

Posted on

How to Implement Omnipay PayPal_Rest gateway using laravel application

Implementing the Omnipay PayPal_Rest gateway in a Laravel application involves several steps. Below, I'll provide a step-by-step example of how to set up and use the Omnipay library to handle PayPal payments in a Laravel application.

Step 1: Set Up a New Laravel Project

If you don't already have a Laravel project, create one using Composer:

composer create-project --prefer-dist laravel/laravel paypal-example
cd paypal-example
Enter fullscreen mode Exit fullscreen mode

Step 2: Install the Omnipay Library

Install the Omnipay library via Composer:

composer require league/omnipay omnipay/paypal
Enter fullscreen mode Exit fullscreen mode

Step 3: Configure PayPal Credentials

In your Laravel project, open the .env file and configure your PayPal credentials. Add the following lines:

PAYPAL_CLIENT_ID=your_paypal_client_id
PAYPAL_SECRET_ID=your_paypal_secret_id
PAYPAL_CURRENCY=USD
Enter fullscreen mode Exit fullscreen mode

Step 4: Create a Controller

Create a controller that will handle the PayPal payment logic:

php artisan make:controller PayPalPaymentController
Enter fullscreen mode Exit fullscreen mode

Step 5: Add Routes

In your routes/web.php file, define the routes for initiating payments and handling callbacks. For example:

use App\Http\Controllers\PayPalPaymentController;

Route::get('/pay', [PayPalPaymentController::class, 'pay'])->name('paypal.pay');
Route::get('/success', [PayPalPaymentController::class, 'success'])->name('paypal.success');
Route::get('/error', [PayPalPaymentController::class, 'error'])->name('paypal.error');
Enter fullscreen mode Exit fullscreen mode

Step 6: Create PayPalPaymentController

Edit the app/Http/Controllers/PayPalPaymentController.php file to implement the PayPal payment logic. Here's a simplified example:

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Omnipay\Omnipay;
use Illuminate\Support\Facades\Log;

class PayPalPaymentController extends Controller
{
    protected $gateway;

    public function __construct()
    {
        $this->gateway = Omnipay::create('PayPal_Rest');
        $this->gateway->setClientId(config('app.paypal_client_id'));
        $this->gateway->setSecret(config('app.paypal_secret_id'));
        $this->gateway->setTestMode(true);
    }

    public function pay(Request $request)
    {
        try {
            $response = $this->gateway->purchase([
                'amount' => $request->amount,
                'currency' => config('app.paypal_currency'),
                'returnUrl' => route('paypal.success'),
                'cancelUrl' => route('paypal.error'),
            ])->send();

            if ($response->isRedirect()) {
                $response->redirect();
            } else {
                return $response->getMessage();
            }
        } catch (\Throwable $th) {
            return $th->getMessage();
        }
    }

    public function success(Request $request)
    {
        // Handle PayPal success callback here
        Log::info('PayPal success callback: ' . json_encode($request->all()));
        return 'Payment successful!';
    }

    public function error(Request $request)
    {
        // Handle PayPal error callback here
        Log::error('PayPal error callback: ' . json_encode($request->all()));
        return 'Payment failed!';
    }
}
Enter fullscreen mode Exit fullscreen mode

Explanation

  public function __construct()
    {
        $this->gateway = Omnipay::create('PayPal_Rest');
        $this->gateway->setClientId(config('app.paypal_client_id'));
        $this->gateway->setSecret(config('app.paypal_secret_id'));
        $this->gateway->setTestMode(true);
    }
Enter fullscreen mode Exit fullscreen mode

Constructor Method: The code is placed inside a constructor method. In object-oriented programming, a constructor is a special method that is automatically called when an instance of a class is created. In this case, the constructor is likely part of a Laravel controller or service.

Initialize Payment Gateway:

$this->gateway = Omnipay::create('PayPal_Rest');: This line creates an instance of a payment gateway using the Omnipay library. Omnipay is a PHP library that provides a consistent interface for various payment gateways. In this case, it's configured to use the 'PayPal_Rest' driver.
Set PayPal Configuration:

The following lines configure the PayPal gateway with necessary settings:
$this->gateway->setClientId(config('app.paypal_client_id')): Sets the PayPal Client ID. The config() function is used to retrieve the configuration value from the Laravel application's configuration file (typically located in config/app.php). The value is fetched from the paypal_client_id configuration key.

$this->gateway->setSecret(config('app.paypal_secret_id')): Sets the PayPal Secret ID. Similar to the Client ID, the Secret ID is fetched from the application's configuration using the config() function.

$this->gateway->setTestMode(true): This line sets the gateway to use the PayPal sandbox environment for testing. When true, it indicates that transactions will be made in a testing environment, allowing you to test PayPal integration without making actual payments. In a production environment, you would typically set this to false.

public function pay(Request $request)
{
    try {
        // Step 1: Create a purchase request
        $response = $this->gateway->purchase([
            'amount' => $request->amount,
            'currency' => config('app.paypal_currency'),
            'returnUrl' => route('paypal.success'),
            'cancelUrl' => route('paypal.error'),
        ])->send();

        // Step 2: Check if the response is a redirect
        if ($response->isRedirect()) {
            // Step 3: Redirect the user to PayPal for payment
            $response->redirect();
        } else {
            // Step 4: Handle errors or display an error message
            return $response->getMessage();
        }
    } catch (\Throwable $th) {
        // Step 5: Handle exceptions and return an error message
        return $th->getMessage();
    }
}
Enter fullscreen mode Exit fullscreen mode

Step 1: Create a purchase request

This step creates a purchase request using the PayPal gateway ($this->gateway). The request is configured with various parameters:
'amount' => $request->amount: The payment amount, typically received from the user's input.
'currency' => config('app.paypal_currency'): The currency for the payment. The currency is retrieved from your application's configuration (usually set in the .env file).
'returnUrl' => route('paypal.success'): The URL to which the user should be redirected after a successful payment. This is typically a route named 'paypal.success.'
'cancelUrl' => route('paypal.error'): The URL to which the user should be redirected if the payment is canceled or encounters an error. This is typically a route named 'paypal.error.'
Step 2: Check if the response is a redirect

After creating the purchase request, the code checks if the response is a redirect. This condition is used to determine if the user should be redirected to PayPal for payment. If the condition is true, it means that the response is a redirection request to PayPal.
Step 3: Redirect the user to PayPal for payment

If the response is a redirect, the code executes $response->redirect();. This function triggers the user's browser to be redirected to the PayPal payment page, where they can complete the transaction.
Step 4: Handle errors or display an error message

If the response is not a redirect (i.e., an error or issue occurred), the code returns the error message by calling $response->getMessage(). This message could be displayed to the user to inform them about the issue.
Step 5: Handle exceptions and return an error message

If an exception is thrown during the process (e.g., due to incorrect configuration or an unexpected issue), the code catches the exception and returns the exception message. This is a fallback to handle unexpected errors gracefully.

Step 7: Implement the Views

Create the necessary views for initiating the payment and displaying success or error messages.

Step 8: Run the Application

Run your Laravel application:

php artisan serve
Enter fullscreen mode Exit fullscreen mode

Visit the /pay route in your browser, initiate a payment, and test the flow. Upon successful payment, you should be redirected to the /success route, and for errors, you should be redirected to the /error route.

This is a simplified example of integrating PayPal payments using the Omnipay library in a Laravel application. Depending on your requirements, you may need to implement additional features and error handling, such as storing payment data in a database and handling IPN (Instant Payment Notification) callbacks from PayPal.

Top comments (0)