Integración de Paypal a Laravel 5.2

Paypal es una forma muy popular de pago. La mayoría de las personas la seleccionan porque esta es segura y simple de usar. Si deseas integrar Paypal express checkout a tu aplicación de Laravel 5.2, solamente tienes que seguir los siguientes pasos.

1.- Instalación. En este paso necesitas instalar nestshell/paypal, solo ejecuta el siguiente comando en tu terminal

composer require netshell/paypal dev-master

2.- Añadir las siguientes rutas al archivo de config/app.php.

return [
	......
	$provides => [
		......
		......,
		'Netshell\Paypal\PaypalServiceProvider'
	],
	$aliases => [
		.....
		.....,
		'Paypal' => 'Netshell\Paypal\Facades\Paypal'
	]
]

3.- Credenciales para modo Sandbox y Live de Paypal

En este paso ya debes tener tu client_id y tu código secreto proporcionados por la herramienta sandbox de paypal .  Para ello ya debes contar con una tipo empresarial en Paypal.

Te explico de manera rápida en que parte de Paypal adquieres estos códigos. Si ya hiciste login en tu cuenta tipo developer (sandbox), ve a los siguientes menús del lado izquierdo: My Apps & Credentials , dirígete hacia la opción REST API apps y da clic en el botón Create App.

Aquí están las famosas credenciales 

Ahora que ya tienes creadas tus credenciales, necesitas añadirlas en el archivo de config\services

return [
'paypal' => [
        'client_id' => 'xxx',
        'secret' => 'xxx',
    ],
];

4.- Añadir rutas al archivo de route.php

En este paso vamos a añadir las rutas necesarias para la comunicación en app/http/routes.php

Route::group(['middleware' => ['web']], function () {
 Route::get('payPremium', ['as'=>'payPremium','uses'=>'PaypalController@payPremium']);    
Route::post('getCheckout', ['as'=>'getCheckout','uses'=>'PaypalController@getCheckout']);
    Route::get('getDone', ['as'=>'getDone','uses'=>'PaypalController@getDone']);
    Route::get('getCancel', ['as'=>'getCancel','uses'=>'PaypalController@getCancel']);
});

5.- Ahora que ya creaste las rutas, es necesario generar nuestro Controller

php artisan make:controller PaypalController

Vamos al código fuente de nuestro PaypalController app/http/Controllers/PaypalController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use Paypal;
use App\User;
use Illuminate\Support\Facades\Auth;

class PaypalController extends Controller
{
    private $_apiContext;

    public function __construct()
    {
    	 $this->_apiContext = PayPal::ApiContext(
            config('services.paypal.client_id'),
            config('services.paypal.secret'));

    	//Aquí guarde una configuración para mis credenciales de Sandbox
        /*$this->_apiContext->setConfig(array(
            'mode' => 'sandbox',
            'service.EndPoint' => 'https://api.sandbox.paypal.com',
            'http.ConnectionTimeOut' => 30,
            'log.LogEnabled' => true,
            'log.FileName' => storage_path('logs/paypal.log'),
            'log.LogLevel' => 'FINE'
        ));*/

        //Config live
        $this->_apiContext->setConfig(array(
            'mode' => 'live',
            'service.EndPoint' => 'https://api.paypal.com',
            'http.ConnectionTimeOut' => 30,
            'log.LogEnabled' => true,
            'log.FileName' => storage_path('logs/paypal.log'),
            'log.LogLevel' => 'FINE'
        ));
    }

