Integrar o Yappy em um comércio panamenho envolve mais do que colocar um botão de pagamento. É preciso um fluxo claro, valor assinado no servidor, estados que sobrevivam a interrupções do usuário e um backend capaz de explicar por que um pedido foi pago ou não.
Este artigo descreve o padrão backend-first com Laravel e, quando o front é WordPress ou WooCommerce, mantém o CMS como vitrine e checkout visual, movendo a lógica sensível para fora do tema. Aplica-se a integrações com Yappy, BAC Credomatic, Paguelo Fácil e gateways unificados.
O que é o Yappy na prática
Yappy (Banco General) é uma forma de cobrança muito usada no Panamá. Em integrações comerciais típicas:
- Cadastro do comércio e credenciais (
merchantId/ secret) no portal comercial. - Geração de uma URL ou intenção de pagamento a partir do servidor.
- O usuário conclui o pagamento no fluxo do Yappy (app / redirect).
- O sistema recebe o resultado por redirect + notificação no endpoint e atualiza o pedido.
Regra de ouro: o pagamento nasce no backend
Antes de exibir o botão no front, o servidor deve:
- Criar ou recuperar o pedido com itens, moeda e impostos.
- Calcular o total no servidor (nunca confiar no JSON do navegador).
- Salvar um registro de pagamento em estado
pendingcomorder_idinterno. - Solicitar ao Yappy a URL / token de pagamento com esses valores.
- Redirecionar ou devolver ao front apenas o necessário para continuar.
WordPress / WooCommerce sem sujar o tema
Em sites WordPress com Elementor, temas personalizados ou WooCommerce, os secrets não devem ficar em functions.php nem em snippets do page builder.
Padrão recomendado:
- WooCommerce cria o pedido local.
- Um endpoint ou plugin fino chama a API Laravel (gateway).
- Laravel conversa com Yappy / BAC / Paguelo Fácil.
- WordPress reflete o estado quando o backend confirma.
Implementação em Laravel
- Modelos
Order+Paymentcom estados normalizados. - Serviço
PaymentGatewaycom adapters atrás de uma interface. - Endpoint protegido para iniciar pagamento: valida carrinho, calcula total, persiste
pending. - Endpoint de callback/IPN: verifica assinatura, é idempotente, despacha job de conciliação.
- Página de retorno que consulta o estado no DB; não marca
paidpor query string. - Fila para retentativas quando o banco notifica tarde.
- Secrets apenas no env do host (Coolify: variáveis do serviço, não
.envno Git).
Estados normalizados
| Estado interno | Significado |
|---|---|
pending | Intenção criada; sem confirmação confiável |
paid | Cobrança confirmada por callback/validação de assinatura |
rejected | Rejeitado pelo provedor |
cancelled | O usuário abortou |
expired | Timeout operacional |
Checklist técnico
- Credenciais apenas em variáveis de ambiente.
- Sandbox vs produção separados.
- Idempotência: o mesmo
order_idnão cria duas cobranças. - Persistir payload para auditoria.
- Validar o que o provedor envia de volta.
- Jobs para retentativas de conciliação.
- Logs sem secrets nem dados de cartão.
- Página de resultado que consulta o backend.
- Healthcheck e workers ativos no deploy.
- Runbook de rotação de secrets e reprocessamento de IPN.
Erros frequentes em produção
- Confirmar venda só porque o usuário chegou em
/pago-exitoso. - Deixar o secret em um plugin WordPress versionado no Git.
- Misturar lógica de Yappy, BAC e Paguelo Fácil em um único
ifgigante. - Esquecer o caso "usuário pagou e fechou o app" sem callback.
- Deploy com
lateste secrets embutidos na imagem Docker.
A integração conecta com Docker, CI/CD e Coolify, auditoria de segurança e pagamentos online .