Todos los artículos
Un evento de pago de PayPal Sandbox viaja por un túnel HTTPS seguro hasta un receptor de webhooks que se ejecuta en el portátil de un desarrollador.
PayPalsandboxwebhookslocal testing

Probar webhooks de PayPal Sandbox en localhost

Para probar los webhooks de la zona de pruebas de PayPal en localhost, ejecute su escucha localmente, exponga su ruta a través de un túnel HTTPS público, registre esa URL en una aplicación de la zona de pruebas y active una transacción real de la zona de pruebas o un evento simulado en el Simulador de Webhooks de PayPal. Mantenga la verificación de firma habilitada: los eventos del simulador y los eventos de la zona de pruebas asociados a la aplicación tienen una importante diferencia de verificación explicada abajo.

Por qué PayPal no puede enviar directamente a localhost

PayPal entrega notificaciones de webhooks desde sus propios servidores. Una dirección como http://localhost:3000/api/paypal apunta a la máquina de PayPal desde la perspectiva de PayPal, no la suya. Un túnel localhost le da al proceso local una dirección HTTPS pública mientras deja la aplicación en su computadora.

La documentación oficial PayPal Webhooks Simulator dice que su escucha debe ser accesible a través de HTTPS en el puerto 443. Un túnel maneja ese punto final TLS público y reenvía la solicitud a cualquier puerto local, como 3000 o 8080.

Elija la ruta de prueba de PayPal correcta

Eventos simulados de simulador para el desarrollo de oyentes

El simulador puede enviar eventos representativos, incluidas capturas de pagos, reembolsos y eventos de facturación, sin crear una transacción. Esta es la forma más rápida de confirmar el enrutamiento, el análisis JSON, los códigos de respuesta y el envío de eventos. Los eventos simulados no están vinculados a una aplicación REST, no aparecen en el visor de eventos del webhook de la aplicación, no se pueden reenviar y no representan transacciones reales.

Eventos reales de sandbox para comportamiento de un extremo a otro

Para una integración realista, cree una aplicación REST en el Panel de desarrollador de PayPal, agregue el punto final del túnel como un webhook, seleccione los tipos de eventos requeridos y complete una operación de pago o API en la zona de pruebas. Esos eventos pertenecen a la aplicación sandbox y utilizan las mismas credenciales de aplicación, ID de webhook, visor de eventos y flujo de trabajo de reenvío que utilizará antes de la producción.

Configurar un webhook de PayPal en localhost

  1. Inicie su aplicación y confirme que la ruta funciona localmente: curl -i -X POST http://localhost:3000/api/webhooks/paypal -H 'content-type: application/json' -d '{"event_type":"LOCAL.PING"}'.
  2. Ejecute npx portpreview 3000 y copie la URL HTTPS generada.
  3. Crea la devolución de llamada completa, por ejemplo https://your-subdomain.portpreview.dev/api/webhooks/paypal.
  4. Para pruebas simuladas, péguelo en el Simulador de Webhooks y seleccione un evento. Para probar la aplicación, agréguela en la configuración del webhook de su aplicación REST sandbox.
  5. Envíe un evento e inspeccione el método entrante, los encabezados de PayPal, el cuerpo sin formato, los registros del controlador y la respuesta HTTP.

Suscríbete solo a los eventos que maneja tu aplicación. Una suscripción amplia genera ruido y facilita la ejecución accidental de lógica empresarial para un evento que nunca modeló.

A practical Express listener

import express from 'express';

const app = express();
app.use(express.json({ verify: (req, _res, buf) => {
  req.rawBody = Buffer.from(buf);
}}));

app.post('/api/webhooks/paypal', async (req, res) => {
  const event = req.body;

  // Verify first; do not fulfill an order from untrusted JSON.
  const verified = await verifyPayPal(req.headers, event);
  if (!verified) return res.status(401).send('invalid signature');

  // Claim the event ID atomically so retries cannot duplicate work.
  const firstDelivery = await claimEvent(event.id);
  if (!firstDelivery) return res.sendStatus(200);

  if (event.event_type === 'PAYMENT.CAPTURE.COMPLETED') {
    await markOrderPaid(event.resource.id);
  }

  return res.sendStatus(200);
});

app.listen(3000);

Mantenga el trabajo de reconocimiento breve. Almacene el evento, devuelva una respuesta 2xx y realice correos electrónicos lentos o trabajos de cumplimiento en una cola. El ID del evento es la clave de idempotencia natural; imponer una restricción de base de datos única en lugar de depender de un conjunto en memoria.

Verificar las firmas de PayPal correctamente

PayPal envía metadatos de transmisión en encabezados que incluyen PAYPAL-AUTH-ALGO, PAYPAL-CERT-URL, PAYPAL-TRANSMISSION-ID, PAYPAL-TRANSMISSION-SIG y PAYPAL-TRANSMISSION-TIME. Para eventos asociados a aplicaciones, puede enviar esos valores, el ID del webhook y el evento a la API de sandbox /v1/notifications/verify-webhook-signature. Una respuesta HTTP exitosa no es suficiente; requiere que verification_status sea igual a SUCCESS. PayPal también documenta la verificación criptográfica local en su guía de integración de webhook.

