loja online de uma torrefação
Checkout com Pix que confirma sozinho
- problema
- O front perguntava a cada 3 segundos se o Pix tinha caído. Cliente fechava a aba, o pedido ficava “aguardando” para sempre e o dono conferia o extrato na mão.
- o que mudou
- Webhook assinado do provedor, atualização idempotente do pedido e o e-mail de confirmação numa fila. Agora a aba pode fechar.
| 18 | 18 | export async function confirmarPagamento(req: Request) { | |
| 19 | − | // o front chama isto a cada 3s até dar certo | |
| 20 | − | const txid = new URL(req.url).searchParams.get("txid") | |
| 21 | − | if (await consultarPix(txid)) await marcarPago(txid) | |
| 19 | + | const evento = await validarAssinatura(req) | |
| 20 | + | const { count } = await db.pedido.updateMany({ | |
| 21 | + | where: { txid: evento.txid, status: "aguardando" }, | |
| 22 | + | data: { status: "pago", pagoEm: evento.horario }, | |
| 23 | + | }) | |
| 24 | + | if (count) await fila.enviar("email-confirmacao", evento.txid) | |
| 22 | 25 | return new Response(null, { status: 200 }) | |
| 23 | 26 | } |