PayPal Pruebas de Sandbox Webhooks con ngrok y Express (Nodo)


Ejemplo

En este ejemplo, veremos cómo probar las notificaciones de webhook en sandbox, utilizando ngrok para proporcionar un túnel para nuestro oyente HTTP Node, que se ejecuta en localhost, a Internet. Para este ejemplo, vamos a utilizar Node para configurar notificaciones web para eventos de pago (como un pago), y luego configurar el servidor para escuchar los mensajes POST HTTP entrantes de los eventos webhook.

Hay algunos pasos que vamos a seguir aquí para que esto suceda:

  1. Configure un servidor simple para escuchar el tráfico POST entrante de los webhooks, que será la notificación de PayPal, y comience a escuchar en localhost.
  2. Luego use ngrok para proporcionar un túnel desde localhost a Internet para que PayPal pueda publicar una notificación.
  3. Por último, suscriba nuestra aplicación (basada en las credenciales proporcionadas) a los eventos de webhook que deseamos rastrear, proporcionando el URI público de ngrok desde el paso 2.

Creando un Oyente de Webhooks

Lo primero que tenemos que hacer es crear el oyente. La razón por la que estamos empezando con el oyente es porque necesitamos la URL ngrok live para proporcionar a los webhooks cuando los creamos o actualizamos.

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

app.use(bodyParser.json());

app.post('/', function(req, res){
    console.log(JSON.stringify(req.body));
});

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

Nuestro oyente es una ruta simple usando Express. Escuchamos cualquier tráfico POST entrante, luego escupimos el cuerpo POST a la consola. Podemos usar esto para hacer lo que queramos con el oyente cuando se presente.

Cuando creamos el servidor HTTP al final, lo configuramos para escuchar en el puerto 3001 de localhost. Ejecute ese script ahora para comenzar a escuchar el tráfico.

Usando ngrok para exponer el Oyente a Internet

Con el servicio de escucha configurado en localhost: 3001, nuestro siguiente trabajo es exponer ese script a Internet, para que se pueda enviar el tráfico, que es el trabajo de ngrok.

Ejecute el siguiente comando desde una ventana de terminal:

ngrok http 3001

Eso iniciará el proceso de proporcionar un túnel en vivo para localhost en el puerto 3001, y proporcionará la siguiente información una vez que se ejecute:

introduzca la descripción de la imagen aquí

Como podemos ver, la dirección en vivo que podemos usar para dirigir el webhook de PayPal a nuestro oyente en ejecución en localhost es http(s)://055b3480.ngrok.io . Eso es todo lo que necesitamos saber para configurar al oyente.

Suscripción a notificaciones

Nuestro último paso es crear webhooks para nuestra aplicación, que creará notificaciones cuando ocurran ciertos eventos con pagos, reembolsos, etc. en nuestra aplicación. Solo necesitamos crear estos webhooks una vez para vincularlos a la aplicación, por lo que no es necesario que se ejecuten cada vez que desee usarlos.

Primero configuramos el entorno de PayPal agregando el requisito para el SDK del nodo de PayPal, nuestro ID de cliente / secreto para crear una aplicación, y luego configuramos el entorno para el entorno de pruebas.

var paypal = require('paypal-rest-sdk');

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

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

A continuación, configuramos la estructura JSON para nuestros webhooks. webhooks contiene dos elementos de información, la url que deben enviarse todos los eventos de webhook y los event_types que queremos suscribirnos.

En el caso de este ejemplo, la url se establece en nuestra URL en vivo de ngrok, y los eventos que estamos escuchando son casos en los que los pagos se completan o se rechazan.

Para obtener una lista completa de posibles eventos, consulte https://developer.paypal.com/docs/integration/direct/rest-webhooks-overview/#event-type-support .

Por último, pasamos el objeto de webhooks a la llamada para crear los webhooks, notification.webhook.create . Si tiene éxito, PayPal enviará notificaciones al punto final que especificamos, que se está ejecutando en localhost.

var webhooks = {
    "url": "https://436e4d13.ngrok.io",
    "event_types": [{
        "name": "PAYMENT.SALE.COMPLETED"
    },{
        "name": "PAYMENT.SALE.DENIED"
    }
]};

paypal.notification.webhook.create(webhooks, function (err, webhook) {
    if (err) {
        console.log(err.response);
        throw error;
    } else {
        console.log("Create webhook Response");
        console.log(webhook);
    }
});

Una vez que emitimos un pago utilizando esas credenciales de aplicación, la información sobre el estado de pago se enviará al punto final que configuramos.

Un ejemplo del cuerpo de POST que PayPal envía como la notificación podría ser similar al siguiente, que se envió después de un pago exitoso de PayPal:

{
  "id": "WH-9FE9644311463722U-6TR22899JY792883B",
  "create_time": "2016-04-20T16:51:12Z",
  "resource_type": "sale",
  "event_type": "PAYMENT.SALE.COMPLETED",
  "summary": "Payment completed for $ 7.47 USD",
  "resource": {
    "id": "18169707V5310210W",
    "state": "completed",
    "amount": {
      "total": "7.47",
      "currency": "USD",
      "details": {
        "subtotal": "7.47"
      }
    },
    "payment_mode": "INSTANT_TRANSFER",
    "protection_eligibility": "ELIGIBLE",
    "protection_eligibility_type": "ITEM_NOT_RECEIVED_ELIGIBLE,UNAUTHORIZED_PAYMENT_ELIGIBLE",
    "transaction_fee": {
      "value": "0.52",
      "currency": "USD"
    },
    "invoice_number": "",
    "custom": "",
    "parent_payment": "PAY-809936371M327284GK4L3FHA",
    "create_time": "2016-04-20T16:47:36Z",
    "update_time": "2016-04-20T16:50:07Z",
    "links": [
      {
        "href": "https:\/\/api.sandbox.paypal.com\/v1\/payments\/sale\/18169707V5310210W",
        "rel": "self",
        "method": "GET"
      },
      {
        "href": "https:\/\/api.sandbox.paypal.com\/v1\/payments\/sale\/18169707V5310210W\/refund",
        "rel": "refund",
        "method": "POST"
      },
      {
        "href": "https:\/\/api.sandbox.paypal.com\/v1\/payments\/payment\/PAY-809936371M327284GK4L3FHA",
        "rel": "parent_payment",
        "method": "GET"
      }
    ]
  },
  "links": [
    {
      "href": "https:\/\/api.sandbox.paypal.com\/v1\/notifications\/webhooks-events\/WH-9FE9644311463722U-6TR22899JY792883B",
      "rel": "self",
      "method": "GET"
    },
    {
      "href": "https:\/\/api.sandbox.paypal.com\/v1\/notifications\/webhooks-events\/WH-9FE9644311463722U-6TR22899JY792883B\/resend",
      "rel": "resend",
      "method": "POST"
    }
  ]
}