PayPal Ejemplo de Node Express Server


Ejemplo

En este ejemplo, vamos a configurar una integración de servidor Express para mostrar cómo procesar un pago con PayPal, utilizando el SDK de nodo de PayPal. Usaremos una estructura JSON estática para los detalles de pago en aras de la brevedad.

Hay tres pasos generales que seguiremos cuando construyamos las funciones para manejar el pago de PayPal:

  1. Creamos un objeto JSON que contiene el pago que pretendemos procesar a través de PayPal. Luego lo enviamos a PayPal para obtener un enlace para redirigir al usuario para confirmar el pago.
  2. A continuación, redirigimos al usuario a PayPal para confirmar el pago. Una vez confirmado, PayPal redirige al usuario a nuestra aplicación.
  3. Una vez devuelto a la aplicación, completamos el pago en nombre del usuario.

Desglosando esto como una aplicación de Nodo simple, comenzamos por obtener el SDK de Nodo de PayPal de NPM:

npm install paypal-rest-sdk

A continuación, configuramos la configuración de la aplicación y los paquetes.

var http = require('http'),
    paypal = require('paypal-rest-sdk'),
    bodyParser = require('body-parser'),
    app = require('express')();

var client_id = 'YOUR APPLICATION CLIENT ID';
var secret = 'YOUR APPLICATION SECRET';

//allow parsing of JSON bodies
app.use(bodyParser.json());

//configure for sandbox environment
paypal.configure({
    'mode': 'sandbox', //sandbox or live
    'client_id': client_id,
    'client_secret': secret
});

Requerimos cuatro requisitos para esta aplicación:

  1. El paquete HTTP para nuestro servidor.
  2. El paquete SDK del nodo de PayPal.
  3. El paquete bodyParser para trabajar con cuerpos codificados JSON.
  4. El framework Express para nuestro servidor.

Las siguientes líneas configuran variables para el ID de cliente y el secreto que se obtuvieron al crear una aplicación . Luego configuramos bodyParser para permitir cuerpos codificados en JSON, luego configuramos nuestra aplicación usando los detalles de la aplicación y especificamos el entorno en el que estamos trabajando (en vivo para producción o en una zona de pruebas para prueba).

Ahora vamos a crear la ruta para crear una solicitud de pago con PayPal.

app.get('/create', function(req, res){
    //build PayPal payment request
    var payReq = JSON.stringify({
        'intent':'sale',
        'redirect_urls':{
            'return_url':'http://localhost:3000/process',
            'cancel_url':'http://localhost:3000/cancel'
        },
        'payer':{
            'payment_method':'paypal'
        },
        'transactions':[{
            'amount':{
                'total':'7.47',
                'currency':'USD'
            },
            'description':'This is the payment transaction description.'
        }]
    });

    paypal.payment.create(payReq, function(error, payment){
        if(error){
            console.error(error);
        } else {
            //capture HATEOAS links
            var links = {};
            payment.links.forEach(function(linkObj){
                links[linkObj.rel] = {
                    'href': linkObj.href,
                    'method': linkObj.method
                };
            })
        
            //if redirect url present, redirect user
            if (links.hasOwnProperty('approval_url')){
                res.redirect(links['approval_url'].href);
            } else {
                console.error('no redirect URI present');
            }
        }
    });
});

Lo primero que hacemos es configurar el objeto JSON de solicitud de pago, que contiene la información que debemos proporcionar a PayPal para crear el pago. Establecemos la intent de la sale , especificamos las URL de redireccionamiento (donde PayPal debe reenviar al usuario después de que confirmen / cancelen el pago), agregamos un payment_method de pago de paypal para indicar que haremos un pago de PayPal, luego especificamos la información de la transacción para El pagador para confirmar.

Luego llamamos a payment.create(...) , pasando nuestro objeto payReq . Esto enviará la solicitud de creación de pago a PayPal. Una vez que se devuelve, y tiene éxito, podemos recorrer los enlaces de HATEOAS proporcionados en el objeto de retorno para extraer la URL a la que necesitamos redireccionar al usuario, que está etiquetada bajo approval_url .

El formato para los enlaces HATEOAS puede causar un código de referencia frágil si se usa directamente, por lo que hacemos un bucle a través de todos los enlaces proporcionados y los colocamos en un objeto de referencia mejor para futuras pruebas contra los cambios. Si se encuentra la approval_url en ese objeto, redirigimos al usuario.

En este punto, el usuario es redirigido a PayPal para confirmar el pago. Una vez que lo hacen, se redirigen de nuevo al return_url que especificamos en la función createPayment(...) .

Ahora tenemos que proporcionar una ruta para manejar esa devolución, a fin de completar el pago.

app.get('/process', function(req, res){
    var paymentId = req.query.paymentId;
    var payerId = { 'payer_id': req.query.PayerID };

    paypal.payment.execute(paymentId, payerId, function(error, payment){
        if(error){
            console.error(error);
        } else {
            if (payment.state == 'approved'){ 
                res.send('payment completed successfully');
            } else {
                res.send('payment not successful');
            }
        }
    });
});

Cuando el usuario vuelva a su aplicación, habrá tres parámetros de cadena de consulta que también se enviarán: paymentId , PayerID y token . Solo tenemos que tratar con los dos primeros.

Extraemos los parámetros y colocamos el PayerID en un objeto simple para la necesidad del paso de ejecución de pago. A continuación, se realiza una llamada a payment.execute(...) , pasando esos dos parámetros, para completar el pago.

Una vez que se realiza esa solicitud, vemos si el pago se completó con éxito al verificar si el estado de payment.state está configurado como approved . Si es así, podemos almacenar lo que necesitamos del objeto de pago que se devuelve.

Nuestro último paso es inicializar nuestro servidor y escuchar el tráfico que llega a las rutas que especificamos.

//create server
http.createServer(app).listen(3000, function () {
   console.log('Server started: Listening on port 3000');
});

Una vez que se inicializa el servidor, vaya a http://localhost:3000/create inicializa el proceso de pago.