    public function getCheckout(Request $request)
	{
        $user         = Auth::user(); 
        $id_user      = $user->id;
        $id_purchased_item    = $request->input('id_purchased_item'); //producto que me estan comprando
        $invoice      = $id_user.'-'.$id_purchased_item.'-'.$this->random(5);//generación de invoice aleatorio
        $descripcion  = $request->input('description');
        $quantity     = $request->input('quantity');//cantidad de productos adquiridos
        $total_amount = $request->input('amount');
        $currency     = $request->input('currency_code');//tipo de moneda

	    $payer = PayPal::Payer();
	    $payer->setPaymentMethod('paypal');

	    $item1 = PayPal::item();
        $item1->setName($descripcion)
                ->setDescription($descripcion)
                ->setCurrency($currency)
                ->setQuantity(1)
                ->setPrice($total_amount);

        $itemList = PayPal::itemList();
        $itemList->setItems(array($item1));


        // ### Cantidad
        // Especificando la cantidad del pago
        // Se pueden añadir detalles adicionales como 
        // shipping, tax.
        // Todo estó para que en paypal aparezca desglosado
        // como si de un carrito de compra se tratará
        $amount = PayPal::amount();
        $amount->setCurrency($currency)
            ->setTotal($total_amount);

        // ### Transacción
        // Para quién es el pago y quién lo está pagando. 
        $transaction = PayPal::transaction();
        $transaction->setAmount($amount)
            ->setItemList($itemList)
            ->setDescription("Descripción")
            ->setInvoiceNumber($invoice);

        // ### urls de redirección
        // Rutas a las que será redirigido el comprador después de un pago 
        // aprobado / cancelación

        $redirectUrls = PayPal:: RedirectUrls();
	    $redirectUrls->setReturnUrl(route('getDone'));
	    $redirectUrls->setCancelUrl(route('getCancel'));

        // ### Pago
        // Creamos el pago, para establecer la venta

        $payment = PayPal::Payment();
	    $payment->setIntent('sale');
	    $payment->setPayer($payer);
	    $payment->setRedirectUrls($redirectUrls);
	    $payment->setTransactions(array($transaction));

	    $response = $payment->create($this->_apiContext);
	    $redirectUrl = $response->links[1]->href;
	    
	    return redirect()->to( $redirectUrl );

	}

	public function getDone(Request $request)
	{
        $id               = $request->get('paymentId');
        $token            = $request->get('token');
        $payer_id         = $request->get('PayerID');
        $payment          = PayPal::getById($id, $this->_apiContext);
        $paymentExecution = PayPal::PaymentExecution();

        $paymentExecution->setPayerId($payer_id);
        $executePayment = $payment->execute($paymentExecution, $this->_apiContext);

	    return view("payments.payment-done");
	}


	public function getCancel()
	{
	   return view("payment-cancel", compact("executePayment"));
	}

      /*generación del invoice para paypal */
      public function random($qtd){
 
       $caracteres = 'ABCDEFGHIJKLMOPQRSTUVXWYZ0123456789'; 
       $cantidad_de_caracteres = strlen($caracteres); 
       $cantidad_de_caracteres--; 

       $num_random = NULL; 
       for($x=1;$x<=$qtd;$x++){ 
        $posicion = rand(0,$cantidad_de_caracteres); 
        $num_random .= substr($caracteres,$posicion,1); 
       } 

      return $num_random; 
     } 
}

 

 

 

 

Comandos más usados de Laravel PHP Artisan

Cuando nos encontramos trabajando con Laravel una de las mejores herramientas que tenemos a nuestra disposición es el generador llamado artisan, aquí te dejamos nuestra lista de los comandos que más usamos en el día a día:

Crear una tabla

# Crear la tabla "posts"
php artisan make:migration create_posts_table --create posts 
php artisan migrate

Modificar una tabla existente

# Agregar el campo "summary" a la tabla "posts"
php artisan make:migration add_summary_to_posts_table --table="posts"

# Agregar varios campos nuevos a la tabla "users"
php artisan make:migration add_fields_to_users_table --table="users"

php artisan migrate

Generar una llave para hashing

php artisan key:generate

Crear un middleware

# Crear un middleware para verificiar si el usuario tiene una sesión
php artisan make:middleware HasUserASession

Crear un modelo

# Crear modelo Post
php artisan make:model Post

Crear un controlador

# Crear el controlador PostsController compatible con REST (resource) 
php artisan make:controller PostsController --resource

Generar código boilerplate para autenticación de usuarios

Este comando debería ejecutarse lo más pronto al iniciar tu proyecto ya que re-escribirá tus layouts y controladores de Autenticación y Usuarios

php artisan make:auth