Prompt — Integração Pix via Cobrança (Charge) 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 criar uma cobrança Pix dinâmica usando o endpoint POST /api/v1/charge, consultar o status da cobrança e exibir o QR Code / link de pagamento ao usuário final.
Regra Crítica
Sempre gerar código baseado nos exemplos abaixo. Nunca inventar estrutura diferente, nunca alterar nomes de campos, nunca chamar a API a partir do frontend.
Especificação Técnica
- Endpoint criação:
POST https://api.woovi.com/api/v1/charge - Endpoint consulta:
GET https://api.woovi.com/api/v1/charge/{id} - Endpoint listagem:
GET https://api.woovi.com/api/v1/charge - Endpoint exclusão:
DELETE https://api.woovi.com/api/v1/charge/{id} - Headers obrigatórios:
Authorization: <APP_ID>(App ID gerado no painel Woovi → Aplicações)Content-Type: application/json
Estrutura do Body (Criação)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
correlationID | string (UUID) | sim | Identificador único da cobrança no seu sistema |
value | integer | sim | Valor em centavos (ex.: R$ 10,00 = 1000) |
comment | string | não | Descrição exibida no comprovante (até 140 caracteres) |
customer | object | não | Dados do pagador (name, taxID, email, phone) |
expiresIn | integer | não | Tempo de expiração em segundos |
additionalInfo | array | não | Informações extras [ { key, value } ] |
daysForDueDate | integer | não | Dias para vencimento (cobrança com vencimento) |
daysAfterDueDate | integer | não | Tolerância em dias após o vencimento |
interests | object | não | Juros configurados |
fines | object | não | Multa configurada |
discountSettings | object | não | Desconto configurado |
subaccount | string (pixKey) | não | Direciona o valor para uma subconta |
splits | array | não | Divisão entre subcontas [ { pixKey, value, splitType } ] |
Status Possíveis
ACTIVE— aguardando pagamentoCOMPLETED— pagamento confirmadoEXPIRED— expirou sem pagamento
Regras de Implementação
- Valores sempre em centavos (inteiros).
correlationIDdeve ser único por cobrança (use UUID v4).- App ID nunca pode ir para o frontend — todas as chamadas à Woovi devem ser feitas no backend.
- Tratar erros com try/catch e retornar JSON.
- Para confirmar pagamento use webhooks (
OPENPIX:CHARGE_COMPLETED) e, opcionalmente, polling de 10 em 10 segundos como fallback. - Use o campo
paymentLinkUrlpara redirecionar o pagador ao checkout Woovi, ou exiba oqrCodeImage(base64) e obrCode(copia e cola) diretamente no seu app.
Exemplos de Código
Vanilla JavaScript (fetch)
const response = await fetch("https://api.woovi.com/api/v1/charge", {
method: "POST",
headers: {
"Authorization": process.env.WOOVI_APP_ID,
"Content-Type": "application/json"
},
body: JSON.stringify({
correlationID: crypto.randomUUID(),
value: 1000,
comment: "Pedido #123",
customer: {
name: "João da Silva",
taxID: "31324227036",
phone: "5511999999999"
}
})
});
const data = await response.json();
console.log(data.charge.brCode); // copia e cola
console.log(data.charge.qrCodeImage); // QR Code em base64
console.log(data.charge.paymentLinkUrl); // checkout Woovi
Axios
import axios from "axios";
const { data } = await axios.post(
"https://api.woovi.com/api/v1/charge",
{
correlationID: crypto.randomUUID(),
value: 1000,
comment: "Pedido #123"
},
{
headers: {
Authorization: process.env.WOOVI_APP_ID,
"Content-Type": "application/json"
}
}
);
Node.js / Express (criação + consulta)
import express from "express";
import axios from "axios";
import { randomUUID } from "crypto";
const app = express();
app.use(express.json());
const woovi = axios.create({
baseURL: "https://api.woovi.com/api/v1",
headers: { Authorization: process.env.WOOVI_APP_ID }
});
app.post("/charge", async (req, res) => {
try {
const { value, comment, customer } = req.body;
const { data } = await woovi.post("/charge", {
correlationID: randomUUID(),
value,
comment,
customer
});
res.json(data);
} catch (err) {
res.status(500).json({ error: err.response?.data ?? err.message });
}
});
app.get("/charge/:id", async (req, res) => {
try {
const { data } = await woovi.get(`/charge/${req.params.id}`);
res.json(data);
} catch (err) {
res.status(500).json({ error: err.response?.data ?? err.message });
}
});
app.listen(3000);
Resposta esperada da API (criação)
{
"charge": {
"correlationID": "9134e286-6f71-427a-bf00-241681624586",
"value": 1000,
"comment": "Pedido #123",
"status": "ACTIVE",
"brCode": "00020101021226...520400005303986540510.005802BR5925...6304XXXX",
"qrCodeImage": "data:image/png;base64,iVBORw0KGgo...",
"paymentLinkUrl": "https://woovi.com/pay/9134e286-6f71-427a-bf00-241681624586",
"expiresDate": "2026-04-30T20:00:00.000Z",
"createdAt": "2026-04-30T19:00:00.000Z"
}
}
Formato de Saída Esperado
- Breve explicação do fluxo.
- Código backend funcional (criação + consulta).
- Exemplo de payload e exemplo de resposta.
- Checklist mínimo:
App ID em env,webhook configurado,valores em centavos,correlationID único.