Advertencia sobre el simulador: El punto final de verificación de devolución de datos de PayPal no admite eventos simulados de simulador. PayPal documenta el ID literal del webhook WEBHOOK_ID para autoverificar la firma del simulador. No confunda ese valor especial con el ID de webhook real asignado a una aplicación sandbox. Si su objetivo inmediato es probar la API de devolución de datos, genere una transacción real en el espacio aislado en lugar de un evento simulado de simulador.

Valide que cualquier URL de certificado siga las reglas documentadas de PayPal antes de descargarlo, conserve la representación exacta del evento requerida por el método de verificación y nunca registre tokens de acceso, secretos de clientes, firmas ni cargas útiles de pago completas.

Prueba los eventos que cambian dinero o acceden

  • PAYMENT.CAPTURE.COMPLETED: otorgar cumplimiento solo después de verificar los identificadores de pedido esperados, el monto, la moneda y el estado de captura.
  • PAYMENT.CAPTURE.REFUNDED: revertir derechos de forma segura y admitir reembolsos parciales.
  • Eventos de orden de pago: distingue la aprobación de una captura completa; la aprobación por sí sola no es prueba de que se capturaron fondos.
  • Eventos de suscripción: activación de prueba, suspensión, cancelación, pago fallido y entrega fuera de orden en su máquina de estado de facturación.

Los eventos del proveedor son notificaciones, no comandos incuestionables de la base de datos. Para transiciones confidenciales, recupere el recurso de PayPal al que se hace referencia con credenciales API autenticadas y compárelo con su propio registro de pedido.

Solucionar problemas de entregas locales fallidas

El simulador no puede conectarse

Confirme que la URL comienza con https://, incluye la ruta exacta del webhook y aún apunta a un túnel en ejecución. Pruebe usted mismo la URL pública con curl. Un 404 generalmente significa que la ruta o ruta marco es incorrecta; un 502 generalmente significa que el túnel no puede llegar al proceso local.

El controlador devuelve 401

Primero determine si el evento provino del simulador o de una aplicación sandbox registrada. Verifique el ID del webhook y el método de verificación correspondiente. Luego verifique que los servidores proxy hayan conservado todos los encabezados PAYPAL-* y que no esté mezclando credenciales activas con api-m.sandbox.paypal.com.

PayPal reintenta o marca la entrega como fallida

Devuelve un 2xx solo después de que el evento haya sido aceptado de forma duradera. Evite redirecciones, páginas de error HTML, middleware de autenticación y trabajos sincrónicos prolongados en la ruta. Utilice el visor de eventos para eventos de aplicaciones reales y el resultado del simulador para diagnósticos de entrega simulados. Consulte la guía de reintento e idempotencia para conocer patrones de procesamiento duraderos.

Lista de verificación de seguridad antes de entrar en funcionamiento

  • Utilice credenciales independientes de zona de pruebas y de cliente activo, ID de webhook y secretos de punto final.
  • Verifique cada firma antes de analizar campos comerciales o cambiar de estado.
  • Deduplicar mediante ID de evento de PayPal y hacer que las transacciones de cumplimiento sean atómicas.
  • Permitir solo POST, limitar el tamaño de la solicitud, aplicar límites de velocidad y mantener privada la URL del túnel cuando sea posible.
  • Redactar datos y credenciales del comprador de los registros; gire todo lo expuesto durante la depuración.
  • Reemplace la URL del túnel temporal con un punto final de producción estable y repita las pruebas de firma y reintento.

Para obtener los esquemas completos de eventos y verificación, utilice la referencia principal de la API Webhooks de PayPal. Para obtener detalles independientes del marco sobre cuerpos sin procesar y comparaciones seguras, lea la webhook guía de verificación de firmas.

Preguntas frecuentes

¿Puede el Simulador de Webhooks de PayPal enviar a localhost?
No directamente. Exponga su ruta de webhook local con un túnel HTTPS público y luego ingrese esa URL HTTPS en el simulador. PayPal requiere un oyente al que pueda acceder a través de Internet.
¿Por qué falla la verificación de firma de PayPal en un evento de simulador?
Los eventos simulados del simulador no se pueden publicar en el punto final de verificación-webhook-firma de PayPal. Documentos de PayPal WEBHOOK_ID para firmas de simuladores de autoverificación; utilice un evento de aplicación de zona de pruebas real para probar la verificación de devolución de datos.
¿Cuál es la diferencia entre el sandbox de PayPal y los webhooks del simulador?
Los webhooks del simulador son cargas útiles simuladas e independientes de la aplicación para realizar pruebas de escucha. Los webhooks de la aplicación Sandbox son el resultado de la actividad del Sandbox, utilizan el ID real del webhook de la aplicación, aparecen en sus herramientas de eventos y admiten el flujo de trabajo de verificación normal.
¿Qué estado HTTP debería devolver un webhook de PayPal?
Devuelva una respuesta 2xx después de que el evento sea verificado y aceptado de forma duradera. Rechace firmas no válidas y mueva el trabajo de notificación o cumplimiento lento a una cola para que la entrega no expire.