CodingPR

Eventos de Stripe con Webhooks

Implemente Stripe Webhooks en su sistema de suscripción con Express js.

Denisse Avatar

Por:

Denisse Abreu
Mayo 23, 2022 8pm ET

Eng/Spa 3-min

Hola 🖐🏼, esta es la tercera parte de nuestra guía, ¿Cómo crear un sistema de suscripción con Stripe y Express js?. En este tutorial, conectaré el Stripe Webhook a nuestro sistema de suscripción. Los webhooks son una parte integral de cualquier sistema de suscripción. Cuando las personas se suscriben, cambian o cancelan su suscripción, su sistema necesita Escuchar estos eventos y actualizar la base de datos para otorgar o rechazar el acceso a su servicio. Para este proyecto, estoy usando Express. Si aún no tienes un proyecto, puedes copiar el mío aquí: Vue Stripe Subscriptions.

1. Configure Stripe.

Instale el paquete de Stripe y la CLI de Stripe según su sistema operativo. Guía de instalación del CLI de Stripe.


  npm install stripe --save
  
  • Cree un archivo .env en la raíz del proyecto; ¡Por favor, no exponga sus claves directamente en el código!
.env
STRIPE_PUBLIC_KEY=<YOUR-STRIPE-PUBLIC-KEY> STRIPE_SECRET_KEY=<YOUR-SECRET-KEY> STRIPE_WEBHOOK_SECRET=<YOUR-WEBHOOK-KEY>

Configure un middleware para separar los eventos de webhook de otras solicitudes posteriores que su aplicación pueda tener. Esto se debe a que los webhooks no se pueden analizar como objetos JSON.

server/index.js
require('dotenv').config() const express = require('express') const cors = require('cors') const app = express() // Middleware app.use((req, res, next) => { if (req.originalUrl === '/api/posts/webhook') { next() } else { express.json()(req, res, next) } })

2. Inicie la consola CLI de Stripe.

Abra su terminal y escriba stripe -v para verificar la instalación de Stripe. Si Stripe CLI no está instalado en su computadora, vaya a las Instrucciones de Stripe CLI, luego escriba stripe login y stripe listen --forward-to:localhost:3000/api/posts/webhook para redirigir las llamadas del webhook a su servidor node js. Si desea utilizar su clave secreta (stripe secret key) para escuchar estos eventos, use --api-key seguido de su clave. Asegúrese de que su código 'webhook signing secret' sea el mismo en su Navegador; si el código de emparejamiento 'pairing code' es correcto, recibirá su código de inicio de sesión webhook, inserte este código en su archivo .env y reinicie su servidor.

Command Prompt

  • Comience a escuchar eventos dentro del webhook; si todo esta bien, recibirás respuestas 200 ok de Stripe.

Respuesta Command Prompt Stripe

  • Alternativamente, puede desencadenar diferentes eventos usando el Stripe Shell

Stripe Shell

  • A continuación, verás expresiones switch case de javascript; Recuerda borrar los registros de la consola y usar dataObject.status para manipular su base de datos.

Vscode Terminal

3. Comience las pruebas de integración de Stripe.

El siguiente código es la ruta completa del webhook; en lugar de hacer console log a cada caso, manipule su base de datos para otorgar, actualizar o cancelar servicios de suscripción. Consulta la lista de eventos de las suscripciones de Stripe para mas 'switch cases'.

server/posts.js
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY); // Webhook router.post('/webhook', express.raw({ type: 'application/json' }), async (req, res) => { let event; try { event = await stripe.webhooks.constructEvent( req.body, req.headers['stripe-signature'], process.env.STRIPE_WEBHOOK_SECRET ); // Extraiga el objeto del evento. const dataObject = event.data.object; if (dataObject['billing_reason'] == 'subscription_create') { const subscription_id = dataObject['subscription'] const payment_intent_id = dataObject['payment_intent'] // Recupere la intención de pago utilizada para pagar la suscripción const payment_intent = await stripe.paymentIntents.retrieve( payment_intent_id ); await stripe.subscriptions.update( subscription_id, { default_payment_method: payment_intent.payment_method, }, ); await stripe.customers.update( payment_intent.customer, { invoice_settings: { default_payment_method: payment_intent.payment_method, }, } ); }; switch (event.type) { case 'invoice.paid': /* Concede servicios una vez finalizada la prueba. El estado de la factura aparecerá como pagado. Almacene el estado en su base de datos para hacer referencia cuando un usuario accede a su servicio y evitar rate limits. */ console.log(`Invoice.paid: ${dataObject.status}`); break; case 'invoice.payment_succeeded': /* Insertar pago exitoso en la base de datos Permita el acceso a su servicio. */ console.log(`payment_succeeded: ${dataObject.status}`); break; case 'invoice.payment_failed': /* Si el pago falla o el cliente no tiene un método de pago válido, se envía un evento factura.pago_fallido, la suscripción se vuelve vencida. Use este webhook para notificar a su usuario que su pago ha fallado y para recuperar nuevos detalles de su tarjeta. */ console.log(`invoice.payment_failed: ${dataObject.status}`); break; case 'customer.subscription.created': // Insertar activo en la base de datos y otorga acceso al servicio console.log(`customer.subscription.created: ${dataObject.status}`); break; case 'customer.subscription.updated': // Insertar activo en la base de datos y otorga acceso al servicio console.log(`customer.subscription.updated: ${dataObject.status}`); break; case 'customer.subscription.deleted': if (event.request != null) { /* maneje una suscripción cancelada por solicitud desde arriba. */ console.log(`customer.subscription.deleted: ${dataObject.status}`); } else { /* maneje suscripción cancelada automáticamente basada en la configuración de suscripción. */ console.log(`customer.subscription.deleted: ${dataObject.status}`); } break; default: // Evento inesperado } // Devuelva una respuesta como acuse de recibo del evento res.sendStatus(200); } catch (err) { // En caso de error, inicie sesión y devuelva el mensaje de error console.log(`❌ Error message: ${err.message}`); return res.status(400).send(`Webhook Error: ${err.message}`); } } )