Files
WRNexusJS/packages/payment

@wrnexus/payment

Gateway-neutral, webhook-authoritative payments for WrNexus. Amounts are integer minor units. Every initialize and refund operation requires an idempotency key. The package never accepts or stores card numbers, CVVs, or expiry input; its components navigate to provider-hosted checkout.

Built-in adapters: offline sandbox, Stripe, Razorpay, and PayPal. Applications may add adapters with defineGateway. Capabilities are explicit, unsupported operations are refused, signed webhooks are mandatory in production, and package-owned migrations provision the append-only event ledger.

Webhook events are deduplicated by the provider's event ID and reduced in provider occurrence/sequence order. Captured and refund states are monotonic, so a delayed retry of an older event cannot regress a terminal payment.

Configure any number of named gateway accounts in wrnexus.config.ts; keep credentials in environment variables:

const payment = {
  default: "razorpayIndia",
  gateways: {
    razorpayIndia: {
      provider: "razorpay",
      keyId: process.env.RAZORPAY_KEY_ID!,
      keySecret: process.env.RAZORPAY_KEY_SECRET!,
      webhookSecret: process.env.RAZORPAY_WEBHOOK_SECRET ?? "",
    },
    stripeGlobal: {
      provider: "stripe",
      secretKey: process.env.STRIPE_SECRET_KEY!,
      publishableKey: process.env.STRIPE_PUBLISHABLE_KEY!,
      webhookSecret: process.env.STRIPE_WEBHOOK_SECRET!,
    },
  },
} satisfies PaymentConfig;

At runtime, call configurePaymentFromConfig(config.payment, databasePaymentStore()) once. Pass a configured gateway name to initializePayment to override the default for a specific checkout.