Introduction#
A SymbolPay é uma gateway de pagamentos PIX B2B. O comerciante cria cobranças a partir do painel autenticado ou via links de pagamento públicos; o pagador paga o QR Code e a confirmação chega por webhook, credita o saldo do comerciante. O repasse é solicitado na página de saques.
Existem dois modos de uso:
- • Painel do comerciante (autenticado por sessão) — criação de cobranças, links, saques e gestão de conta.
- • Checkout público via link
/pay/:slug— o pagador não precisa de conta.
A taxa é fixa: R$ 0,65 por cobrança recebida e R$ 0,65 por saque. O valor mínimo de cobrança e saque é R$ 1,00. A validade padrão é de 30 minutos; no painel, você também pode escolher 1 hora ou 24 horas.
wz_live_ / wz_test_ na aba API do painel. A chave crua é exibida uma única vez e armazenada apenas como hash SHA-256. As funções do gateway (gatewayCreateCharge e gatewayWithdraw) aceitam tanto a sessão do painel quanto o header Authorization: Bearer wz_live_... para acesso programático.Environments#
As chaves de API usam prefixo wz_live_ (produção) ou wz_test_ (teste). Ambas apontam para o mesmo app; o ambiente é definido pelo prefixo da chave.
Cobranças e saques reais, movimentação de dinheiro de verdade.
wz_live_Para desenvolvimento e testes de integração.
wz_test_Authentication#
A SymbolPay usa três modelos de autenticação, um para cada superfície:
- 1. Painel e funções do gateway — sessão do usuário autenticado (login por e-mail/senha ou Google) ou chave de API no header
Authorization: Bearer wz_live_.... As funçõesgatewayCreateChargeegatewayWithdrawaceitam ambos os métodos e validam o status da conta. - 2. Checkout público — sem autenticação do pagador. As funções
getPublicPaymentLinkegatewayCreateChargeFromLinkrodam como serviço e validam apenas o link e o comerciante. - 3. Webhook de entrada — assinado em HMAC-SHA256 (header
x-goatpay-signature).
wz_live_ dá acesso à sua conta. Mantenha-a em variáveis de ambiente do servidor. Se vazar, revogue no painel e gere uma nova.Create charge#
O comerciante autenticado cria uma cobrança PIX no painel (/cobrancas/nova). A função gatewayCreateCharge valida o comerciante, calcula a taxa e devolve o copia e cola + QR Code.
https://wavez.online/functions/gatewayCreateChargeParâmetros do body (JSON)
amountnumber · obrigatório — Valor em reais (mín. R$ 1,00)descriptionstring — Descrição da cobrança (máx. 120 chars)external_referencestring — ID do pedido no seu sistema (máx. 60 chars, volta no webhook)payer_namestring — Nome do pagadorpayer_emailstring — E-mail do pagadorpayer_documentstring — CPF/CNPJ do pagador (só dígitos)fee_payerenum —"merchant"(padrão, taxa descontada do recebimento) ou"client"(cliente paga a taxa)
{
"id": "chg_abc123",
"goatpay_id": "pay_xyz",
"copy_paste": "00020126...",
"qrcode_url": "https://api.goatpay.com.br/qr/pay_xyz.png",
"expires_at": "2026-10-04T20:30:00Z",
"fee_payer": "merchant"
}fee_payer: "merchant" o comerciante recebe amount - R$ 0,65. Com fee_payer: "client" o cliente paga amount + R$ 0,65 e o comerciante recebe o valor integral.Payment links#
Crie um link reutilizável no painel (/links-pagamento) e compartilhe a URL https://wavez.online/pay/:slug por qualquer canal. O pagador abre, preenche os dados e paga — sem login.
Fluxo do checkout público
getPublicPaymentLink— consulta o link pelo slug e devolve nome, valor, descrição e marca do comerciante.gatewayCreateChargeFromLink— valida o link (ativo, não expirado, dentro do limite de usos), cria a cobrança PIX e devolve o QR Code.
max_uses é rejeitado. Há um teto de 50 cobranças pendentes por link para evitar abuso do endpoint público. O limite de usos é reservado na criação da cobrança, incluindo pagamentos que ainda estejam pendentes.Track status#
O status de cada cobrança é atualizado automaticamente pelo webhook de entrada e aparece no painel em /cobrancas. Os status possíveis são:
pendente— cobrança gerada, aguardando pagamentopago— pagamento confirmado e saldo creditadoexpirado— cobrança expirou sem pagamentocancelado— cobrança cancelada
Inbound webhook#
Eventos de pagamento chegam na função goatpayWebhook, que valida a assinatura HMAC-SHA256 no header x-goatpay-signature (formato sha256=...) e processa o evento de forma idempotente.
Eventos processados
payment.paid— marca a cobrança comopagoe credita o saldo do comerciantepayment.pix.expired— marca a cobrança comoexpiradotransfer.completed— marca o saque comopagoe libera o saldo reservadotransfer.failed— rejeita o saque e devolve o valor ao saldo disponível
{
"event": "payment.paid",
"data": { "id": "pay_xyz", "status": "paid" }
}pendente → pago, pendente → expirado). Entregas duplicadas ou concorrentes não reprocessam nem creditam duas vezes — apenas uma chamada vence a transição.Outbound webhook (SYMBOL → you)#
No painel (/webhooks) você cadastra uma URL HTTPS de destino e seleciona os eventos. Um segredo de assinatura é gerado no servidor com entropia criptográfica e exibido uma única vez.
Eventos selecionáveis
charge.paidcharge.expiredcharge.cancelledwithdrawal.paid
x-wavez-signature, formato sha256=...).Cashout and withdrawal#
O comerciante solicita o saque do saldo disponível no painel (/saques). A função gatewayWithdraw reserva o valor de forma atômica, transfere para a chave PIX cadastrada no perfil do comerciante e desconta a taxa fixa de R$ 0,65.
https://wavez.online/functions/gatewayWithdraw{
"id": "wdw_xyz789",
"status": "pendente"
}balance ≥ amount, usando uma operação atômica que move o valor para locked_balance. Isso impede saques duplicados concorrentes. Se a transferência falhar, o valor é devolvido ao saldo disponível.Error codes#
Os erros retornam HTTP apropriado (400, 401, 403, 404, 409, 429, 500, 502) e um objeto JSON com o campo error em português.
| HTTP | Mensagem | Quando |
|---|---|---|
| 401 | Nao autorizado | Sessão inválida ou chave de API inválida |
| 403 | Conta suspensa | Comerciante não está ativo |
| 400 | Valor mínimo para cobrança é R$1,00 | Abaixo do mínimo |
| 400 | Saldo insuficiente para saque | Saldo menor que o valor do saque |
| 400 | Cadastre sua chave Pix para receber o repasse | Sem chave PIX cadastrada |
| 409 | Este slug já está em uso | Slug de link duplicado |
| 429 | Muitas cobranças pendentes para este link | Teto de 50 pendentes por link |
| 401 | Assinatura invalida | Webhook com HMAC inválido |
Security#
- Row-Level Security por comerciante: cobranças, saques, links e chaves só são visíveis para o dono ou administrador.
- Webhook de entrada assinado em HMAC-SHA256 com validação fail-closed (segredo ausente nunca valida).
- Proteção SSRF no cadastro de webhooks: HTTPS obrigatório e bloqueio de hosts internos (localhost, faixas privadas, link-local).
- Reserva atômica de saldo nos saques e idempotência nas transições de status evitam duplo crédito e saques duplicados.
- Chaves de API com hash SHA-256: só o prefixo e o hash são armazenados; a chave crua é exibida uma única vez.
- Slug de link único validado no servidor para evitar desvio de cobranças públicas para outro comerciante.
Service status#
Acompanhe a disponibilidade dos serviços da SymbolPay em tempo real na página pública de status.
Access status page