SDK TypeScript / Node.js

SDK oficial do Hubpay para TypeScript e Node.js. Funciona em Node.js 18+, Edge Runtime e Deno.

Instalação

bash
pnpm add @hubpay/sdk
# ou
npm install @hubpay/sdk
# ou
yarn add @hubpay/sdk

Configuração

typescript
import { Hubpay } from '@hubpay/sdk';

const hubpay = new Hubpay({
  apiKey: process.env.HUBPAY_API_KEY!, // hpx_test_... ou hpx_live_...
  baseUrl: 'https://api.hubpay.dev',   // opcional — default já configurado
});

Criar cobrança

typescript
const charge = await hubpay.charges.create({
  amount: 5000,          // R$ 50,00 em centavos
  provider: 'asaas',     // 'asaas' | 'mercadopago'
  description: 'Pedido #1234',
  payer: {
    name: 'João Silva',
    document: '12345678901',
    email: 'joao@exemplo.com',
  },
  metadata: { order_id: '1234' },
});

console.log(charge.id);              // 'chg_...'
console.log(charge.pix.copy_paste);  // '000201265800...'
console.log(charge.status);          // 'pending'

Buscar cobrança

typescript
const charge = await hubpay.charges.get('chg_abc123');
console.log(charge.status); // 'pending' | 'paid' | 'expired' | 'cancelled'

Cancelar cobrança

typescript
const charge = await hubpay.charges.cancel('chg_abc123');
console.log(charge.status); // 'cancelled'

Tratar erros

typescript
import { Hubpay, HubpayApiError } from '@hubpay/sdk';

try {
  const charge = await hubpay.charges.create({ ... });
} catch (err) {
  if (err instanceof HubpayApiError) {
    console.error(err.status);        // 400, 401, 403, etc.
    console.error(err.error.type);    // 'invalid_request', 'unauthorized', etc.
    console.error(err.error.message); // Descrição legível
  }
}

Verificar webhook

typescript
// Next.js App Router
export async function POST(req: Request) {
  const body = await req.text();
  const signature = req.headers.get('x-hubpay-signature') ?? '';

  const verifier = hubpay.webhooks(process.env.HUBPAY_WEBHOOK_SECRET!);

  if (!verifier.verify(body, signature)) {
    return new Response('Invalid signature', { status: 401 });
  }

  const event = JSON.parse(body);

  if (event.type === 'charge.paid') {
    const { id, amount, metadata } = event.data;
    await fulfillOrder(metadata.order_id, { chargeId: id, amount });
  }

  return new Response('ok');
}

Idempotência

typescript
const charge = await hubpay.charges.create(
  { amount: 5000, provider: 'asaas' },
  { idempotencyKey: crypto.randomUUID() }, // evita cobranças duplicadas
);