Fluxo de pagamento — Casos extremos
Nem todo pagamento segue o caminho feliz. Esta página cobre resultados não padrão — pagamento insuficiente, pagamento em excesso, expiração, transações on-chain falhas e reembolsos — incluindo o que a Fluxis faz internamente, quais webhooks você recebe e como tratar cada cenário na sua integração.
Visão geral
Code
| Scenario | Final status | Internal transaction | Webhook sent |
|---|---|---|---|
| Exact payment | completed → confirmed | Yes | processing, completed |
| Underpayment | underpaid | No | processing, underpaid |
| Overpayment | overpaid → confirmed | Yes (full received amount) | processing, overpaid |
| No payment in time | expired | No | No |
| On-chain tx reverts / fails | processing (stuck) | No | processing only |
Matriz de entrega de webhooks
A Fluxis envia webhooks em nível de conta apenas para estas mudanças de status de solicitação de pagamento:
| Status | Webhook delivered | Typical trigger |
|---|---|---|
processing | Yes | Cron detectou transferência on-chain (salto 1) |
completed | Yes | Confirmado após finalidade; valor corresponde (salto 2) |
underpaid | Yes | Confirmado após finalidade; valor muito baixo (salto 2) |
overpaid | Yes | Confirmado após finalidade; valor muito alto (salto 2) |
confirmed | No | Transação interna de ledger criada (salto 3) |
expired | No | Cron de expiração marca solicitação como expirada |
failed | No | Não definido atualmente pelo worker |
pending / created | No | Criação inicial — consulte ou use seu próprio estado de UI |
Consulte status sem webhooks
Use GET /v1/pos/{posID}/payment-request/{paymentRequestID} para detectar status expired e confirmed. Registre webhooks em POST /v1/account/{accountID}/webhook — consulte Webhooks.
Underpaid
Um pagamento underpaid ocorre quando o cliente envia menos que o valor esperado e a transação on-chain é confirmada após a finalidade.
O que a Fluxis faz
Code
- O salto 2 compara
ReceivedAmount(da detecção do cron) comExpectedAmount - Status é definido como
underpaid - Um webhook é enviado com status
underpaid - O vault é liberado e removido do cache Redis
- Salto 3 é ignorado — nenhum registro interno de
Transactioné criado, status não atingeconfirmed
Sem transação de ledger para underpaid
Como o salto 3 executa apenas para status completed e overpaid, pagamentos underpaid permanecem fora do pipeline padrão de liquidação. Coordene a resolução com o suporte Fluxis ou inicie um reembolso se devolver fundos ao cliente.
Tratamento do comerciante
| Action | Recommendation |
|---|---|
| Do not fulfill the order automatically | Trate underpaid como pagamento parcial que exige revisão manual |
| Contact the customer | Solicite o saldo restante ou acorde cumprimento parcial |
| Create a new payment request | Para a diferença pendente, se o cliente concordar em pagar mais |
| Request a refund | Use a Refunds API para devolver o valor parcial à wallet do cliente |
Status elegíveis para reembolso incluem underpaid. Consulte Refunds API abaixo.
Overpaid
Um pagamento overpaid ocorre quando o cliente envia mais que o valor esperado.
O que a Fluxis faz
Code
- O salto 2 define status como
overpaide registra o valor recebido integral - Um webhook é enviado com status
overpaid - O salto 3 cria uma Transaction interna pelo valor recebido integral
- Status transiciona para
confirmed(sem webhook adicional)
Tratamento do comerciante
| Action | Recommendation |
|---|---|
| Fulfill the order for the requested amount | O cliente pagou pelo menos o preço esperado |
| Refund the excess | Use POST /v1/refunds/payment-request/{paymentRequestID} com amount explícito para a porção overpaid |
| Contact support | Para casos complexos onde reembolso automático é insuficiente |
Quando amount é omitido em solicitação de reembolso para pagamento overpaid, a Fluxis reembolsa por padrão a porção overpaid (recebido menos esperado).
Expired
Uma solicitação de pagamento expira quando nenhum pagamento on-chain é detectado antes do timestamp de expiração.
Temporização
| Setting | Value | Scope |
|---|---|---|
| Payment request expiration | 8 minutos | Desde atribuição de vault (status created) |
| Payment intention expiration | 5 minutos | Apenas fluxo PoS caixa, antes de criar PR |
| Expiration check interval | Every 30 seconds | Job cron em segundo plano |
O que a Fluxis faz
Code
- O cron de expiração encontra solicitações com
status = createdeexpiration < now - Atualiza status para
expired - Nenhum webhook é enviado por expiração
- O vault não é liberado imediatamente — é reciclado quando o pool de vaults o reatribui (lógica de sobrescrita de vault expirado)
Período de graça para pagamentos tardios
Transações transmitidas logo antes da expiração ainda podem ser detectadas se o endereço vault permanecer no cache Redis (TTL = expiração + 60 segundos). Não assuma que expired significa que o cliente não pode pagar — verifique webhooks processing tardios ou consulte o endpoint de status.
Tratamento do comerciante
| Action | Recommendation |
|---|---|
| Show expiration in UI | Exiba contagem regressiva baseada no campo expiration da resposta de criação |
| Create a new payment request | Recuperação padrão — cada solicitação é de uso único |
| Poll for late payments | Se o cliente afirma ter pago, verifique status antes de criar solicitação duplicada |
Consulte Payment Requests — Timing para detalhes.
Transação falha presa em processing
Quando uma transação on-chain falha ou reverte após ser detectada, o worker registra a falha mas não atualiza o status da solicitação de pagamento.
O que a Fluxis faz
No salto 2 (transaction_check_update_payment_request), quando GetTransaction retorna status failed:
- O worker registra
"Blockchain Transaction Failed" - Retorna sem atualizar a solicitação de pagamento
- A solicitação de pagamento permanece em
processingindefinidamente - Nenhum webhook adicional é enviado além da notificação inicial
processing
Code
Comportamento conhecido
Este é o comportamento atual da plataforma. Se uma solicitação está presa em processing e a transação on-chain falhou, entre em contato com [email protected] para resolução manual. Consulte GET /v1/pos/{posID}/payment-request/{paymentRequestID} e verifique o hash da transação em um block explorer.
Tratamento do comerciante
| Action | Recommendation |
|---|---|
| Verify on-chain | Busque o hash da transação (se disponível) em um block explorer |
| Do not fulfill | Status processing preso não garante pagamento |
| Contact support | Forneça o ID da solicitação de pagamento e hash da transação |
| Create a new payment request | Se a transação original falhou definitivamente |
Refunds API
A Fluxis fornece uma Refunds API para iniciar reembolsos de solicitações de pagamento elegíveis. Reembolsos são criados no nível da API e disparam notificação webhook — a execução on-chain do reembolso ainda não está automatizada.
Status elegíveis
Reembolsos podem ser criados quando a solicitação de pagamento está em um de:
completedconfirmedoverpaidunderpaid
Criar um reembolso
Code
Code
| Field | Required | Description |
|---|---|---|
refund_to_address | Yes | Endereço wallet do cliente para receber o reembolso |
amount | No | Valor a reembolsar. Se omitido: valor integral para completed/confirmed, porção overpaid para overpaid |
reason | No | Motivo em texto livre para auditoria |
Exemplo de resposta:
Code
Verificar status do reembolso
Code
Webhook de reembolso
Ao criar um reembolso, a Fluxis envia webhook com notification_type: refund_status_update:
Code
Execução on-chain pendente
A Refunds API cria registro processing e envia webhook. O processamento on-chain do reembolso está planejado, mas ainda não automatizado. Trate registros de reembolso como intenção até refund_transaction_hash ser preenchido em GET /v1/refunds/{refundID}.
Cenários comuns de reembolso
| Scenario | Suggested approach |
|---|---|
| Overpaid | Omita amount para reembolsar o excesso, ou especifique a porção overpaid exata |
| Underpaid — return partial payment | Especifique amount igual ao valor recebido (parcial) |
| Completed — full refund | Omita amount para reembolsar o pagamento integral |
| Customer provided wrong address | Entre em contato com suporte se o endereço de reembolso precisar correção após envio |
Checklist de integração para casos extremos
Use este checklist ao construir integrações de produção:
Code
- Trate os quatro status webhook —
processing,completed,underpaid,overpaid - Nunca cumpra em
processing— aguarde um resultado terminal de valor - Consulte
expiredeconfirmed— estes não disparam webhooks - Exiba contagem regressiva de 8 minutos — reduza tickets de suporte por expiração
- Verifique assinaturas webhook — consulte Webhook Signature Verification
- Use a Refunds API para resolução overpaid/underpaid quando apropriado
- Monitore
processingpreso — verifique block explorer se status não progride
Documentação relacionada
- Payment Flow — Happy Path — Fluxo padrão criar → detectar → confirmar
- Payment Requests — Definições de status e exemplos de API
- Creating Payment Requests — Guia de integração
- Webhooks — Registro e formato de payload
- Webhook Signature Verification — Verificação HMAC e fluxo de teste
- FAQ — Payment Monitoring — Perguntas frequentes
- API Reference — Refunds — Documentação interativa de endpoints