---
agentTools:
  projectIndex: https://docs.ninepay.com.br/llms.txt
  projectSearch: https://docs.ninepay.com.br/agentSearch?query=term1%20term2
---

# Cobrança no cartão de crédito

Gere um card hash com um cartão de teste do sandbox, cobre no cartão em parcelas e confira o status.

## Gere uma encryption key

> Linhas destacadas: 5-11

`POST /encryption_keys` recebe o seu `merchant_id` e devolve uma chave pública RSA (`public_key`) e o `id` dela. Cada chave serve para um cartão só.

> 🚧 Em produção, isto roda no front-end
> Os passos 1 e 2 estão em Node só para testar no sandbox com um cartão de teste. Com cartões de verdade, gere o hash no navegador ou no app: os dados do cartão nunca devem passar pelo seu back-end. Veja [Hash de cartões](/docs/introducao-api#hash-de-cartoes).

## Encripte o cartão

> Linhas destacadas: 13-24

Monte o JSON do cartão, encripte com a `public_key` usando padding PKCS1, converta para base64 e junte com o `id` da chave: `id_base64`. O hash vale uma vez e por até 30 minutos.

No sandbox, o último dígito do cartão decide o resultado: final **0** aprova, finais **1 a 9** recusam. Use validade futura e qualquer CVV de 3 dígitos. Veja os [cartões de teste](/docs/test-cards).

## Cobre no cartão

> Linhas destacadas: 26-42

Envie `method: "credit"`, o `card_hash` e, se quiser, `installments` (de 1 a 12). O cliente precisa ter CPF ou CNPJ, telefone, CEP e número do endereço no cadastro; sem eles, a cobrança é recusada.

## Confira o status

> Linhas destacadas: 44-49

`paid` quer dizer aprovado. `unauthorized` quer dizer recusado: o pagamento continua em aberto e pode ser pago de novo. Para liberar o acesso, prefira o webhook `payment.approved`, confirmando com esta mesma consulta.

## Código

```js Node.js
import { publicEncrypt, constants } from 'node:crypto';

const BASE_URL = 'https://api.sandbox.cefispay.com.br/api/v1';

// 1. Gere uma encryption key (não usa o token da API)
const keyRes = await fetch(`${BASE_URL}/encryption_keys`, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ merchant_id: process.env.NINEPAY_MERCHANT_ID }),
});
const key = await keyRes.json();

// 2. Encripte o cartão de teste (final 0 = aprovado no sandbox)
const card = JSON.stringify({
  card_number: '5358732681618240',
  card_holder_name: 'Maria Souza',
  card_expiration_date: '05/2030',
  card_cvv: '123',
});
const encrypted = publicEncrypt(
  { key: key.public_key, padding: constants.RSA_PKCS1_PADDING },
  Buffer.from(card),
).toString('base64');
const cardHash = `${key.id}_${encrypted}`;

// 3. Cobre no cartão com o card hash
const paymentRes = await fetch(`${BASE_URL}/payments`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.NINEPAY_TOKEN}`,
    'Content-Type': 'application/json',
    Accept: 'application/json',
  },
  body: JSON.stringify({
    method: 'credit',
    customer: { id: 315968 },
    value: 15000, // R$ 150,00
    installments: 3,
    card_hash: cardHash,
  }),
});
const { payment } = await paymentRes.json();

// 4. Confira o resultado
const detailsRes = await fetch(`${BASE_URL}/payments/${payment.id}`, {
  headers: { Authorization: `Bearer ${process.env.NINEPAY_TOKEN}`, Accept: 'application/json' },
});
const { data } = await detailsRes.json();
console.log(data.status); // 'paid' (aprovado) ou 'unauthorized' (recusado)
```
