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; 
     } 
}

 

 

 

 

El concepto de namespace en PHP

¿Te acuerdas cuando tu maestra de primaria te decía que tus libretas deberían estar bien ordenadas de acuerdo a la materia de la que trataran?

Pues bien los namespaces son una forma de organización de código que tenemos disponible en PHP; si vienes de un mundo parecido a Java seguramente recuerdas el concepto de paquete o package, que básicamente se encargaba de agrupar varias clases semántica o lógicamente relacionadas bajo un mismo folder (directorio físico o lógico).

Esa misma idea la tenemos en PHP y para usarlos sólo necesitas utilizar la palabra reservada namespace seguido del nombre que desees, por ejemplo si queremos que la clase User sea parte del espacio de nombres App, usaríamos la siguiente sintaxis.

namespace App;

class User {

}

Ventajas de los namespaces de PHP

  • Evitan colisiones entre clases; por ejemplo imagina que estás integrando dos sistemas diferentes bajo una misma aplicación pero ambos sistemas tienen una clase User. Sin usar namespaces no podrías user ambas clases en el mismo archivo PHP.
  • Capacidad de utilizar un alias cuando importas tus clases con el mismo nombre. Es decir, usando namespaces puedes definir un alias fácilmente como en el siguiente ejemplo:
namespace App;

use Webtraining\Auth\Models\User as WebtrainingUser;

class User {
    public function copyUser(WebtrainingUser $user) {
       // Some logic goes here!
    }
}

Para más información sobre aliasing/importing visita este artículo Using namespaces: Aliasing/Importing

Y aquí tienes el Namespaces overview de la documentación oficial.

Que tengas un excelente día.

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