(07) Receber pagamentos
Estornos
Devolver todo ou parte de um pagamento, e o que acontece ao saldo.
Estornar um pagamento
Um estorno devolve ao comprador todo ou parte de um pagamento confirmado. Pede-se pela API, com o payment_id que veio no payment.succeeded (ou no payment da sessão), ou no painel, em Estornos.
curl -s "$SPOLLY_API_URL/v1/refunds" \
-H "Authorization: Bearer $SPOLLY_SECRET_KEY" \
-H "Idempotency-Key: estorno-1042-1" \
-H "Content-Type: application/json" \
-d '{"payment_id": "pay_...", "amount": 500000, "reason": "Devolução parcial a pedido do cliente."}'{
"id": "re_7Tq3Mn5Wx9Yz2Ab4Cd6Ef8",
"object": "refund",
"payment_id": "pay_9Hq2Lm4Rt8Vx1Zb6Nc3Kd0",
"amount": {"amount": 500000, "currency": "AOA"},
"status": "pending",
"reason": "Devolução parcial a pedido do cliente.",
"created_at": "2026-12-02T09:00:00Z"
}- Sem
amount, estorna-se o que resta do pagamento. Com ele, em unidades menores, na moeda do pagamento (em AOA, kwanzas inteiros). - Podem fazer-se vários estornos parciais do mesmo pagamento, e a soma nunca passa o que se cobrou: um estorno acima do que resta é recusado com
422 estorno_acima_do_cobrado, com o que resta na mensagem, mesmo com dois pedidos ao mesmo tempo. - Um pagamento que não está confirmado dá
409 pagamento_nao_pago, e um já todo estornado dá409 pagamento_ja_estornado. - O
Idempotency-Keyé obrigatório, como em todos osPOST: um pedido repetido com a mesma chave devolve o mesmo estorno, e não estorna duas vezes.
Como o dinheiro volta
| Como se pagou | Quem devolve | Estado |
|---|---|---|
| Cartão | O gateway, ao cartão do comprador | succeeded (ou pending, se o gateway ainda não o deu por feito). Se o gateway recusar, failed com failure_reason, e o saldo volta ao que era. Sem resposta dele, processing: a API volta a pedir sozinha. |
| Multicaixa Express, referência, BAI Paga | A equipa do Spolly Payments, por transferência | pending até a transferência estar feita, e depois succeeded. |
O desfecho de um estorno que ficou processing ou pending lê-se com GET /v1/refunds/re_.... O webhook refund.created chega quando o estorno fica aceite (pending ou succeeded).
curl -s "$SPOLLY_API_URL/v1/refunds/re_..." \
-H "Authorization: Bearer $SPOLLY_SECRET_KEY"O que acontece ao teu saldo
O valor estornado sai do teu saldo disponível e, quando não chega, da reserva. Se nem assim chegar, o saldo fica negativo, e os saques param até os pagamentos seguintes o cobrirem. A taxa do pagamento não se devolve.
Em modo teste
Os pagamentos de teste por cartão estornam-se como pelo gateway, sem dinheiro a mexer-se, e ficam succeeded; os outros ficam pending, como ficariam em produção à espera da transferência.