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 Payment Element más reciente 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 Card Element y 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 aguarda la respuesta que llega desde el cliente y finaliza el pago en el servidor sin usar 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 los métodos de pago regionales más utilizados por separado.
- Riesgo de duplicación del cargo: al crearse un nuevo PaymentIntent de forma sincrónica cada vez que el cliente intenta pagar, corres el riesgo de cobrarle al cliente dos veces por error. Asegúrate de adoptar prácticas recomendadas.
- Viaje adicional al cliente: las tarjetas con 3D Secure o aquellas sujetas a normativas como la Autenticación reforzada de clientes (SCA) requieren pasos adicionales del lado 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 del 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 vencimiento.
Un Stripe Element contiene un iframe que envía la información del pago a Stripe en modo seguro a través de una conexión HTTPS. La dirección de la página de finalización de compra también debe empezar con https:// en lugar de http:// para que funcione tu integración.
Puedes probar tu integración sin usar HTTPS. Habilítala cuando todo esté listo para aceptar pagos reales.
Envía el PaymentMethod a tu servidorLado del cliente
Si el PaymentMethod se creó 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); } }
Crear un PaymentIntentLado del servidor
Configura un punto de conexión en tu servidor para recibir la solicitud. Este punto de conexión también se utilizará más adelante para gestionar las tarjetas que requieran un paso adicional de autenticación.
Crea un nuevo PaymentIntent con la ID del PaymentMethod creado en el cliente. Puedes confirmar el PaymentIntent estableciendo la propiedad confirm como “true” al crear el PaymentIntent o llamando a confirm después de su creación. También se admite Separar la autorización de la captura con pagos con tarjeta.
Si el pago requiere otras acciones, como autenticación con 3D Secure, el estado del PaymentIntent se establecerá en requires_
. Si el pago falla, el estado vuelve a ser requires_
y debes mostrarle un mensaje de error al usuario. Si el pago no requiere ninguna autenticación adicional, se crea un cargo y el estado del PaymentIntent se establece en succeeded
.
Nota
En las versiones de la API anteriores al 2019-02-11, requires_
aparece como requires_
y requires_
aparece como requires_
.
Si quieres guardar la tarjeta para volver a utilizarla más adelante, crea un objeto Customer para almacenar el PaymentMethod y especifica estos otros parámetros al crear el PaymentIntent:
- cliente. Establecido en el ID del objeto Customer.
- setup_future_usage. Establecido en
off_
para indicarle a Stripe que planeas 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 completa las acciones solicitadas. Para obtener más detalles, echa una ojeada al ejemplo de código acerca de cómo guardar tarjetas después de un pago.session
Gestionar las siguientes accionesLado del cliente
Escribe código para gestionar situaciones que requieran la intervención de tu cliente. Normalmente, un pago se efectiviza después de que lo confirmas en el servidor en el paso 4. Sin embargo, cuando el PaymentIntent requiere otra acción de parte del cliente, como autenticar con 3D Secure, este código interviene.
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_
. Confirma el PaymentIntent otra vez en tu servidor para finalizar el pago.
Mientras realices pruebas, usa un número de tarjeta de prueba que requiera autenticación (por ejemplo, ) para forzar ese flujo. Si usas una tarjeta que no necesita 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 cumplir pasos adicionales para completar el pago, como la autenticación, Stripe.js lo guía a través de ese proceso.
Confirmar el PaymentIntent nuevamenteLado del servidor
Este código solo se ejecuta cuando un pago requiere autenticación adicional, tal como se hizo en el paso anterior. El código en sí no es opcional porque cualquier pago puede requerir este paso extra.
Utilizando el mismo punto de conexión que configuraste arriba, confirma el PaymentIntent nuevamente para finalizar el pago y completar el pedido. Cerciórate de que esta confirmación se produzca en el término de una hora a partir del 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 verificar que la integración esté lista. Úsalas con cualquier CVC y una fecha de vencimiento futura.
Número | Descripción |
---|---|
La transacción se realiza con éxito y se procesa el pago de inmediato. | |
Exige autenticación. Stripe activa un cuadro de diálogo que le solicita al cliente completar 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.