From 78e435f60cba3c93419babf950e4ac88387d5d26 Mon Sep 17 00:00:00 2001 From: songtianlun Date: Wed, 27 Aug 2025 07:11:21 +0800 Subject: [PATCH] fix topup --- src/app/api/credits/stripe-topup/route.ts | 31 ++++++++++------ src/app/api/credits/topup/route.ts | 18 ++++++++++ src/app/api/credits/verify-payment/route.ts | 40 +++++++++++++++------ 3 files changed, 68 insertions(+), 21 deletions(-) diff --git a/src/app/api/credits/stripe-topup/route.ts b/src/app/api/credits/stripe-topup/route.ts index b4bcdec..3fefc1f 100644 --- a/src/app/api/credits/stripe-topup/route.ts +++ b/src/app/api/credits/stripe-topup/route.ts @@ -1,6 +1,7 @@ import { NextResponse } from 'next/server' import { createServerSupabaseClient } from '@/lib/supabase-server' import { createOrGetStripeCustomer, createPaymentSession } from '@/lib/stripe' +import { prisma } from '@/lib/prisma' export async function POST(request: Request) { try { @@ -30,16 +31,26 @@ export async function POST(request: Request) { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }) } - // 获取用户信息 - const { data: userData, error: userError } = await supabase - .from('users') - .select('email, username') - .eq('id', user.id) - .single() - - if (userError || !userData) { - return NextResponse.json({ error: 'User not found' }, { status: 404 }) - } + // 确保用户存在于数据库中,并获取用户信息 + const userData = await prisma.user.upsert({ + where: { id: user.id }, + update: { + email: user.email || '', + updatedAt: new Date() + }, + create: { + id: user.id, + email: user.email || '', + username: user.user_metadata?.username || null, + subscriptionPlanId: 'free', + createdAt: new Date(), + updatedAt: new Date() + }, + select: { + email: true, + username: true + } + }) try { // 创建或获取 Stripe 客户 diff --git a/src/app/api/credits/topup/route.ts b/src/app/api/credits/topup/route.ts index b4728ae..3b9eab3 100644 --- a/src/app/api/credits/topup/route.ts +++ b/src/app/api/credits/topup/route.ts @@ -1,6 +1,7 @@ import { NextResponse } from 'next/server' import { createServerSupabaseClient } from '@/lib/supabase-server' import { addCredit } from '@/lib/services/credit' +import { prisma } from '@/lib/prisma' export async function POST(request: Request) { try { @@ -37,6 +38,23 @@ export async function POST(request: Request) { // 开发环境:模拟充值成功 console.log(`🧪 Development mode: Simulating top-up of $${amount} for user ${user.id}`) + // 确保用户存在于数据库中 + await prisma.user.upsert({ + where: { id: user.id }, + update: { + email: user.email || '', + updatedAt: new Date() + }, + create: { + id: user.id, + email: user.email || '', + username: user.user_metadata?.username || null, + subscriptionPlanId: 'free', + createdAt: new Date(), + updatedAt: new Date() + } + }) + const creditTransaction = await addCredit( user.id, amount, diff --git a/src/app/api/credits/verify-payment/route.ts b/src/app/api/credits/verify-payment/route.ts index 7a2d3c9..62ef08f 100644 --- a/src/app/api/credits/verify-payment/route.ts +++ b/src/app/api/credits/verify-payment/route.ts @@ -2,6 +2,7 @@ import { NextResponse } from 'next/server' import { createServerSupabaseClient } from '@/lib/supabase-server' import { stripe } from '@/lib/stripe' import { addCredit } from '@/lib/services/credit' +import { prisma } from '@/lib/prisma' export async function GET(request: Request) { try { @@ -53,13 +54,30 @@ export async function GET(request: Request) { ) } + // 确保用户存在于数据库中 + await prisma.user.upsert({ + where: { id: user.id }, + update: { + email: user.email || '', + updatedAt: new Date() + }, + create: { + id: user.id, + email: user.email || '', + username: user.user_metadata?.username || null, + subscriptionPlanId: 'free', + createdAt: new Date(), + updatedAt: new Date() + } + }) + // 检查是否已经处理过这个支付会话 - const { data: existingCredit } = await supabase - .from('credits') - .select('id') - .eq('referenceId', sessionId) - .eq('referenceType', 'stripe_payment') - .single() + const existingCredit = await prisma.credit.findFirst({ + where: { + referenceId: sessionId, + referenceType: 'stripe_payment' + } + }) if (existingCredit) { // 已经处理过,直接返回成功 @@ -79,13 +97,13 @@ export async function GET(request: Request) { ) // 更新 credit 记录的 referenceId 和 referenceType - await supabase - .from('credits') - .update({ + await prisma.credit.update({ + where: { id: creditTransaction.id }, + data: { referenceId: sessionId, referenceType: 'stripe_payment' - }) - .eq('id', creditTransaction.id) + } + }) return NextResponse.json({ success: true,