Ejemplos de código

Snippets en JavaScript para los casos de uso más comunes. Copiá, pegá y adaptá a tu stack.

#

Crear un cobro

crear-cobro.js
// POST /integration/payment-request
// Base URL: https://integration-api.chytapay.com.ar

const response = await fetch(baseUrl + '/integration/payment-request', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer ' + idToken,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    referenceId: 'factura-2026-03-001',
    description: 'Cuota marzo 2026',
    amount: 25000,
    dueDates: ['2026-03-10', '2026-03-20'],
    customer: {
      name: 'Juan García',
      email: '[email protected]',
      phoneNumber: { countryCode: '+54', number: '1112345678' },
    },
    sendEmailNotification: true,
    sendWhatsappNotification: true,
  }),
});

const data = await response.json();
// data.CVU → CVU único para este cobro
// data.calculatedAmounts → montos por vencimiento
#

Recibir el webhook

webhook.js
// Tu endpoint recibe POST cuando el cliente paga
// Validar el token antes de procesar

app.post('/webhook/chytapay', (req, res) => {
  const validationToken = req.headers['validation-token'];

  if (validationToken !== ({}).CHYTAPAY_TOKEN) {
    return res.status(401).json({ error: 'Unauthorized' });
  }

  const {
    referenceId,      // tu ID interno
    requestedAmount,  // monto original
    paidAmount,       // monto pagado
    remainingAmount,  // saldo pendiente
    stateType,        // 'total_payment' | 'partial_payment'
    activeDueDate,    // fecha de vencimiento activa
    activeDueDateIndex,
    totalDueDates,
  } = req.body;

  // Actualizar estado en tu base de datos
  await updatePaymentStatus(referenceId, {
    paid: paidAmount,
    remaining: remainingAmount,
    status: stateType,
  });

  res.status(200).json({ received: true });
});
#

Consultar cobros

consultar.js
// GET por referenceId
const response = await fetch(
  baseUrl + '/integration/payment-request/' + referenceId,
  {
    headers: {
      'Authorization': 'Bearer ' + idToken,
    },
  }
);

const data = await response.json();
// data.stateType, data.paidAmount, data.customer...

// GET listado con filtros
const list = await fetch(
  baseUrl + '/integration/payment-request' +
  '?startDate=2026-03-01&endDate=2026-03-31',
  { headers: { 'Authorization': 'Bearer ' + idToken } }
);
#

Flujo OAuth2

oauth2.js
// Paso 1: Redirigir al usuario a Chytapay
// Test: https://auth-api.test.chytapay.com.ar
// Prod: https://auth-api.chytapay.com.ar
const authUrl = 'https://auth-api.chytapay.com.ar/integration/oauth2/authorize?' +
  'response_type=code' +
  '&clientId=' + CLIENT_ID +
  '&redirectUri=' + encodeURIComponent(REDIRECT_URI) +
  '&scope=openid profile' +
  '&state=' + generateRandomState();

window.location.href = authUrl;

// Paso 2: Recibir el código en tu callback
// GET /tu-app/callback?code=xxx&state=yyy
const { code, state } = getQueryParams();
validateState(state); // prevenir CSRF

// Paso 3: Intercambiar código por tokens
const tokenResponse = await fetch(
  'https://auth-api.chytapay.com.ar/integration/oauth2/token',
  {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      code,
      clientId: CLIENT_ID,
      clientSecret: CLIENT_SECRET,
      redirectUri: REDIRECT_URI,
    }),
  }
);

const { idToken, refreshToken, expiresIn } = await tokenResponse.json();