Skip to content

Latest commit

 

History

History
187 lines (132 loc) · 4.34 KB

File metadata and controls

187 lines (132 loc) · 4.34 KB

Pi UID 查找错误修复

🐛 问题描述

在一对多批量转账功能中,用户支付完成后无法完成 A2U 转账,界面显示错误:

User has no Pi uid: e0b8b25b...

🔍 根本原因

前后端字段不匹配

  1. 前端:用户在界面输入的是 Pi uid(如 e0b8b25b25...
  2. 后端:使用 walletAddress 字段查找用户 ❌

问题代码

// ❌ 错误的查找方式
const recipientUser = await prisma.piUser.findFirst({
  where: { walletAddress: recipient.toAddress },  // 用钱包地址查找
});

数据流

用户输入: e0b8b25b25... (Pi uid)
     ↓
前端传递: { toAddress: "e0b8b25b25..." }
     ↓
后端查询: WHERE walletAddress = "e0b8b25b25..."  ❌ 
     ↓
找不到用户 → 抛出错误

✅ 修复方案

修改后端查找逻辑,改为使用 piUid 字段查找。

修复的文件

文件: app/api/v1/payments/complete/route.ts
修改行: 第 130 行

修改内容

// ✅ 正确的查找方式
const recipientUser = await prisma.piUser.findFirst({
  where: { piUid: recipient.toAddress },  // 用 Pi uid 查找
});

完整修改

try {
- // 通过地址查找收款人的 Pi uid
+ // 通过 Pi uid 查找收款人
  const recipientUser = await prisma.piUser.findFirst({
-   where: { walletAddress: recipient.toAddress },
+   where: { piUid: recipient.toAddress },
  });

  if (!recipientUser) {
-   throw new Error(`Cannot find user for address: ${recipient.toAddress}`);
+   throw new Error(`Cannot find user with Pi uid: ${recipient.toAddress}`);
  }

- // 验证 piUid 是否存在
+ // 验证 piUid 是否存在(理论上这里已经找到了有 piUid 的用户)
  if (!recipientUser.piUid) {
    throw new Error(`User has no Pi uid: ${recipient.toAddress}`);
  }

🧪 测试步骤

  1. 确保收款人已登录过

    • 收款人需要在应用中登录过一次
    • 这样数据库中才有他的 piUid 记录
  2. 获取收款人的 Pi uid

    // 在浏览器控制台查看自己的 uid
    console.log(localStorage.getItem("pi_uid"));
  3. 发起批量转账

    • 在一对多转账界面输入收款人的 Pi uid
    • 输入转账金额
    • 点击 "Continue Transfer"
  4. 验证结果

    • ✅ 支付应该能成功完成
    • ✅ 不再显示 "User has no Pi uid" 错误
    • ✅ 在 Transfer Details 中看到 "Status: Completed"

📊 影响范围

修改的文件

  • app/api/v1/payments/complete/route.ts - 1 行关键修改

修改的代码

  • 查找逻辑: walletAddresspiUid
  • 错误信息: 更新为更准确的描述

⚠️ 注意事项

1. 收款人必须已登录

原因:只有登录过的用户才会在数据库中有 piUid 记录

解决方案

  • 确保所有收款人至少登录过一次
  • 或者提供一个 "邀请用户" 功能

2. 前端字段命名

虽然前端使用 toAddress 字段名,但实际存储的是 piUid

当前设计

// 前端
{ toAddress: "e0b8b25b25..." }  // 实际上是 piUid

// 后端
recipient.toAddress  // 实际上是 piUid

可选优化(不是必需的): 为了代码清晰,可以将字段名统一改为 piUid,但这需要修改多处代码。


🎯 修复效果

修复前 ❌

  • 用户输入 Pi uid 后查找失败
  • 即使偶然找到用户,也可能因为 piUid 字段为空而失败
  • 批量转账功能无法使用

修复后 ✅

  • 用户输入 Pi uid 后能正确找到收款人
  • A2U 支付能成功创建
  • 批量转账功能正常工作

📝 相关问题回顾

这个 bug 是在修复 P0 致命级问题时引入的:

  1. ✅ 添加了 piUid 字段到数据库
  2. ✅ 修改了登录逻辑保存 piUid
  3. ✅ 修改了 A2U 支付使用 piUid
  4. 忘记修改查找用户的逻辑 ← 导致了这个 bug

教训:在修改数据模型时,要确保所有相关的查询逻辑都同步更新。


🚀 部署清单

  • 修改后端查找逻辑(piUid 替代 walletAddress
  • 验证 Lint 检查通过
  • 重启开发服务器
  • 测试批量转账功能
  • 验证错误消息正确显示

修复时间: 2025-10-21
修复类型: Bug Fix
影响功能: 一对多批量转账
状态: ✅ 已完成