Acepta pagos con tarjeta sin webhooks
Aprende a confirmar un pago con tarjeta en tu servidor y a gestionar las solicitudes de autenticación de tarjeta.
Precaución
Stripe recomienda usar el nuevo Payment Element en lugar del Card Element. Te permite aceptar varios métodos de pago con un solo Element. Obtén más información sobre cuándo usar el Card Element y el Payment Element.
Para tener más opciones de soporte y capacidad de corrección en el futuro, usa la integración estándar para pagos asincrónicos.
Esta integración espera la respuesta que llega desde el cliente y finaliza el pago en el servidor sin utilizar webhooks ni procesar eventos fuera de línea. Si bien esto puede parecer más simple, la integración es difícil de escalar a medida que tu empresa crece, y tiene varias limitaciones:
- Solo acepta tarjetas: tendrás que escribir más líneas de código para aceptar ACH y otros métodos de pago regionales muy utilizados por separado.
- Riesgo de duplicación del cargo: al crearse un nuevo PaymentIntent de forma sincronizada cada vez que el cliente intenta pagar, corres el riesgo de cobrarle dos veces por error. Asegúrate de seguir las prácticas recomendadas.
- Proceso más largo para el cliente: las tarjetas con 3D Secure o sujetas a requisitos normativos, como la autenticación reforzada de clientes, requieren más pasos por parte del cliente.
Ten en cuenta estas limitaciones si decides usar esta integración. De lo contrario, usa la integración estándar.
Configurar Stripe
Primero, necesitas una cuenta de Stripe. Inscríbete ahora.
Usa nuestras bibliotecas oficiales para acceder a la API de Stripe desde tu aplicación:
Recopilar datos de tarjetaLado del cliente
Recopila los datos de tarjeta de lado del cliente con Stripe.js y Stripe Elements. Elements es un conjunto de componentes de interfaz de usuario prediseñados para recopilar y validar el número de tarjeta, el código postal y la fecha de caducidad.
Un Stripe Element contiene un iframe que envía la información del pago a Stripe de forma segura a través de una conexión HTTPS. Para que funcione la integración, la dirección de la página de finalización de compra también debe comenzar con https:// en lugar de http://.
Puedes probar tu integración sin usar HTTPS. Habilítala cuando todo esté listo para aceptar pagos en el modo activo.
Envía el PaymentMethod a tu servidorLado del cliente
Si el PaymentMethod se ha creado correctamente, envía su ID a tu servidor.
const stripePaymentMethodHandler = async (result) => { if (result.error) { // Show error in payment form } else { // Otherwise send paymentMethod.id to your server (see Step 4) const res = await fetch('/pay', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ payment_method_id: result.paymentMethod.id, }), }) const paymentResponse = await res.json(); // Handle server response (see Step 4) handleServerResponse(paymentResponse); } }
Crea un PaymentIntentLado del servidor
Crea un punto de conexión en tu servidor para recibir la petición. Este punto de conexión también se utilizará más adelante para gestionar las tarjetas que requieran un paso adicional de autenticación.
Crear un nuevo PaymentIntent con el ID del PaymentMethod creado en tu cliente. Puedes confirmar el PaymentIntent estableciendo la propiedad confirm como true cuando se crea el PaymentIntent o llamando a confirm después de su creación. También se aceptan la autorización y la captura por separado para los pagos con tarjeta.
Si el pago requiere más acciones, como la autenticación mediante 3D Secure, el estado del PaymentIntent se establecerá en requires_
. Si el pago falla, el estado vuelve a ser requires_
y debes mostrar un mensaje de error al usuario. Si el pago no requiere más autenticación, se crea un cargo y el estado del PaymentIntent pasa a succeeded
.
Nota
En las versiones de la API anteriores a 2019-02-11, requires_
aparece como requires_
y requires_
aparece como requires_
.
Si quieres guardar la tarjeta para volver a utilizarla más tarde, crea un Customer para almacenar el PaymentMethod y especifica los siguientes parámetros al crear el PaymentIntent:
- customer: establécelo en el ID del objeto Customer.
- setup_future_usage: establécelo en
off_
para indicarle a Stripe que tienes intención de reutilizar este PaymentMethod para pagos fuera de la sesión sin la presencia del cliente. Si se define esta propiedad, el PaymentMethod se guarda en el objeto Customer después de la confirmación del PaymentIntent y de que el usuario complete las acciones solicitadas. Para obtener más información, observa el ejemplo de código sobre de cómo guardar tarjetas después de un pago.session
Gestionar las siguientes accionesLado del cliente
Escribe el código para gestionar situaciones que requieran la intervención del cliente. Normalmente, un pago se hace efectivo después de que lo confirmas en el servidor, en el paso 4. Sin embargo, cuando el PaymentIntent requiere una acción más por parte del cliente, como la autenticación con 3D Secure, entra en juego este código.
Usa stripe.handleCardAction para activar la interfaz de usuario con el fin de gestionar la acción del cliente. Si la autenticación se realiza correctamente, el estado del PaymentIntent es requires_
. Vuelve a confirmar el PaymentIntent en tu servidor para finalizar el pago.
Mientras estés haciendo pruebas, usa un número de tarjeta de prueba que requiera autenticación (por ejemplo, ) para forzar este flujo. Si usas una tarjeta que no requiere autenticación (por ejemplo, ), se omite esta parte del flujo y la operación finaliza en el paso 4.
const handleServerResponse = async (response) => { if (response.error) { // Show error from server on payment form } else if (response.requires_action) { // Use Stripe.js to handle the required card action const { error: errorAction, paymentIntent } = await stripe.handleCardAction(response.payment_intent_client_secret); if (errorAction) { // Show error from Stripe.js in payment form } else { // The card action has been handled // The PaymentIntent can be confirmed again on the server const serverResponse = await fetch('/pay', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ payment_intent_id: paymentIntent.id }) }); handleServerResponse(await serverResponse.json()); } } else { // Show success message } }
Nota
stripe.
puede tardar varios segundos en completarse. Durante ese tiempo, deshabilita tu formulario para no reenviarlo y muestra un indicador de espera, por ejemplo, un indicador giratorio. Si recibes un mensaje de error, muéstraselo al cliente, rehabilita el formulario y oculta el indicador de espera. Si el cliente debe realizar pasos adicionales para completar el pago, como la autenticación, Stripe.js lo guía a través de ese proceso.
Volver a confirmar el PaymentIntentLado del servidor
Este código solo se ejecuta cuando un pago requiere un paso más de autenticación, tal como se hizo en el paso anterior. El código en sí no es opcional porque cualquier pago puede exigir este paso extra.
Utilizando el mismo punto de conexión que has configurado arriba, confirma el PaymentIntent nuevamente para finalizar el pago y tramitar el pedido. Asegúrate de que esta confirmación se produce en el plazo de una hora desde el intento de pago. De lo contrario, el pago fallará y volverá a requires_
.
Probar la integración
Dispones de varias tarjetas de prueba que puedes usar en un entorno de prueba para asegurarte de que la integración esté lista. Úsalas con cualquier CVC y con cualquier fecha de caducidad futura.
Número | Descripción |
---|---|
La transacción se realiza correctamente y el pago se procesa de inmediato. | |
Exige autenticación. Stripe activa un cuadro de diálogo modal donde solicita al cliente realizar la autenticación. | |
Siempre da error con un código de rechazo insufficient_ . |
Para ver la lista completa de tarjetas de prueba, consulta nuestra guía sobre pruebas.