Modelo de Razorpay
| Concepto de Razorpay | Significado en InsForge |
|---|---|
| Item | Unidad vendible con un importe asociado. Se refleja en payments.razorpay_items. |
| Plan | Definición de suscripción recurrente en torno a un Item. Se refleja en payments.razorpay_plans. |
| Order | Objeto de pago único. Se crea mediante POST /api/payments/razorpay/{environment}/orders y se refleja en payments.razorpay_orders. |
| Payment | Resultado del pago del proveedor. Se proyecta en payments.transactions a partir de webhooks y sincronización. |
| Subscription | Suscripción de Razorpay vinculada a un Plan. Se refleja en payments.razorpay_subscriptions. |
| Webhook event | Evento del proveedor verificado en payments.webhook_events con provider = 'razorpay'. |
UPDATE de payments.razorpay_subscriptions.
Para productos de pago único, los Razorpay Orders pueden crearse solo con un importe, una moneda y un recibo (receipt). Aun así, es preferible crear Razorpay Items para los productos vendibles, de modo que el catálogo sea visible en InsForge y Razorpay tras la sincronización. Trata los Orders como intentos de pago, no como tu catálogo de productos.
Configuración
Configura el Key ID y el Key Secret de Razorpay paratest y live en Dashboard -> Payments -> Settings, o mediante la API de administración. InsForge genera un secreto de firma de webhook si aún no existe uno.
Los webhooks de Razorpay deben crearse manualmente en el Razorpay Dashboard. Las claves API de comerciante normales de Razorpay no admiten el registro automático de webhooks.
- Abre Dashboard -> Payments -> Settings -> Webhooks.
- Copia la Webhook URL y el Webhook Secret de Razorpay.
- En el Razorpay Dashboard, crea un webhook con la URL y el secreto copiados.
- Selecciona los eventos que InsForge gestiona.
- Guarda el webhook y completa un pago de prueba para confirmar la entrega.
payment.authorizedpayment.capturedpayment.failedorder.paidinvoice.paidinvoice.expiredrefund.createdrefund.processedrefund.failedsubscription.createdsubscription.activatedsubscription.chargedsubscription.updatedsubscription.cancelledsubscription.pausedsubscription.resumedsubscription.haltedsubscription.completedsubscription.expired
Pedidos de pago único
Primero crea un pedido pendiente (pending order) propio de la app. Luego crea un Razorpay Order con el token de usuario actual de InsForge.POST /api/payments/razorpay/{environment}/orders. La respuesta incluye checkoutOptions con campos nativos de Razorpay Checkout como key y order_id. Carga https://checkout.razorpay.com/v1/checkout.js en el frontend y pasa esas opciones a new Razorpay(options).open().
Si tu trigger de cumplimiento (fulfillment) lee notes.order_id, pasa notes: { order_id: ... } al crear el Order o la Subscription.
Después de que Razorpay Checkout devuelva razorpay_order_id, razorpay_payment_id y razorpay_signature, verifica la firma en el backend:
Suscripciones
Crea o sincroniza un Razorpay Plan antes de crear suscripciones. Un Plan no es lo mismo que un Stripe Price. Es una definición recurrente en torno a un Razorpay Item.POST /api/payments/razorpay/{environment}/subscriptions. La respuesta incluye checkoutOptions.subscription_id. Abre Razorpay Checkout con ese subscription ID. Después de que Checkout devuelva razorpay_subscription_id, razorpay_payment_id y razorpay_signature, verifica el pago de autorización:
INSERT en payments.razorpay_subscriptions. Cancelar, pausar y reanudar evalúan las políticas UPDATE de la misma tabla. PostgreSQL también aplica políticas SELECT a las filas devueltas por INSERT/UPDATE ... RETURNING, así que haz visible el mismo subject al llamador cuando una verificación de política necesite devolver la fila. Concede a los usuarios solo el acceso a la tabla necesario para las verificaciones de políticas; las mutaciones del proveedor se siguen ejecutando a través del backend.
Webhooks y cumplimiento
El callback de Checkout y la verificación de firma de Razorpay no sustituyen a los webhooks. Usapayments.webhook_events para los triggers de cumplimiento. No adjuntes triggers de cumplimiento a tablas espejo del proveedor como payments.razorpay_subscriptions; la sincronización y la proyección de webhooks pueden actualizar esas filas independientemente de la entrega de eventos del proveedor.
Sincronización y estado del panel
La sincronización de Razorpay refleja Items, Plans, Customers, Subscriptions, Invoices y Payments. Las Invoices y los Payments alimentan la proyección de panel/informespayments.transactions. Las transacciones incluyen IDs de referencia del proveedor, como los IDs de payment, invoice, order, subscription y refund, para que puedas inspeccionar el registro de origen en el Razorpay Dashboard.
Mantén el estado de pedidos, créditos y derechos (entitlements) orientado al usuario en tus propias tablas de la app. Trata payments.transactions como estado de panel/informes, no como el flujo de trabajo principal del negocio.