Supabase表无法显示Stripe客户信息问题求助
排查与解决步骤
1. 检查Row Level Security (RLS) 规则冲突
这是最常见的原因——设置Webhook函数后可能误改了RLS策略,导致认证用户无法查看自身数据:
- 查询自定义用户表(如
users)的现有策略:SELECT * FROM pg_policies WHERE tablename = 'users'; - 确保存在允许认证用户查看自身数据的策略,若缺失则添加:
CREATE POLICY "Authenticated users can view their own data" ON users FOR SELECT USING (auth.uid() = id); - 检查
auth.users表的RLS规则,确认未被修改导致元数据无法查看:SELECT * FROM pg_policies WHERE tablename = 'users' AND schemaname = 'auth';
2. 验证Webhook写入逻辑的正确性
Webhook必须用Supabase服务角色客户端写入数据,且正确关联用户的Supabase UID:
- 确认服务角色客户端初始化正确:
import { createClient } from '@supabase/supabase-js'; // 必须使用服务角色密钥,绕过RLS限制 const supabase = createClient( process.env.NEXT_PUBLIC_SUPABASE_URL, process.env.SUPABASE_SERVICE_ROLE_KEY ); - 检查Stripe客户元数据中是否存储了Supabase UID,且写入时关联正确:
const stripeCustomer = event.data.object; const supabaseUid = stripeCustomer.metadata.supabase_uid; if (!supabaseUid) { return res.status(400).send('Missing Supabase UID in Stripe metadata'); } // 写入时用Supabase UID作为主键,关联auth.users表 const { error } = await supabase.from('users').upsert({ id: supabaseUid, stripe_customer_id: stripeCustomer.id, subscription_status: stripeCustomer.subscriptions.data[0]?.status }); if (error) console.error('Supabase write error:', error);
3. 同步自定义表数据到Supabase认证元数据
若需在Supabase控制台的认证标签中直接查看订阅数据,需将自定义表数据同步到auth.users的app_metadata:
- 创建触发器函数:
CREATE OR REPLACE FUNCTION sync_subscription_to_auth() RETURNS TRIGGER AS $$ BEGIN UPDATE auth.users SET app_metadata = jsonb_merge( app_metadata, jsonb_build_object( 'stripe_customer_id', NEW.stripe_customer_id, 'subscription_status', NEW.subscription_status ) ) WHERE id = NEW.id; RETURN NEW; END; $$ LANGUAGE plpgsql SECURITY DEFINER; - 绑定触发器到自定义用户表:
CREATE TRIGGER trigger_sync_subscription_metadata AFTER INSERT OR UPDATE ON users FOR EACH ROW EXECUTE FUNCTION sync_subscription_to_auth();
4. 前端查询权限验证
确保前端仅请求当前认证用户的数据:
const { data: authUser } = await supabase.auth.getUser(); const { data: subscriptionData } = await supabase .from('users') .select('stripe_customer_id, subscription_status') .eq('id', authUser.user.id) .single();
5. 检查Webhook触发与数据完整性
- 查看Stripe Dashboard的Webhook日志,确认事件已成功触发且无错误;
- 直接查询Supabase数据库,确认写入的数据字段完整(如
id是否与auth.users.id一致):SELECT id, stripe_customer_id, subscription_status FROM users;
内容的提问来源于stack exchange,提问作者Victor Timi
相关产品推荐
相关产品推荐

