Ir a contenido
Crea una cuenta
o
inicia sesión
Logotipo de la documentación de Stripe
/
Pregúntale a la IA
Crear cuenta
Iniciar sesión
Empezar
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 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:

¿Estás realizando una migración?

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

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

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

Incluye la secuencia de comandos de Stripe.js en el encabezado de cada página de tu sitio web. Elements está disponible automáticamente como función de Stripe.js.

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

Incluir la secuencia de comandos en cada página de tu sitio web te permite aprovechar las funciones avanzadas contra el fraude de Stripe y la capacidad de detectar comportamientos de navegación anómalos.

Crear el formulario de pago

Para recolectar los datos de las tarjetas de tus clientes de forma segura, Elements crea componentes de interfaz de usuario que están alojados en Stripe. Luego se colocan en tu formulario de pago en forma de iframe. Para determinar dónde insertar estos componentes, crea elementos DOM (contenedores) vacíos con ID únicos dentro de 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. Después, crea una instancia del objeto Elements y úsala para montar un elemento Card en el marcador de posición correspondiente de la página.

script.js
Ver la muestra completa
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 Element card simplifica el formulario y minimiza la cantidad de campos obligatorios al insertar un único campo de entrada flexible que recopila todos los datos necesarios de la tarjeta de forma segura.

De lo contrario, combina los Elements cardNumber, cardExpiry y cardCvc para obtener un formulario flexible de tarjeta de varias entradas.

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 única línea recopila y envía automáticamente el código postal del cliente a Stripe. Si creas tu formulario de pago con Elements divididos (número de tarjeta, caducidad, CVC), añade un campo de entrada independiente para el código postal del cliente.

Crear un PaymentMethod

Por último, usa stripe.createPaymentMethod en tu cliente para recolectar 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 ha creado 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); } }

Crea un PaymentIntent
Lado 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_action. Si el pago falla, el estado vuelve a ser requires_payment_method 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_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 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_session 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.

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

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 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 PaymentIntent
Lado 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_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 asegurarte de que la integración esté lista. Úsalas con cualquier CVC y con cualquier fecha de caducidad futura.

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

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

OpcionalVolver a pedir el CVC

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