93 lines
2.9 KiB
TypeScript
93 lines
2.9 KiB
TypeScript
|
|
import { createClient } from "https://esm.sh/@supabase/supabase-js@2.49.4";
|
|
|
|
const corsHeaders = {
|
|
"Access-Control-Allow-Origin": "*",
|
|
"Access-Control-Allow-Headers": "authorization, x-client-info, apikey, content-type",
|
|
};
|
|
|
|
Deno.serve(async (req: Request) => {
|
|
// Handle CORS preflight requests
|
|
if (req.method === 'OPTIONS') {
|
|
return new Response(null, { headers: corsHeaders });
|
|
}
|
|
|
|
const SUPABASE_URL = Deno.env.get("SUPABASE_URL") || "";
|
|
const SUPABASE_SERVICE_ROLE_KEY = Deno.env.get("SUPABASE_SERVICE_ROLE_KEY") || "";
|
|
|
|
if (!SUPABASE_URL || !SUPABASE_SERVICE_ROLE_KEY) {
|
|
console.error("Supabase env vars missing");
|
|
return new Response(JSON.stringify({ error: "Config error" }), {
|
|
status: 500,
|
|
headers: { ...corsHeaders, "Content-Type": "application/json" },
|
|
});
|
|
}
|
|
|
|
let body: any;
|
|
try {
|
|
body = await req.json();
|
|
} catch (err) {
|
|
console.error("Falha ao ler o JSON bruto do webhook", err);
|
|
return new Response(JSON.stringify({ error: "JSON inválido" }), {
|
|
status: 400,
|
|
headers: { ...corsHeaders, "Content-Type": "application/json" },
|
|
});
|
|
}
|
|
|
|
// Prepare fields for insertion
|
|
const event_type = body.type || body.event_type || null;
|
|
const event_id = body["id"] || body["event_id"] || null;
|
|
let payer_email = null;
|
|
let user_id = null;
|
|
let status_val = null;
|
|
|
|
// Tenta extrair campos-padrão do webhook do Mercado Pago
|
|
if (body.data && typeof body.data === "object") {
|
|
if (body.data.user_id || body.data.userId) {
|
|
user_id = body.data.user_id || body.data.userId;
|
|
}
|
|
if (body.data.payer && body.data.payer.email) {
|
|
payer_email = body.data.payer.email;
|
|
}
|
|
if (body.data.status) {
|
|
status_val = body.data.status;
|
|
}
|
|
}
|
|
|
|
// For robustness, tenta extrair de níveis superiores também
|
|
if (!payer_email && body.payer_email) payer_email = body.payer_email;
|
|
if (!user_id && body.user_id) user_id = body.user_id;
|
|
if (!status_val && body.status) status_val = body.status;
|
|
|
|
// Log para debug
|
|
console.log("Recebido Webhook MercadoPago:", { event_type, event_id, payer_email, user_id, status_val });
|
|
|
|
// Salvar no banco de dados
|
|
const supabase = createClient(SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY);
|
|
const { error } = await supabase.from("pagamentos_mercadopago").insert([
|
|
{
|
|
raw_body: body,
|
|
event_type: event_type || "desconhecido",
|
|
event_id,
|
|
payer_email,
|
|
user_id,
|
|
status: status_val,
|
|
}
|
|
]);
|
|
|
|
if (error) {
|
|
console.error("Erro ao salvar evento MercadoPago:", error);
|
|
// Mesmo em erro, responde 200 para evitar retries do MercadoPago
|
|
return new Response(JSON.stringify({ error: "Falha ao registrar evento" }), {
|
|
status: 200,
|
|
headers: { ...corsHeaders, "Content-Type": "application/json" }
|
|
});
|
|
}
|
|
|
|
// Sempre responde status 200 OK (ou 204)
|
|
return new Response(null, {
|
|
status: 204,
|
|
headers: corsHeaders,
|
|
});
|
|
});
|