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
1 |
composer require netshell/paypal dev-master |
2.- Añadir las siguientes rutas al archivo de config/app.php.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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
1 2 3 4 5 6 |
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
1 2 3 4 5 6 |
Route::group(['middleware' => ['web']], function () { <span class="typ">Route</span><span class="pun">::</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'payPremium'</span><span class="pun">,</span> <span class="pun">[</span><span class="str">'as'</span><span class="pun">=></span><span class="str">'payPremium'</span><span class="pun">,</span><span class="str">'uses'</span><span class="pun">=></span><span class="str">'PaypalController@payPremium'</span><span class="pun">]);</span> 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
1 |
php artisan make:controller PaypalController |
Vamos al código fuente de nuestro PaypalController app/http/Controllers/PaypalController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
<?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; } } |