Criar um cliente e cobrar no PIX
Nesta recipe
- Aponte para o sandbox
- Cadastre o cliente
- Crie a cobrança PIX
- Use o id e o uuid
Checkout embutido (ninepay.js)
Coloque o pagamento de uma fatura dentro da sua página, com o seu botão de pagar e o iframe da NinePay para cartão, PIX e boleto.
6 passos
Abrir recipe: Checkout embutido (ninepay.js)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.
4 passos
Abrir recipe: Cobrança no cartão de créditoCriar um cliente e cobrar no PIX
Cadastre o cliente com POST /customers e gere uma cobrança PIX para ele com POST /payments.
4 passos
Abrir recipe: Criar um cliente e cobrar no PIXCriar plano e assinatura recorrente
Crie um plano mensal, assine um cliente nele e mande o cliente para o checkout ativar a assinatura.
3 passos
Abrir recipe: Criar plano e assinatura recorrenteEstornar um pagamento
Devolva ao cliente um pagamento pago no cartão ou no PIX e acompanhe o reembolso até ser concluído.
3 passos
Abrir recipe: Estornar um pagamentoReceber e validar webhooks
Receba os eventos da NinePay, responda rápido, valide a assinatura, ignore entregas repetidas e confirme o pagamento na API antes de liberar o acesso.
6 passos
Abrir recipe: Receber e validar webhooks
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.
Pressione Enter para destacar o código deste passo1. Gere uma encryption key
POST /encryption_keysrecebe o seumerchant_ide devolve uma chave pública RSA (public_key) e oiddela. 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.
2. Encripte o cartão
Monte o JSON do cartão, encripte com a
public_keyusando padding PKCS1, converta para base64 e junte com oidda 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.
3. Cobre no cartão
Envie
method: "credit", ocard_hashe, 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.4. Confira o status
paidquer dizer aprovado.unauthorizedquer dizer recusado: o pagamento continua em aberto e pode ser pago de novo. Para liberar o acesso, prefira o webhookpayment.approved, confirmando com esta mesma consulta.
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)