Saltar al contenido principal

Pasarela de Pago Simulada para Pruebas: Proveedor Dummy de Casdoor, Modo de Prueba de Stripe y Sandbox de PayPal

· 11 min de lectura
Yang Luo
Casdoor Maintainer

Una pasarela de pago simulada es un proveedor de pagos que acepta cada proceso de compra como pagado sin contactar con un banco o una red de tarjetas, para que pueda probar pedidos, suscripciones y cumplimiento sin dinero y sin una cuenta de pasarela. Casdoor incluye una: el Proveedor de pago Dummy. Añádalo a un producto, compre el producto, y Casdoor registra el pago y el pedido como Paid, inicia la suscripción y escribe la transacción, todo sin salir de su servidor. Use Dummy en desarrollo, y cambie a un sandbox de proveedor (modo de prueba de Stripe, sandbox de PayPal, sandbox de Paddle) en staging, donde también necesita tarjetas rechazadas, 3-D Secure y redirecciones reales.

Dummy, Balance y sandboxes de proveedores de un vistazo​

ProveedorEntorno de pruebasCómo Casdoor elige entre pruebas o producciónTipo de proveedor de Casdoor
DummyNo se necesita ninguno, cada pago tiene éxitoSiempre simuladoDummy
BalanceInterno, financiado por un producto de recargaSiempre internoBalance
StripeSandbox con claves sk_test_ / pk_test_Según las claves que introduzcaStripe
PayPalApps de sandbox y cuentas de sandboxUn runmode distinto de prod usa el sandboxPayPal
PaddleCuenta de sandbox separada en sandbox-vendors.paddle.comUn runmode distinto de prod usa sandbox-api.paddle.comPaddle
AdyenEntorno de pruebas (checkout-test.adyen.com)Un runmode distinto de prod usa el entorno de pruebasAdyen
AirWallexSeparate sandbox accountrunmode other than prod calls api.sandbox.airwallex.comAirWallex
Lemon SqueezyModo de prueba de tienda con claves de API de modo de pruebaSegún la clave de API que introduzcaLemon Squeezy
FastSpringTienda de demostración de pruebas con .test. en el hostSegún el Host que introduzcaFastSpring
PolarSandbox en sandbox.polar.shEstablezca el Host del proveedor a https://sandbox-api.polar.shPolar

runmode es la opción en conf/app.conf (o la variable de entorno runmode) descrita en la referencia de configuración. Su valor predeterminado es dev, por lo que un Casdoor recién instalado habla con los sandboxes de PayPal, Paddle, Adyen y AirWallex hasta que lo configure en prod.

Qué significa una transacción simulada​

Una transacción simulada pasa por los mismos registros que una compra real (pedido, pago, suscripción, entrada de libro mayor) pero no mueve dinero. Es diferente de una transacción de sandbox. Un sandbox aún llama a la API del proveedor, muestra la página de pago del proveedor y envía webhooks; solo el dinero es falso. Una transacción simulada nunca sale de su sistema.

Esa diferencia decide qué puede probar cada uno. Una pasarela simulada es buena para su propia lógica: ¿el plan otorga el rol correcto?, ¿aparece el pedido?, ¿se cuenta el cupón como usado?, ¿llega el usuario a la página correcta? Un sandbox es bueno para la integración: credenciales, redirecciones, rechazos de tarjetas, desafíos de autenticación y entrega de webhooks. Necesita ambos, en etapas diferentes.

Cómo funciona el proveedor Dummy de Casdoor​

El proveedor Dummy no tiene configuraciones ni página de pago. Aquí está el flujo completo en la versión master de Casdoor:

  1. Cuando el usuario paga, la llamada Pay del proveedor devuelve la página de resultados de Casdoor como URL de pago. Empaqueta el precio y la moneda en el ID del pedido en lugar de crear nada en un vendedor.
  2. Casdoor almacena el pago en el estado Created y envía directamente al navegador a la página de resultados. No hay formulario de tarjeta, falso o de otro tipo.
  3. La página de resultados ve un pago Created y llama a POST /api/notify-payment aproximadamente un segundo después.
  4. La llamada Notify del proveedor siempre responde Paid, con el precio que empaquetó anteriormente, por lo que la verificación del precio pasa.
  5. Luego, Casdoor ejecuta la ruta normal de éxito: el pago y el pedido se convierten en Paid, las suscripciones creadas para el pago se actualizan, se escribe una transacción Purchase, se reduce el stock del producto y se marca como usado un cupón en el pedido. Si el producto es un producto de recarga, una transacción Recharge también agrega el monto al saldo del usuario.

Así que sí, Dummy marca el pedido como pagado inmediatamente, y el usuario ve la página de éxito sin ningún paso intermedio.

De ese diseño se derivan dos limitaciones. Dummy no puede fallar: no hay forma de hacer que devuelva Canceled, Timeout o Error, por lo que las rutas de fallo necesitan un sandbox. Y Dummy no puede renovar: Casdoor solo permite la renovación automática para Balance y Stripe, por lo que una suscripción comprada con Dummy siempre tiene la renovación automática desactivada.

En una nueva base de datos, Casdoor crea un proveedor Dummy integrado llamado provider_payment_dummy en la organización admin, junto con un proveedor Balance integrado. También puedes agregar el tuyo propio: en Identity > Providers, establece Category en Payment y Type en Dummy.

Mantén Dummy fuera de producción​

