Aceptar pagos con OXXO
Cómo aceptar pagos con OXXO, un método de pago muy usado en México.
Precaución
Te recomendamos que sigas la guía Cómo aceptar un pago a menos que necesites usar la confirmación manual del lado del servidor o que tu integración requiera que presentes los métodos de pago por separado. Si ya te integraste con Elements, consulta la guía de migración de Payment Element.
Si aceptas OXXO en tu aplicación, se abrirá una vista web del vale OXXO. Los clientes abonan presentando un vale OXXO con un número y el pago en efectivo efectuado en una tienda OXXO de 24 horas. Stripe te notifica cuando se completa el pago.
Configurar StripeLado del servidorLado del cliente
Lado del servidor
Esta integración necesita puntos de conexión en tu servidor que se comuniquen con la API de Stripe. Usa nuestras bibliotecas oficiales para acceder a la API de Stripe desde tu servidor:
Lado del cliente
El SDK para React Native es de código abierto y está plenamente documentado. Internamente, utiliza SDK para iOS nativo y Android. Para instalar el SDK para React Native de Stripe, ejecuta uno de los siguientes comandos en el directorio del proyecto (según el administrador de paquetes que utilices):
A continuación, instala otras dependencias necesarias:
- Para iOS, navega hasta el directorio de ios y ejecuta
pod install
para asegurarte de instalar también las dependencias nativas necesarias. - Para Android, no hay más dependencias para instalar.
Inicialización de Stripe
Para inicializar Stripe en tu aplicación React Native, ajusta tu pantalla de pago con el componente StripeProvider
o usa el método de inicialización initStripe
. Solo se requiere la clave publicable de la API en publishableKey
. El siguiente ejemplo muestra cómo inicializar Stripe usando el componente StripeProvider
.
import React, { useState, useEffect } from 'react'; import { StripeProvider } from '@stripe/stripe-react-native'; function App() { const [publishableKey, setPublishableKey] = useState(''); const fetchPublishableKey = async () => { const key = await fetchKey(); // fetch key from your server here setPublishableKey(key); }; useEffect(() => { fetchPublishableKey(); }, []); return ( <StripeProvider publishableKey={publishableKey} merchantIdentifier="merchant.identifier" // required for Apple Pay urlScheme="your-url-scheme" // required for 3D Secure and bank redirects > // Your app code here </StripeProvider> ); }
Nota
Usa las claves de prueba de la API durante las pruebas y el desarrollo, y tus claves para modo activo cuando publiques tu aplicación.
Crear un PaymentIntentLado del servidorLado del cliente
Un PaymentIntent es un objeto que representa tu intención de cobrar a un cliente y hace el seguimiento del ciclo de vida del proceso de pago en cada etapa.
Lado del servidor
Crea un PaymentIntent en tu servidor con un importe en mxn
(OXXO no acepta otras monedas). Si ya tienes una integración con la API Payment Intents, agrega oxxo
a la lista de tipos de métodos de pago de tu PaymentIntent
.
Opciones de métodos de pago adicionales
Puedes especificar un parámetro opcional expires_
en las opciones de métodos de pago de tu PaymentIntent
que define la cantidad de días calendario que deben pasar para que venza el vale de OXXO. Por ejemplo, si creas un vale de OXXO un lunes y defines expires_
en 2, el vale vencerá el miércoles a las 23:59, hora de América/Sao_Paulo (UTC-3). El parámetro expires_
puede ser de 1 a 7 días. El valor predeterminado es de 3 días.
Lado del cliente
Del lado del cliente, solicita un PaymentIntent desde tu servidor y almacena el secreto de cliente.
const fetchPaymentIntentClientSecret = async () => { const response = await fetch(`${API_URL}/create-payment-intent`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ email, currency: 'mxn', payment_method_types: ['oxxo'], }), }); const {clientSecret, error} = await response.json(); return {clientSecret, error}; };
Recopilar datos del método de pagoLado del cliente
En tu aplicación, recopila el nombre completo y la dirección de correo electrónico del cliente.
export default function OxxoPaymentScreen() { const [name, setName] = useState(); const [email, setEmail] = useState(); const handlePayPress = async () => { // ... }; return ( <Screen> <TextInput placeholder="Name" onChange={(value) => setName(value.nativeEvent.text)} /> <TextInput placeholder="E-mail" onChange={(value) => setEmail(value.nativeEvent.text)} /> </Screen> ); }
Enviar el pago a StripeLado del cliente
Recupera el secreto de cliente del PaymentIntent que creaste y llama a confirmPayment
. Se abrirá una vista web para mostrar el vale OXXO.
export default function OxxoPaymentScreen() { const [name, setName] = useState(); const [email, setEmail] = useState(); const handlePayPress = async () => { const billingDetails: PaymentMethodCreateParams.BillingDetails = { name, email, }; const { error, paymentIntent } = await confirmPayment(clientSecret, { paymentMethodType: 'Oxxo', paymentMethodData: { billingDetails, } }); if (error) { Alert.alert(`Error code: ${error.code}`, error.message); console.log('Payment confirmation error', error.message); } else if (paymentIntent) { if (paymentIntent.status === PaymentIntents.Status.RequiresAction) { Alert.alert( 'Success', `The OXXO voucher was created successfully. Awaiting payment from customer.` ); } else { Alert.alert('Payment intent status:', paymentIntent.status); } } }; return ( <Screen> <TextInput placeholder="Name" onChange={(value) => setName(value.nativeEvent.text)} /> <TextInput placeholder="E-mail" onChange={(value) => setEmail(value.nativeEvent.text)} /> </Screen> ); }
Opcional: enviar al cliente el enlace del vale por correo electrónico
Stripe envía un evento payment_intent.requires_action cuando el vale de OXXO se crea correctamente. Si necesitas enviar a tus clientes el enlace del vale por correo electrónico, puedes recuperar el PaymentIntent para obtener el enlace al recibir el evento. El campo hosted_
en payment_intent.next_action.oxxo_display_details contiene el enlace para acceder al vale.
Opcional: personalizar tu vale
Stripe permite la personalización de las interfaces de usuario del cliente en la página de configuración de imagen de marca.
La siguiente configuración de marca puede aplicarse al vale:
- Ícono: tu imagen de marca y el nombre público de la empresa
- Color de énfasis: se utiliza como color del botón Copiar número
- Color de la marca: se utiliza como color de fondo
Gestionar eventos posteriores al pagoLado del servidor
OXXO es un método de pago con notificación diferida, de manera que los fondos no están disponibles de inmediato. Es posible que el cliente no pague el vale en una tienda de 24 horas inmediatamente después de realizar la compra.
Stripe envía un evento payment_intent.succeeded el siguiente día hábil (de lunes a viernes, excepto que sea día feriado en México) por cada vale de OXXO pagado. Utiliza el Dashboard o crea un controlador de webhooks para recibir estos eventos y ejecutar acciones (por ejemplo, enviar un correo electrónico de confirmación del pedido a tu cliente, registrar la venta en una base de datos o iniciar el flujo de envío).
Después de la fecha de vencimiento, el estado del PaymentIntent pasa a ser processing
, y el cliente ya no puede pagar el vale de OXXO vencido. Si este vale no se paga antes de las 23:59, hora de América/Mexico_City (UTC-6) del día del vencimiento, Stripe envía un evento payment_intent.payment_failed dentro de los 10 días calendario posteriores a la fecha de vencimiento (en la mayoría de los casos, el evento se envía dentro de los 7 días calendario). Por ejemplo, si el vale de OXXO vence el 1 de septiembre, este evento se envía el 10 de septiembre a más tardar.
Evento | Descripción | Próximos pasos |
---|---|---|
payment_ | El vale OXXO se creó correctamente. | Espera a que el cliente pague el vale OXXO. |
payment_ | El cliente ya no puede pagar el vale OXXO. | Espera hasta saber si el pago se concreta o no. |
payment_ | El cliente pagó el vale OXXO antes del vencimiento. | Entrega los bienes o servicios que el cliente compró. |
payment_ | El cliente no pagó el vale OXXO antes del vencimiento. | Comunícate con el cliente por correo electrónico o envía una notificación push y solicítale otro método de pago. |
Recibir eventos y realizar operaciones comerciales
Manualmente
Utiliza el Dashboard de Stripe para ver todos tus pagos en Stripe, enviar recibos por correo electrónico, gestionar transferencias o reintentar pagos fallidos.
Código personalizado
Crea un controlador de webhooks para escuchar eventos y crear flujos de pago asincrónicos personalizados. Prueba y depura tu integración de webhooks en forma local con la CLI de Stripe.
Probar la integración
En el entorno de prueba, usa los siguientes correos electrónicos cuando llames a confirmPayment
para probar diferentes escenarios.
Correo electrónico | Descripción |
---|---|
| Simula un vale OXXO abonado por el cliente al cabo de 3 minutos con el webhook Ejemplo: fulano@test.com |
| Simula un vale OXXO abonado por el cliente de inmediato con el webhook Ejemplo: succeed_immediately@test.com |
| Simula un vale OXXO que venza antes de que pague el cliente con el webhook El campo Ejemplo: expire_immediately@test.com |
| Simula un vale OXXO que venza antes de que pague el cliente con el webhook El campo Ejemplo: expire_with_delay@test.com |
| Simula un vale OXXO que venza antes de que pague el cliente con el webhook Ejemplo: fill_never@test.com |
Vencimiento y cancelación
Los vales OXXO vencen después de la marca de tiempo UNIX expires_
, y el cliente ya no puede pagar un vale una vez vencido. Los vales OXXO no se pueden cancelar antes de su vencimiento.
Después del vencimiento del vale OXXO, el estado del PaymentIntent cambia a requires_
. A estas alturas, puedes confirmar el PaymentIntent con otro método de pago o cancelarlo.