Añadir Paypal a Laravel

Muchas aplicaciones y web nos permiten hacer compras de artículos, suscripciones y servicios a partir de una pasarela de pago. Puede parecer complicado añadir ésta funcionalidad a una aplicación pero es bastante sencillo y en éste artículo aprenderemos hacerlo en pocos minutos con la plataforma de pago Paypal y Laravel.

Integrando Paypal en Laravel

Lo primero que debemos hacer es añadir paypal mediante composer en nuestra aplicación, para ello nos dirigimos a nuestra aplicación y ejecutaremos el comando:

composer require srmklive/paypal

Una vez termine de instalarse la dependencia, la incluiremos en los providers, para ello, nos dirigimos a app.php que se encuentra en la carpeta config.

'providers' => [
        ...
        ...
        ...
    Srmklive\PayPal\Providers\PayPalServiceProvider::class
]

Añadiendo nuestros datos

Para que nuestros usuarios puedan pagarnos, necesitamos añadir en el archivo .env la información de nuestra cuenta de Paypal, para ellos debemos logearnos en paypal developers e ir al apartado de Accounts, dónde nos proporcionará los datos que debemos añadir en nuestro archivo .env:

PAYPAL_MODE = sandbox
PAYPAL_SANDBOX_API_USERNAME = ........
PAYPAL_SANDBOX_API_PASSWORD = .............
PAYPAL_SANDBOX_API_SECRET = ................
PAYPAL_CURRENCY = INR
PAYPAL_SANDBOX_API_CERTIFICATE =

Repito, estos datos son los que te proporciona paypal una vez entres en el apartado ACCOUNTS de Paypal Developers (No en la página típica de Paypal)

Creación del controlador

Ahora vamos a crear un controlador dónde utilizaremos el provider y definiremos la lógica:

php artisan make:controller PaymentController

Este comando creará el controlador en app/Http/Controllers.

Añadiremos este código en el controlador:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

//Añadimos la dependencia 
use Srmklive\PayPal\Services\ExpressCheckout;

class PaymentController extends Controller
{

    //Esta función nos llevará a la página de paypal, donde el usuario terminará o cancelará el pago
    public function payment()
    {
        $data = [];
        $data['items'] = [
            [
                'name' => 'Suscripcion', //Nombre del producto
                'price' => 14, //Precio
                'desc'  => 'Suscripción de un mes', //Descripcion
                'qty' => 1 //Cantidad
            ]
        ];

        $data['invoice_id'] = 1;
        $data['invoice_description'] = "Suscripcion de un mes";
        $data['return_url'] = route('payment.success'); //si se hace bien el pago
        $data['cancel_url'] = route('payment.cancel'); // si se cancela el pago
        $data['total'] = 14;

        $provider = new ExpressCheckout;
        $response = $provider->setExpressCheckout($data);
        $response = $provider->setExpressCheckout($data, true);

        return redirect($response['paypal_link']);

    }

    public function cancelPayment()
    {
        //Está función será la que se ejecute si se cancela el pago, puedes redirigir a la vista anterior, mostrar un mensaje, etc
    }


    public function successPayment(Request $request)
    {
        //Nos devolvera los detalles del pago, y con el comprobaremos si se ejecuto correctamente
        $response = $provider->getExpressCheckoutDetails($request->token);

        if (in_array(strtoupper($response['ACK']), ['SUCCESS', 'SUCCESSWITHWARNING'])) {
            //Si el pago se realizo, se ejecutara esta condición
        }else{
            //Si no se realizo el pago por un error, se ejecutara esto
        }

    }
}

He añadido comentarios en el código del controlador, dónde voy explicando lo que hace cada función.

Como he comentado en la función successPayment, si la condicción se cumple, significa que se realizó el pago y podemos llevar acabo alguna acción. Sí por ejemplo es un pago de suscripción, ahí podriamos hacer un update en el usuario logeado para actualizar su estado a premium (por ejemplo), también podriamos hacer una inserción en la tablas facturas, para llevar un registro de los pagos recibidos, etc…

Creando las rutas

Ahora debemos crear las rutas  que ejecuten las funciones del controlador. Nos dirigimos a web.php en la carpeta routes y añadimos este código:

Route::get('payment', 'PaymentController@payment')->name('payment');
Route::get('cancel', 'PaymentController@cancelPayment')->name('payment.cancel');
Route::get('payment/success', 'PaymentController@successPayment')->name('payment.success');

Creando el formulario

Por último, solo quedaría crear una vista con un formulario que llamase a la ruta payment:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link href="https://fonts.googleapis.com/css?family=Open+Sans&display=swap" rel="stylesheet">
  <title>Payment</title>
</head>
<style>
  body{
    font-family: 'Open Sans', sans-serif;
    text-align:center;
  }
  .btn-payment{
    background-color:#0070ba;
    padding:13px 24px;
    color:white;
    text-decoration: none;
    border-radius: 25px;
  }
</style>
<body>
  <div class="wrapper">
    <h1>¡Suscríbete por solo 14$!</h1>
    <a href="{{ route('payment') }}" class="btn-payment">Suscribirme</a>
  </div>
</body>
</html>