You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 06:42:53