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