O reembolso é contra o pagamento, não contra a fatura
Uma fatura pode ter várias tentativas de cobrança e só uma pegou o dinheiro. É essa que você estorna.confirmed pode ser estornado, e de onde o dinheiro sai
depende do seu modelo de coleta. Em BYOP o estorno roda na conta do provedor
que você conectou: é o seu dinheiro voltando da sua conta. Em Infi Managed a
cobrança foi recebida na nossa estrutura, então o estorno sai de lá e é
descontado do seu repasse — inclusive de repasses futuros, se o valor já tiver
sido repassado.
Total ou parcial: é o valor que decide o acesso
Omitiramount estorna tudo. E aqui está a regra que importa:
A lógica é essa: um estorno total desfaz a venda, então a capacidade que a venda
criou tem que morrer com ela. Um estorno parcial não desfaz a venda — R100 é cortesia, não cancelamento — e cortar o arquivo ali
puniria justamente o cliente que você acabou de tentar agradar.
Um valor acima do total é tratado como total, não recusado.
Quando você quer o contrário
revokeAccess: false é a política de muito infoproduto: brigar custa mais que o
arquivo. Não mande o campo se você não quer sobrescrever — a derivação acima
é o comportamento certo em quase todo caso.
O que o comprador vê depois
O link antigo dele responde410 Gone, com error_code e message no
corpo da resposta:
revokedAt e continua na lista:
Ler o que você estornou
status só vira refunded quando o valor inteiro voltou. Um estorno parcial
deixa o pagamento confirmed, e quem diz quanto voltou é refundedAmount.
"5" e "5.00"
representam o mesmo valor. Não compare o texto bruto para decidir quanto voltou.
refunds() retorna os registros individuais, com valor, data e identificador.
O campo reason é opcional no retorno.
A fatura continua paid
De propósito. A fatura registra que foi paga, porque foi — e contabilidade
não apaga fato, ela lança o contrário dele. O estorno é um registro próprio, com
seu lançamento reverso no ledger.
Consequência prática: se você somar faturas paid pro seu relatório de vendas,
uma venda estornada entra inteira. Subtraia refundedAmount dos pagamentos.
Webhook
O estorno emitepayment.refunded, com accessRevoked dizendo se o download
caiu:
accessRevoked está aí porque o seu sistema quase sempre tem acesso próprio pra
cortar — assinatura, feature flag, cargo no Discord. Assine em
webhooks.
Chargeback é a mesma mecânica, sem você
Quando o comprador contesta no banco, o provedor mandaPAYMENT_REFUNDED ou o
evento de chargeback e o mesmo caminho roda: pagamento vira charged_back,
lançamento reverso, e o acesso cai — a rede leva o valor inteiro, então a
derivação por valor revoga. Você não precisa fazer nada, e não tem como impedir.
O evento emitido é payment.chargeback.
Estornar duas vezes é seguro. O caminho de reversão só age sobre um pagamento
confirmed. Um webhook repetido
do provedor, ou um retry seu, não lança no ledger de novo nem reescreve quando o
acesso caiu — e a data da revogação é preservada, porque é dela que uma disputa
depende.