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

使用Stripe Firebase Extension+Nextauth创建checkout_session时遇用户记录不存在错误

问题分析与解决方案

核心原因

  • 错误提示"There is no user record corresponding to the provided identifier."本质是:你尝试写入的users/${session.user.id}路径中,session.user.id对应的用户在Firebase Auth中不存在。
  • NextAuth生成的用户ID与Firebase Auth的UID并非默认关联,若你用第三方登录通过NextAuth接入,两者ID是独立的,直接混用会导致找不到对应Firebase用户。

修复方案

1. 关联NextAuth与Firebase用户ID

在NextAuth的会话回调中,将Firebase UID注入到session中,确保后续使用正确的用户标识:

// NextAuth配置文件示例
export default NextAuth({
  // ...其他配置
  callbacks: {
    async session({ session, user }) {
      // 假设你已将Firebase UID存储在用户数据库记录中
      const userDoc = await db.collection('nextauth_users').doc(user.id).get();
      session.user.firebaseUid = userDoc.data().firebaseUid;
      return session;
    }
  }
});

2. 修正Checkout Session创建路径

替换代码中的session.user.id为绑定后的Firebase UID:

const loadCheckOut = async (priceId) => {
  const docRef = await addDoc(
    collection(db, "users", `${session.user.firebaseUid}`, "checkout_sessions"),
    { 
      price: priceId,
      success_url: window.location.origin,
      cancel_url: window.location.origin,
    }
  );

  onSnapshot(docRef, (snap) => {
    const { error, url } = snap.data();
    if (error) {
      alert(`发生错误:${error.message}`);
      return;
    }
    if (url) {
      window.location.assign(url);
    }
  });
};

3. 可选:提前校验用户存在性

在创建会话前先验证Firebase用户是否存在,提前拦截错误:

import { getAuth } from "firebase/auth";

const loadCheckOut = async (priceId) => {
  const firebaseUid = session.user.firebaseUid;
  try {
    await getAuth().getUser(firebaseUid);
  } catch (err) {
    alert("用户不存在,请重新登录");
    return;
  }

  // 后续创建checkout_sessions逻辑...
};

额外检查点

  • 确认Stripe Firebase Extension配置里的「Firebase Users Collection」与你代码中使用的users集合路径完全一致。
  • 查看Firebase控制台的函数日志,可获取更详细的错误堆栈,进一步确认问题根源。

内容的提问来源于stack exchange,提问作者MMNK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:53:11