# Páginas de retorno Construir as páginas de sucesso, pendente e cancelado. Depois do pagamento, redireciona o cliente para uma de três páginas. Use `actions.onPopupWindowClosed()` para redirecionar só quando o popup fecha. ## /sucesso Leia o `orderId`, **confirme o estado no backend** (a fonte da verdade é o webhook) e mostre a confirmação. ```js async onApprove(data, actions) { actions.onPopupWindowClosed(() => { window.location.href = `/sucesso?orderId=${data.payment.orderId}`; }); } ``` ```js /sucesso (cliente) const orderId = new URLSearchParams(location.search).get('orderId'); const r = await fetch(`/api/facipay/order/${orderId}/status`); const { status } = await r.json(); if (status === 'CON') showConfirmed(); else showStillProcessing(); ``` ## /pendente (Referência EMIS) Mostre **entidade + referência + valor** bem visíveis. Faça polling de fallback ao endpoint de estado e redirecione para `/sucesso` quando `CON`. ```js async onPending(data, actions) { actions.onPopupWindowClosed(() => { const ref = data.payment?.data?.paymentReference; const entity = data.payment?.data?.entity?.number; const amount = data.payment?.data?.amount; window.location.href = `/pendente?ref=${ref}&entity=${entity}&amount=${amount}`; }); } ``` ```js /pendente (polling de fallback) const orderId = new URLSearchParams(location.search).get('orderId'); const poll = setInterval(async () => { const r = await fetch(`/api/facipay/order/${orderId}/status`); const { status } = await r.json(); if (status === 'CON') { clearInterval(poll); window.location.href = `/sucesso?orderId=${orderId}`; } }, 7000); // 5–10s ``` O polling é apenas **rede de segurança** caso o webhook atrase. A confirmação oficial continua a vir do webhook no seu backend. ## /cancelado Mensagem clara e um CTA para tentar de novo. ```js async onCancel() { window.location.href = '/cancelado'; } ``` Mostrar o valor e vários itens no botão.