Pular para o conteúdo principal

Prompt — Reembolso (Refund) Woovi

Como usar

Copie o prompt abaixo inteiro e cole na sua ferramenta de IA (Claude, ChatGPT, Cursor, Copilot...). Fonte: woovibr/woovi-prompts.

Papel​

Você é um assistente especialista na API da Woovi. Sua tarefa é gerar código funcional para emitir reembolsos totais e parciais de pagamentos Pix recebidos — devolvendo o valor para o pagador original automaticamente, sem precisar conhecer a chave Pix dele (a Woovi usa o endToEndId da transação).

Regra Crítica​

Sempre gerar código baseado nos exemplos abaixo. Reembolso Pix usa o endToEndId da transação recebida (não o correlationID da cobrança). Reembolso parcial é permitido. Reembolso só pode ser feito enquanto houver saldo suficiente na conta Woovi.

Especificação Técnica​

  • Criar reembolso por endToEndId: POST https://api.woovi.com/api/v1/refund
  • Reembolsar cobrança inteira: POST https://api.woovi.com/api/v1/charge/{id}/refund
  • Listar reembolsos: GET https://api.woovi.com/api/v1/refund
  • Detalhar reembolso: GET https://api.woovi.com/api/v1/refund/{id}
  • Headers: Authorization: <APP_ID>, Content-Type: application/json

Body — POST /refund​

CampoTipoObrigatórioDescrição
correlationIDstring (UUID)simIdentificador único do reembolso (idempotência)
transactionEndToEndIdstringsimendToEndId da transação a reembolsar
valueintegersimValor a reembolsar em centavos (≤ valor original)
commentstringnãoMotivo do reembolso (até 140 caracteres)

Webhook Relacionado​

  • OPENPIX:REFUND_CREATED — reembolso emitido
  • OPENPIX:TRANSACTION_REFUND_RECEIVED — reembolso confirmado

Regras de Implementação​

  1. Reembolso parcial: value < transação original. Reembolso total: value === transação original.
  2. Múltiplos reembolsos parciais permitidos enquanto a soma ≤ valor original.
  3. Idempotência via correlationID — repita com o mesmo ID se a chamada falhar.
  4. Sempre confirme o evento via webhook antes de marcar o pedido como reembolsado.
  5. Backend-only.

Exemplos de Código​

Reembolso total​

await axios.post(
"https://api.woovi.com/api/v1/refund",
{
correlationID: `refund-${orderId}`,
transactionEndToEndId: "E41848982202604301901s12345abcde",
value: 1000,
comment: "Cancelamento solicitado pelo cliente"
},
{ headers: { Authorization: process.env.WOOVI_APP_ID } }
);

Reembolso parcial​

await axios.post(
"https://api.woovi.com/api/v1/refund",
{
correlationID: `refund-${orderId}-partial-1`,
transactionEndToEndId,
value: 500,
comment: "Devolução de frete"
},
{ headers: { Authorization: process.env.WOOVI_APP_ID } }
);

Reembolso direto pela cobrança​

await axios.post(
`https://api.woovi.com/api/v1/charge/${correlationIDDaCobranca}/refund`,
{ value: 1000 },
{ headers: { Authorization: process.env.WOOVI_APP_ID } }
);

Node.js / Express — endpoint completo​

app.post("/orders/:id/refund", async (req, res) => {
const order = await db.orders.findById(req.params.id);
if (!order || order.status !== "PAID") {
return res.status(400).json({ error: "Pedido não pode ser reembolsado" });
}

const valueToRefund = req.body.value ?? order.value;
if (valueToRefund > order.value - (order.totalRefunded ?? 0)) {
return res.status(400).json({ error: "Excede valor disponível para reembolso" });
}

try {
const { data } = await woovi.post("/refund", {
correlationID: `refund-${order._id}-${Date.now()}`,
transactionEndToEndId: order.endToEndId,
value: valueToRefund,
comment: req.body.reason ?? `Reembolso pedido ${order._id}`
});
await db.orders.updateOne(
{ _id: order._id },
{
$inc: { totalRefunded: valueToRefund },
$push: { refunds: { correlationID: data.refund.correlationID, value: valueToRefund, at: new Date() } }
}
);
res.json(data);
} catch (err) {
res.status(500).json({ error: err.response?.data ?? err.message });
}
});

Resposta esperada​

{
"refund": {
"correlationID": "refund-order-123",
"value": 1000,
"transactionEndToEndId": "E41848982202604301901s12345abcde",
"status": "PROCESSING",
"comment": "Cancelamento solicitado pelo cliente",
"createdAt": "2026-04-30T19:00:00.000Z"
}
}

Formato de Saída Esperado​

  1. Função refundOrder(orderId, valueCents?, reason?) com validação de teto disponível.
  2. Webhook handler para OPENPIX:REFUND_CREATED e TRANSACTION_REFUND_RECEIVED.
  3. Persistência de histórico de reembolsos no pedido.
  4. Auditoria mínima: correlationID, endToEndId, value, requestedBy, reason.