Integración de la pasarela de pago de PayPal en Laravel
Recientemente publiqué un artículo sobre la integración de la pasarela de pago de PayPal en PHP. En ese artículo, uno de nuestros lectores preguntó sobre la integración de la pasarela de pago de PayPal en Laravel. Aunque Laravel está construido usando PHP, tienen sus propios estándares a seguir. Tienes que ajustar tu código PHP simple según el flujo de Laravel. En este artículo, le muestro cómo aceptar pagos en su sitio web de Laravel usando la API de PayPal Rest.
PayPal es una de las marcas más confiables para aceptar pagos en línea. PayPal proporciona diferentes formas de integrar su sistema de pago en aplicaciones web. Uno de los servicios es la API Rest de PayPal que usaremos para este tutorial. Para comenzar, primero debe obtener su identificación de cliente y su secreto de cliente.
Dirígete a tu cuenta de desarrollador de PayPal e inicia sesión. En el panel del desarrollador, haga clic en el menú ‘Mis aplicaciones y credenciales’. Luego haga clic en el botón ‘Crear aplicación’ en la sección de aplicaciones de la API REST.
Siga los pasos que se le indiquen y obtendrá su caja de arena y sus credenciales en vivo. Por ahora, copie la identificación del cliente y el secreto del cliente del modo sandbox.
Configuración básica en Laravel para aceptar pagos mediante PayPal
Cuando los clientes realizan el pago en su sitio web, debe almacenar los detalles del pago para su uso posterior. Cree una tabla de ‘pagos’ en la base de datos para almacenar los detalles del pago. Cree una migración para la tabla de ‘pagos’ usando el comando:
php artisan make:migration create_payments_table
Abra el archivo de migración y modifique las columnas de la siguiente manera.
<?php
...
...
public function up()
{
Schema::create('payments', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('payment_id');
$table->string('payer_id');
$table->string('payer_email');
$table->float('amount', 10, 2);
$table->string('currency');
$table->string('payment_status');
$table->timestamps();
});
}
Ejecute la migración anterior usando el siguiente comando.
php artisan migrate
Este comando creará una tabla de ‘pagos’ en su base de datos. A continuación, cree un modelo que corresponda a la tabla de ‘pagos’.
php artisan make:model Payment
Después de esto, agregue las credenciales de PayPal en su .env
archivo.
PAYPAL_CLIENT_ID=PASTE_HERE_CLIENT_ID
PAYPAL_CLIENT_SECRET=PASTE_HERE_CLIENT_SECRET
PAYPAL_CURRENCY=USD
Borre la caché de configuración usando el comando:
php artisan config:cache
Pasé la moneda ‘USD’. El usuario puede cambiarlo según los requisitos.
Definamos las rutas que necesitaremos en los siguientes pasos.
rutas / web.php
<?php
...
...
Route::get('payment', 'PaymentController@index');
Route::post('charge', 'PaymentController@charge');
Route::get('paymentsuccess', 'PaymentController@payment_success');
Route::get('paymenterror', 'PaymentController@payment_error');
Integración de la pasarela de pago de PayPal en Laravel
La integración de la API de pasarelas de pago en la aplicación es algo bastante complejo. Afortunadamente, la biblioteca Omnipay facilitó la vida de los desarrolladores. Omnipay es la biblioteca de procesamiento de pagos más popular para PHP. Proporciona un código sencillo y limpio para integrar diferentes pasarelas de pago. Instale la biblioteca Omnipay usando el comando:
composer require league/omnipay omnipay/paypal
Ahora, cree un controlador PaymentController
y defina los métodos mencionados en el archivo de ruta.
php artisan make:controller PaymentController
PaymentController.php
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use OmnipayOmnipay;
use AppPayment;
class PaymentController extends Controller
{
public $gateway;
public function __construct()
{
$this->gateway = Omnipay::create('PayPal_Rest');
$this->gateway->setClientId(env('PAYPAL_CLIENT_ID'));
$this->gateway->setSecret(env('PAYPAL_CLIENT_SECRET'));
$this->gateway->setTestMode(true); //set it to 'false' when go live
}
public function index()
{
return view('payment');
}
public function charge(Request $request)
{
if($request->input('submit'))
{
try {
$response = $this->gateway->purchase(array(
'amount' => $request->input('amount'),
'currency' => env('PAYPAL_CURRENCY'),
'returnUrl' => url('paymentsuccess'),
'cancelUrl' => url('paymenterror'),
))->send();
if ($response->isRedirect()) {
$response->redirect(); // this will automatically forward the customer
} else {
// not successful
return $response->getMessage();
}
} catch(Exception $e) {
return $e->getMessage();
}
}
}
public function payment_success(Request $request)
{
// Once the transaction has been approved, we need to complete it.
if ($request->input('paymentId') && $request->input('PayerID'))
{
$transaction = $this->gateway->completePurchase(array(
'payer_id' => $request->input('PayerID'),
'transactionReference' => $request->input('paymentId'),
));
$response = $transaction->send();
if ($response->isSuccessful())
{
// The customer has successfully paid.
$arr_body = $response->getData();
// Insert transaction data into the database
$isPaymentExist = Payment::where('payment_id', $arr_body['id'])->first();
if(!$isPaymentExist)
{
$payment = new Payment;
$payment->payment_id = $arr_body['id'];
$payment->payer_id = $arr_body['payer']['payer_info']['payer_id'];
$payment->payer_email = $arr_body['payer']['payer_info']['email'];
$payment->amount = $arr_body['transactions'][0]['amount']['total'];
$payment->currency = env('PAYPAL_CURRENCY');
$payment->payment_status = $arr_body['state'];
$payment->save();
}
return "Payment is successful. Your transaction id is: ". $arr_body['id'];
} else {
return $response->getMessage();
}
} else {
return 'Transaction is declined';
}
}
public function payment_error()
{
return 'User is canceled the payment.';
}
}
En el controlador anterior, tomamos la cantidad del formulario HTML y enviamos un usuario a PayPal para el pago. En el pago exitoso, almacenamos todos los detalles de la transacción en la tabla de ‘pagos’.
Finalmente, cree un archivo blade llamado payment.blade.php
y agregue el código a continuación.
<form action="{{ url('charge') }}" method="post">
<input type="text" name="amount" />
{{ csrf_field() }}
<input type="submit" name="submit" value="Pay Now">
</form>
Cuando enviamos este formulario, el control va a la charge
función en el PaymentController
y el controlador procesa el resto del flujo de pago.
Enviar información del producto a PayPal
En los pasos anteriores, estamos enviando el monto a pagar en PayPal. Es posible que también desee enviar información sobre el producto. El usuario puede ver estos detalles del producto en la página de pago antes de realizar un pago.
Para enviar la información del producto, debe pasar la matriz ‘elementos’ al purchase
método de la siguiente manera.
$response = $this->gateway->purchase(array(
'amount' => $request->input('amount'),
'items' => array(
array(
'name' => 'Course Subscription',
'price' => $request->input('amount'),
'description' => 'Get access to premium courses.',
'quantity' => 1
),
),
'currency' => env('PAYPAL_CURRENCY'),
'returnUrl' => url('paymentsuccess'),
'cancelUrl' => url('paymenterror'),
))->send();
Aquí estoy pasando los detalles del producto de forma estática. Debes dinamizarlo dependiendo de tu producto.
Espero que conozcas la integración de la pasarela de pago de PayPal en Laravel. Comparta sus pensamientos y sugerencias en la sección de comentarios a continuación.
Artículos relacionados
- Integración de Authorize.Net Payment Gateway en Laravel
- Integración de Stripe Payment Gateway en Laravel
- Integración de la pasarela de pago PayKun en Laravel