Resumen

Optimiza tus pagos en PayPal con un flujo seguro y claro: desde la captura con el SDK hasta el envío de detalles al backend con un form oculto y método post. Aquí verás cómo validar monto, tipo de pago y datos del comprador para guardar la orden en tu base de datos con confianza.

¿Qué es la captura de una transacción en PayPal y por qué importa?

La creación de la orden no mueve el dinero. La captura transfiere los fondos a tu cuenta y te devuelve los detalles necesarios para validar y almacenar la operación. Además, puedes verificar el tipo de pago, la cantidad y datos del comprador.

  • Crear orden no es igual a recibir dinero.
  • Capturar confirma y liquida el pago en tu cuenta.
  • Puedes validar monto, tipo de pago y estado de la compra.

¿Dónde inicia el flujo con el SDK de PayPal?

Desde la sección de basic integration, paso 5, usas onApprove para capturar la orden. Copia los dos parámetros que pasas a create order dentro de onApprove y llama a la función de captura disponible en actions.

  • Usa actions.order.capture para ejecutar la captura.
  • Recibe una promesa y maneja sus detalles en un callback.
paypal.Buttons({ // createOrder: ... onApprove: function (data, actions) { return actions.order.capture().then(function (details) { // details: información de la transacción capturada. }); } }).render('#paypal-button-container');

¿Qué validaciones puedes hacer tras la captura?

Con los detalles puedes confirmar el precio del producto, el tipo de pago y el estado. Si el producto es físico, PayPal expone la sección shipping para la dirección de envío, y la información del comprador bajo payer (nombre, ID, email).

  • Campo payer: nombre, ID de comprador y email.
  • Campo shipping: dirección para enviar productos físicos.
  • ID de la transacción: clave para futuras modificaciones y auditoría.

¿Cómo enviar los detalles al backend de forma segura?

Realizar la captura solo en el front end no basta. Envía la información al backend con un form y método post para procesar y persistir los datos con seguridad.

¿Cómo crear el formulario oculto?

Coloca el form debajo del contenedor del botón. Define la action hacia la ruta /success, método post, y un input oculto para los detalles.

<form action="/success" method="post" id="PayPal form"> <input type="hidden" name="details" id="details input" /> </form>
  • Action: URL del backend para recibir la orden.
  • Método post: envía datos de manera segura.
  • Input oculto: transporta el JSON con los detalles.

¿Cómo pasar los detalles capturados al formulario?

Dentro de onApprove, referencia el form y el input, convierte los detalles a JSON con JSON.stringify y realiza submit.

onApprove: function (data, actions) { return actions.order.capture().then(function (details) { var paypalForm = document.getElementById('PayPal form'); var detailsInput = document.getElementById('details input'); var jsonDetails = JSON.stringify(details); detailsInput.value = jsonDetails; paypalForm.submit(); }); }
  • document.getElementById: referencia el form y el input.
  • JSON.stringify: serializa el objeto de detalles.
  • submit: envía los datos a /success en tu backend.

¿Qué procesar y guardar en el backend tras /success?

En tu archivo de routes (por ejemplo, index.js), recibe el campo details, parsea el JSON y crea la orden en la base de datos con tu modelo (por ejemplo, Orden). Guarda tanto campos clave como el objeto completo en un campo meta para auditoría.

// Ruta POST /success app.post('/success', function (req, res) { const details = JSON.parse(req.body.details); // Crear la orden en BD (modelo: Orden): // - PayPal ID // - nombre del comprador // - status de la compra // - email // - meta: todos los detalles de la orden // Responder o redirigir según tu flujo. });
  • Guarda PayPal ID, nombre, status y email.
  • Usa meta para persistir todos los detalles de la orden.
  • Valida precio y dirección de shipping si el producto es físico.
  • Implementa reglas: cupones, cancelación o modificación según tus criterios.

¿Tienes dudas sobre validar montos, manejar shipping o el diseño de tu modelo de datos? Cuéntame tu caso en los comentarios y lo revisamos juntos.