import { createHmac } from 'crypto'; import { NextResponse } from 'next/server'; const WEBHOOK_SECRET = process.env.MP_WEBHOOK_SECRET; const MP_ACCESS_TOKEN = process.env.MP_ACCESS_TOKEN; function validateWebhookSignature( signature: string, requestId: string, resourceId: string, ): boolean { try { if (!WEBHOOK_SECRET) { console.error('WEBHOOK_SECRET não configurado'); return false; } // Extrair timestamp e assinatura const [timestampPart, signaturePart] = signature.split(','); const timestamp = timestampPart.replace('ts=', ''); const receivedSignature = signaturePart.replace('v1=', ''); // Criar manifesto const manifest = `id:${resourceId};request-id:${requestId};ts:${timestamp};`; // Gerar assinatura const generatedSignature = createHmac('sha256', WEBHOOK_SECRET) .update(manifest) .digest('hex'); // Comparar assinaturas return receivedSignature === generatedSignature; } catch (error) { console.error('Erro na validação da assinatura:', error); return false; } } export async function POST(request: Request) { try { if (!MP_ACCESS_TOKEN) { console.error('MP_ACCESS_TOKEN não configurado'); return NextResponse.json({ success: false }); } // Obter headers necessários const signature = request.headers.get('x-signature'); const requestId = request.headers.get('x-request-id'); const body = await request.json(); // Verifica se é uma notificação de pagamento if (body.type === 'payment' && body.data.id) { const paymentId = body.data.id.toString(); // Validar assinatura do webhook if (!signature || !requestId) { console.error('Headers de assinatura ausentes'); return NextResponse.json( { error: 'Headers de assinatura ausentes' }, { status: 401 } ); } if (!validateWebhookSignature(signature, requestId, paymentId)) { console.error('Assinatura do webhook inválida'); return NextResponse.json( { error: 'Assinatura inválida' }, { status: 401 } ); } // Verifica o status do pagamento no Mercado Pago const mpResponse = await fetch(`https://api.mercadopago.com/v1/payments/${paymentId}`, { headers: { 'Authorization': `Bearer ${MP_ACCESS_TOKEN}` } }); if (!mpResponse.ok) { console.error('Erro ao consultar status do pagamento no Mercado Pago'); return NextResponse.json( { error: 'Erro ao consultar status do pagamento' }, { status: 500 } ); } const mpData = await mpResponse.json(); if (mpData.status === 'approved') { try { console.log("Pagamento aprovado."); } catch (error) { console.error('Erro ao processar licença:', error); } } return NextResponse.json({ success: true }); } return NextResponse.json({ success: true }); } catch (error) { console.error('Erro no webhook:', error); return NextResponse.json( { error: error instanceof Error ? error.message : 'Erro interno do servidor' }, { status: 500 } ); } }