Fix: Pass user email to subscription function
The AI corrected the `Assinatura` page to pass the user's email and ID in the request body when calling the `mercado-pago-subscribe` Supabase function, resolving the "E-mail ou ID do usuário não fornecido" error.
This commit is contained in:
parent
490404d22b
commit
a9ab6d566f
@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
import { ArrowLeft, Check } from "lucide-react";
|
import { ArrowLeft, Check } from "lucide-react";
|
||||||
@ -29,37 +30,46 @@ const Assinatura = () => {
|
|||||||
console.log('🔄 [ASSINATURA] Iniciando processo de assinatura...');
|
console.log('🔄 [ASSINATURA] Iniciando processo de assinatura...');
|
||||||
|
|
||||||
// Verificar sessão do usuário
|
// Verificar sessão do usuário
|
||||||
const { data: { user }, error: userError } = await supabase.auth.getUser();
|
const { data: { session }, error: sessionError } = await supabase.auth.getSession();
|
||||||
|
|
||||||
if (userError) {
|
if (sessionError) {
|
||||||
console.error('❌ [ASSINATURA] Erro de autenticação:', userError);
|
console.error('❌ [ASSINATURA] Erro ao obter sessão:', sessionError);
|
||||||
toast.error("Erro de autenticação. Faça login novamente.");
|
toast.error("Erro de autenticação. Faça login novamente.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!user || !user.id || !user.email) {
|
if (!session || !session.user || !session.user.id || !session.user.email) {
|
||||||
console.error('❌ [ASSINATURA] Usuário não autenticado');
|
console.error('❌ [ASSINATURA] Usuário não autenticado ou dados incompletos');
|
||||||
toast.error("Sessão inválida. Por favor, faça login novamente.");
|
toast.error("Sessão inválida. Por favor, faça login novamente.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const { user } = session;
|
||||||
console.log('✅ [ASSINATURA] Usuário autenticado:', { id: user.id, email: user.email });
|
console.log('✅ [ASSINATURA] Usuário autenticado:', { id: user.id, email: user.email });
|
||||||
|
|
||||||
|
// Preparar dados para envio
|
||||||
|
const requestData = {
|
||||||
|
email: user.email,
|
||||||
|
userId: user.id
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log('📦 [ASSINATURA] Dados a serem enviados:', requestData);
|
||||||
|
|
||||||
// Chamar a função do MercadoPago
|
// Chamar a função do MercadoPago
|
||||||
console.log('📞 [ASSINATURA] Chamando função mercado-pago-subscribe...');
|
console.log('📞 [ASSINATURA] Chamando função mercado-pago-subscribe...');
|
||||||
const { data, error } = await supabase.functions.invoke('mercado-pago-subscribe', {
|
const { data, error } = await supabase.functions.invoke('mercado-pago-subscribe', {
|
||||||
body: {
|
body: requestData,
|
||||||
email: user.email,
|
method: 'POST'
|
||||||
userId: user.id
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
console.log('📨 [ASSINATURA] Resposta da função:', { data, error });
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
console.error('❌ [ASSINATURA] Erro na função:', error);
|
console.error('❌ [ASSINATURA] Erro na função:', error);
|
||||||
|
|
||||||
// Tratar diferentes tipos de erro
|
// Tratar diferentes tipos de erro
|
||||||
if (error.message?.includes('FunctionsHttpError')) {
|
if (error.message?.includes('FunctionsHttpError')) {
|
||||||
toast.error("Erro de comunicação. Verifique sua conexão e tente novamente.");
|
toast.error("Erro de comunicação com o servidor. Tente novamente.");
|
||||||
} else if (error.message?.includes('FunctionsRelayError')) {
|
} else if (error.message?.includes('FunctionsRelayError')) {
|
||||||
toast.error("Serviço temporariamente indisponível. Tente novamente em alguns instantes.");
|
toast.error("Serviço temporariamente indisponível. Tente novamente em alguns instantes.");
|
||||||
} else if (error.message?.includes('fetch')) {
|
} else if (error.message?.includes('fetch')) {
|
||||||
|
|||||||
@ -15,32 +15,48 @@ serve(async (req) => {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
console.log('🚀 Iniciando processamento da assinatura MercadoPago');
|
console.log('🚀 Iniciando processamento da assinatura MercadoPago');
|
||||||
|
console.log('📋 Método da requisição:', req.method);
|
||||||
|
console.log('📋 Headers da requisição:', Object.fromEntries(req.headers.entries()));
|
||||||
|
|
||||||
// Verificar se há dados no corpo da requisição
|
// Verificar se há dados no corpo da requisição
|
||||||
let requestBody;
|
let requestBody;
|
||||||
try {
|
try {
|
||||||
const text = await req.text();
|
const text = await req.text();
|
||||||
requestBody = text ? JSON.parse(text) : {};
|
console.log('📦 Texto bruto recebido:', text);
|
||||||
console.log('📦 Corpo da requisição:', requestBody);
|
|
||||||
|
if (!text || text.trim() === '') {
|
||||||
|
console.error('❌ Corpo da requisição está vazio');
|
||||||
|
return new Response(JSON.stringify({ error: 'Dados da requisição não fornecidos.' }), {
|
||||||
|
headers: { ...corsHeaders, 'Content-Type': 'application/json' },
|
||||||
|
status: 400,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
requestBody = JSON.parse(text);
|
||||||
|
console.log('📦 Corpo da requisição parseado:', requestBody);
|
||||||
} catch (parseError) {
|
} catch (parseError) {
|
||||||
console.error('❌ Erro ao fazer parse do JSON:', parseError);
|
console.error('❌ Erro ao fazer parse do JSON:', parseError);
|
||||||
return new Response(JSON.stringify({ error: 'Dados da requisição inválidos.' }), {
|
return new Response(JSON.stringify({ error: 'Formato de dados inválido.' }), {
|
||||||
headers: { ...corsHeaders, 'Content-Type': 'application/json' },
|
headers: { ...corsHeaders, 'Content-Type': 'application/json' },
|
||||||
status: 400,
|
status: 400,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Extrair email e userId do corpo da requisição
|
||||||
const { email, userId } = requestBody;
|
const { email, userId } = requestBody;
|
||||||
|
|
||||||
|
console.log('📧 Dados extraídos:', { email, userId });
|
||||||
|
|
||||||
if (!email || !userId) {
|
if (!email || !userId) {
|
||||||
console.error('❌ Email ou ID do usuário não fornecido');
|
console.error('❌ Email ou ID do usuário não fornecido');
|
||||||
|
console.error('❌ Dados recebidos:', { email, userId });
|
||||||
return new Response(JSON.stringify({ error: 'E-mail ou ID do usuário não fornecido.' }), {
|
return new Response(JSON.stringify({ error: 'E-mail ou ID do usuário não fornecido.' }), {
|
||||||
headers: { ...corsHeaders, 'Content-Type': 'application/json' },
|
headers: { ...corsHeaders, 'Content-Type': 'application/json' },
|
||||||
status: 400,
|
status: 400,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('📧 Dados recebidos:', { email, userId });
|
console.log('📧 Dados validados com sucesso:', { email, userId });
|
||||||
|
|
||||||
// Cria um cliente Supabase com a service_role_key para verificar o usuário
|
// Cria um cliente Supabase com a service_role_key para verificar o usuário
|
||||||
const supabaseAdmin = createClient(
|
const supabaseAdmin = createClient(
|
||||||
@ -59,7 +75,7 @@ serve(async (req) => {
|
|||||||
|
|
||||||
if (userError) {
|
if (userError) {
|
||||||
console.error('❌ Erro ao buscar usuário:', userError);
|
console.error('❌ Erro ao buscar usuário:', userError);
|
||||||
return new Response(JSON.stringify({ error: 'Usuário não encontrado.' }), {
|
return new Response(JSON.stringify({ error: 'Usuário não encontrado no sistema.' }), {
|
||||||
headers: { ...corsHeaders, 'Content-Type': 'application/json' },
|
headers: { ...corsHeaders, 'Content-Type': 'application/json' },
|
||||||
status: 404,
|
status: 404,
|
||||||
});
|
});
|
||||||
@ -67,7 +83,7 @@ serve(async (req) => {
|
|||||||
|
|
||||||
if (!userData) {
|
if (!userData) {
|
||||||
console.error('❌ Usuário não encontrado no banco');
|
console.error('❌ Usuário não encontrado no banco');
|
||||||
return new Response(JSON.stringify({ error: 'Usuário não encontrado.' }), {
|
return new Response(JSON.stringify({ error: 'Usuário não encontrado no sistema.' }), {
|
||||||
headers: { ...corsHeaders, 'Content-Type': 'application/json' },
|
headers: { ...corsHeaders, 'Content-Type': 'application/json' },
|
||||||
status: 404,
|
status: 404,
|
||||||
});
|
});
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user