在一对多批量转账功能中,用户支付完成后无法完成 A2U 转账,界面显示错误:
User has no Pi uid: e0b8b25b...
前后端字段不匹配:
- 前端:用户在界面输入的是 Pi uid(如
e0b8b25b25...) - 后端:使用
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}`);
}-
确保收款人已登录过
- 收款人需要在应用中登录过一次
- 这样数据库中才有他的
piUid记录
-
获取收款人的 Pi uid
// 在浏览器控制台查看自己的 uid console.log(localStorage.getItem("pi_uid"));
-
发起批量转账
- 在一对多转账界面输入收款人的 Pi uid
- 输入转账金额
- 点击 "Continue Transfer"
-
验证结果
- ✅ 支付应该能成功完成
- ✅ 不再显示 "User has no Pi uid" 错误
- ✅ 在 Transfer Details 中看到 "Status: Completed"
- ✅
app/api/v1/payments/complete/route.ts- 1 行关键修改
- 查找逻辑:
walletAddress→piUid - 错误信息: 更新为更准确的描述
原因:只有登录过的用户才会在数据库中有 piUid 记录
解决方案:
- 确保所有收款人至少登录过一次
- 或者提供一个 "邀请用户" 功能
虽然前端使用 toAddress 字段名,但实际存储的是 piUid。
当前设计:
// 前端
{ toAddress: "e0b8b25b25..." } // 实际上是 piUid
// 后端
recipient.toAddress // 实际上是 piUid可选优化(不是必需的):
为了代码清晰,可以将字段名统一改为 piUid,但这需要修改多处代码。
- 用户输入 Pi uid 后查找失败
- 即使偶然找到用户,也可能因为
piUid字段为空而失败 - 批量转账功能无法使用
- 用户输入 Pi uid 后能正确找到收款人
- A2U 支付能成功创建
- 批量转账功能正常工作
这个 bug 是在修复 P0 致命级问题时引入的:
- ✅ 添加了
piUid字段到数据库 - ✅ 修改了登录逻辑保存
piUid - ✅ 修改了 A2U 支付使用
piUid - ❌ 忘记修改查找用户的逻辑 ← 导致了这个 bug
教训:在修改数据模型时,要确保所有相关的查询逻辑都同步更新。
- 修改后端查找逻辑(
piUid替代walletAddress) - 验证 Lint 检查通过
- 重启开发服务器
- 测试批量转账功能
- 验证错误消息正确显示
修复时间: 2025-10-21
修复类型: Bug Fix
影响功能: 一对多批量转账
状态: ✅ 已完成