Ir a contenido
Crea una cuenta
o
Inicia sesión
Logotipo de Stripe Docs
/
Pregúntale a la IA
Crear una cuenta
Iniciar sesión
Empieza ahora
Pagos
Ingresos
Plataformas y marketplaces
Gestión del dinero
Recursos para desarrolladores

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:

¿Estás haciendo una migración?

Si estás migrando la actual integración de Stripe desde la API Charges, sigue las instrucciones de la guía de migración.

  • 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:

Command Line
Ruby
# Available as a gem sudo gem install stripe
Gemfile
Ruby
# If you use bundler, you can add this line to your Gemfile gem 'stripe'

Recopilar datos de tarjeta
Lado 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.

Incluye el script de Stripe.js en el encabezado de cada página de tu sitio. Elements se encuentra disponible automáticamente como función de Stripe.js.

<script src="https://js.stripe.com/basil/stripe.js"></script>

Si incluyes el script en cada página de tu sitio, podrás sacar provecho de las funcionalidades antifraude avanzadas de Stripe y de la capacidad de detectar comportamientos anómalos en la navegación.

Crear el formulario de pago

Para recopilar los datos de tarjeta de tus clientes en modo seguro, Elements crea componentes de interfaz de usuario alojados en Stripe. Luego se colocan en tu formulario de pago como un iframe. Para determinar dónde insertar estos componentes, crea elementos DOM (contenedores) vacíos con ID únicos en tu formulario de pago.

index.html
HTML
<form id='payment-form'> <label> Card details <!-- placeholder for Elements --> <div id="card-element"></div> </label> <button type="submit">Submit Payment</button> </form>

A continuación, crea una instancia del objeto Stripe suministrando tu clave de API publicable como primer parámetro. Luego, crea una instancia del objeto Elements y úsala para montar un elemento Card en el marcador de posición correspondiente en la página.

script.js
Visualizar el ejemplo completo
const stripe = Stripe(
'pk_test_TYooMQauvdEDq54NiTphI7jx'
); const elements = stripe.elements(); // Set up Stripe.js and Elements to use in checkout form const style = { base: { color: "#32325d", fontFamily: '"Helvetica Neue", Helvetica, sans-serif', fontSmoothing: "antialiased", fontSize: "16px", "::placeholder": { color: "#aab7c4" } }, invalid: { color: "#fa755a", iconColor: "#fa755a" }, }; const cardElement = elements.create('card', {style}); cardElement.mount('#card-element');

El card Element simplifica el formulario de pago y minimiza la cantidad de campos obligatorios insertando un único campo de entrada flexible que recopila todos los datos necesarios de la tarjeta en modo seguro.

De lo contrario, combina cardNumber, cardExpiry y cardCvc Elements para obtener un formulario de tarjeta de múltiples entradas flexible.

Nota

Recopila siempre el código postal para aumentar las tasas de aceptación de tarjetas y disminuir el fraude.

El Card Element de una sola línea recopila y envía automáticamente el código postal del cliente a Stripe. Si creas un formulario de pago con Elements divididos (número de tarjeta, vencimiento, CVC), agrega un campo de entrada separado para el código postal del cliente.

Crear un PaymentMethod

Por último, usa stripe.createPaymentMethod del lado de tu cliente para recopilar los datos de la tarjeta y crear un PaymentMethod en cuanto el usuario haga clic en el botón de envío.

script.js
const form = document.getElementById('payment-form'); form.addEventListener('submit', async (event) => { // We don't want to let default form submission happen here, // which would refresh the page. event.preventDefault(); const result = await stripe.createPaymentMethod({ type: 'card', card: cardElement, billing_details: { // Include any additional collected billing details. name: 'Jenny Rosen', }, }) stripePaymentMethodHandler(result); });

Envía el PaymentMethod a tu servidor
Lado del cliente

Si el PaymentMethod se creó correctamente, envía su ID a tu servidor.

script.js
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 PaymentIntent
Lado 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_action. Si el pago falla, el estado vuelve a ser requires_payment_method 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_payment_method aparece como requires_source y requires_action aparece como requires_source_action.

Command Line
curl
curl https://api.stripe.com/v1/payment_intents \ -u
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:
\ -d "payment_method"="{{PAYMENT_METHOD_ID}}" \ -d "amount"=1099 \ -d "currency"="usd" \ -d "confirmation_method"="manual" \ -d "confirm"="true"

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_session 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.

Gestionar las siguientes acciones
Lado 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_confirmation. 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.

script.js
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.handleCardAction 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 nuevamente
Lado 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_payment_method.

Command Line
curl
curl https://api.stripe.com/v1/payment_intents/{{PAYMENT_INTENT_ID}}/confirm \ -u
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:
\ -X "POST"

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úmeroDescripció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_funds.

Para ver la lista completa de tarjetas de prueba, consulta nuestra guía sobre pruebas.

OpcionalVolver a pedir el CVC

¿Te fue útil esta página?
SíNo
  • ¿Necesitas ayuda? Ponte en contacto con soporte.
  • Únete a nuestro programa de acceso anticipado.
  • Echa un vistazo a nuestro registro de cambios.
  • ¿Tienes alguna pregunta? Contacto.
  • ¿LLM? Lee llms.txt.
  • Con tecnología de Markdoc