...
✅ Noticias, temas, complementos de WEB y WordPress. Aquí compartimos consejos y las mejores soluciones para sitios web.

Integración de la pasarela de pago de PayPal en Laravel

938

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.

Integración de la pasarela de pago de PayPal en Laravel

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 .envarchivo.

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 PaymentControllery 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.phpy 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 chargefunción en el PaymentControllery 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 purchasemé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

Fuente de grabación: artisansweb.net

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More