/api/notify-payment is open to anonymous callers, because real gateways call it without a Casdoor session. For a real provider that is safe, since Notify checks the payment with the vendor. Dummy checks nothing and reports Paid, so for a Dummy payment Casdoor only accepts the call from the payment's own user or an admin of its organization. That still leaves the main risk: any product that lists Dummy in its Payment providers shows it at checkout, and any signed-in user who picks it gets the product for free. Remove Dummy from every product before you go live, and do not put it on products in an organization that real users can reach.

Balance: la billetera interna que puedes financiar con Dummy​

El proveedor Balance permite a los usuarios pagar desde su saldo de cuenta. Casdoor verifica el saldo primero, deduce el precio y marca el pago y el pedido como Paid en la misma solicitud. Balance es una función real de producción, no una herramienta de prueba, pero funciona bien con Dummy: pon Dummy en un producto de recarga, "recarga" un usuario de prueba y el saldo se acredita sin dinero involucrado.

Esto importa para las suscripciones, porque Balance es uno de los dos proveedores que admiten la renovación automática. Con Dummy más Balance puedes probar todo el ciclo de renovación en una laptop sin una cuenta de pasarela.

Sandboxes de vendedores para staging​

Stripe. Stripe separa los datos de prueba y en vivo mediante claves: las claves de sandbox comienzan con pk_test_ y sk_test_, las claves en vivo con pk_live_ y sk_live_, y los objetos en un modo no son visibles en el otro. Casdoor usa las claves que pongas en el proveedor Stripe; runmode no cambia nada para Stripe. Las tarjetas de prueba de Stripe cubren las rutas que Dummy no puede: 4242 4242 4242 4242 tiene éxito, 4000 0000 0000 0002 es rechazada y 4000 0000 0000 3220 requiere 3-D Secure. Usa cualquier fecha de caducidad futura y cualquier CVC. Los términos de Stripe prohíben probar en modo en vivo con detalles de tarjetas reales.

PayPal. El sandbox de PayPal es un entorno separado con sus propias aplicaciones y cuentas de prueba. PayPal crea una cuenta personal predeterminada y una cuenta empresarial predeterminada en el sandbox cuando inicias sesión por primera vez en el panel de desarrollador; pagas con la personal. Crea la aplicación en modo sandbox, coloca sus credenciales en el proveedor PayPal y mantén runmode en dev.

Paddle. El sandbox es una cuenta separada en sandbox-vendors.paddle.com con sus propias claves y productos; nada se comparte con el entorno en vivo. Las tarjetas de prueba de Paddle incluyen 4242 4242 4242 4242 (tiene éxito) y 4000 0000 0000 0002 (rechazada).

Lemon Squeezy has a test mode per store, and API keys created in test mode only see test data. FastSpring test orders go through a test storefront: insert .test. into the store host, for example yourstore.test.onfastspring.com, and enter that as the provider's Host. Polar has a sandbox with its own tokens; set the provider's Host to https://sandbox-api.polar.sh to use it, and leave Host empty for live Polar. Alipay in Casdoor is also hard-wired to production.

Un plan de prueba para productos, planes y suscripciones de Casdoor​

Desarrollo, con Dummy​

  1. Crea un producto y añade Dummy a sus Payment providers.
  2. Crea un plan para ese producto y una página de precios que lo liste (consulta la visión general de precios).
  3. Como usuario de prueba, abre la página de precios y compra el plan. Verifica que el pago y el pedido estén en Paid, la suscripción esté en Active y aparezca una transacción Purchase en el usuario.
  4. Inicia sesión como el usuario y verifica que el rol del plan haya surtido efecto en tu aplicación.
  5. Si el plan tiene Is exclusive activado, cómpralo de nuevo y espera el error de que el usuario ya tiene una suscripción activa.
  6. Aplica un cupón en el checkout y verifica que su uso quede registrado.
  7. Crea un producto de recarga con Dummy, recarga al usuario de prueba, luego compra el plan con Balance y Auto renew activado.
  8. Para probar la renovación sin esperar un mes, edita el End time de la suscripción en su página de edición para que termine dentro de 24 horas. Casdoor verifica las suscripciones una vez por hora; espera que el Renewal state sea Renewed y una nueva suscripción para el siguiente período. Luego compra el plan de nuevo con un saldo demasiado bajo para el siguiente período, mueve su hora de finalización de la misma manera y espera Failed con la razón en Renewal message. La documentación de suscripciones describe las reglas exactas.

Staging, con un sandbox​

  1. Ejecute el entorno de preproducción con runmode = dev y solo credenciales de sandbox o de prueba.
  2. Reemplace Dummy por el proveedor que utilizará en producción, configurado con sus claves de sandbox.
  3. Repita la compra y verifique que el navegador vaya al checkout del vendedor y regrese a la página de resultados de Casdoor.
  4. Con Stripe, pague una vez con la tarjeta de rechazo y otra con la tarjeta 3-D Secure, y verifique los estados del pago y del pedido para cada caso.
  5. Con Stripe y Auto renew activado, Casdoor guarda la tarjeta en el checkout y la cobra automáticamente al renovar, por lo que el truco de la fecha final anterior también funciona en el sandbox.

Puesta en producción​

Elimine Dummy de todos los productos, establezca runmode = prod si utiliza PayPal, Paddle, Adyen o AirWallex, e introduzca las claves de producción. Revise los registros de pago de los primeros pedidos reales.

Si también prueba los correos electrónicos de registro en el mismo entorno, un receptor de correo local mantiene esos mensajes fuera de las bandejas de entrada reales; consulte MailHog vs Mailpit.

Referencias​