Skip to content

Primeros pasos

Lo que necesitas: Node.js ≥ 18, Deno ≥ 1.38, Bun ≥ 1.0, o cualquier entorno que soporte fetch nativo y Web Crypto API (Cloudflare Workers, Vercel Edge, etc.)

Instalación

Ejecuta este comando en tu terminal:

bash
npm install @rodmarzavala/recurrente-sdk
# o si usas pnpm
pnpm add @rodmarzavala/recurrente-sdk
# o yarn
yarn add @rodmarzavala/recurrente-sdk

Tu primera petición

1. Conseguir tus llaves (API keys)

Entra a app.recurrente.comConfiguración → API Keys.

Ahí vas a toparte con dos tipos de llaves:

Tipo de LlaveEmpieza con¿Para qué sirve?
Públicapk_live_ / pk_test_Para crear checkouts (segura para usar en el frontend)
Secretask_live_ / sk_test_Para todo lo demás (Ojo: ¡solo úsala en tu backend!)

⚠️ Precaución: Nunca vayas a quemar (hardcodear) tu llave secreta en el código del cliente o en un repo público de GitHub.

2. Instanciar el cliente

En tu código, solo necesitas llamarlo así:

typescript
import { Recurrente } from "@rodmarzavala/recurrente-sdk";

const recurrente = new Recurrente({
  publicKey: process.env.RECURRENTE_PUBLIC_KEY!,
  secretKey: process.env.RECURRENTE_SECRET_KEY!,
});
typescript
const checkout = await recurrente.checkouts.create({
  items: [
    {
      name: "Plan Pro",
      amount_in_cents: 29900, // Q299.00 (siempre va en centavos)
      currency: "GTQ",
      quantity: 1,
    },
  ],
  success_url: "https://tudominio.com/gracias",
  cancel_url: "https://tudominio.com/precios",
});

// Aquí rediriges a tu cliente para que pague
console.log(checkout.checkout_url);

4. Verificar webhooks de forma segura

typescript
import { RecurrenteWebhooks } from "@rodmarzavala/recurrente-sdk";

// Express / Hono / Next.js — usa el body CRUDO (como string)
app.post("/webhooks/recurrente", async (req, res) => {
  const isValid = await RecurrenteWebhooks.verifySignature(
    req.rawBody,                        // string crudo, NO el JSON parseado
    {
      "svix-id":        req.headers["svix-id"],
      "svix-timestamp": req.headers["svix-timestamp"],
      "svix-signature": req.headers["svix-signature"],
    },
    process.env.RECURRENTE_WEBHOOK_SECRET!, // empieza con whsec_...
  );

  if (!isValid) return res.status(401).send("No autorizado");

  const event = req.body;
  console.log(event.event_type); // "payment_intent.succeeded"

  res.status(200).send("OK");
});

Variables de Entorno

La mejor práctica es crear un archivo .env (¡y asegurarte de que no se vaya en el commit!):

bash
# .env
RECURRENTE_PUBLIC_KEY=pk_live_...
RECURRENTE_SECRET_KEY=sk_live_...
RECURRENTE_WEBHOOK_SECRET=whsec_...

Asegúrate de agregarlo a tu .gitignore:

bash
echo ".env" >> .gitignore

Sandbox vs Producción

La URL de la API es exactamente la misma para pruebas que para el mundo real. Lo único que le dice a Recurrente en qué modo estás, es el prefijo de tus llaves:

Prefijo de la llaveModo¿Dinero real?¿Manda webhooks?
pk_test_ / sk_test_Sandbox (Pruebas)❌ No❌ No
pk_live_ / sk_live_Producción✅ Sí✅ Sí

Tarjeta de prueba para que no gastes tu saldo: 4242 4242 4242 4242 (cualquier fecha futura y cualquier CVV).


¿Qué sigue?

Publicado bajo la Licencia MIT.