'use client'; import { useEffect, useState } from 'react'; import { useSearchParams } from 'next/navigation'; import { CheckCircle, Loader2, XCircle } from 'lucide-react'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; interface PaymentStatus { payment_status: 'pending' | 'success' | 'fail'; biz_order_no: string; pay_time?: string; subscription?: { plan_name: string; plan_display_name: string; status: string; current_period_end?: string; }; } export default function PaymentSuccessPage() { const searchParams = useSearchParams(); const sessionId = searchParams.get('session_id'); const [status, setStatus] = useState<'loading' | 'success' | 'failed' | 'timeout'>('loading'); const [paymentData, setPaymentData] = useState(null); const [attempts, setAttempts] = useState(0); useEffect(() => { if (!sessionId) { setStatus('failed'); return; } const pollPaymentStatus = async () => { const maxAttempts = 30; // 最多轮询30次 const interval = 2000; // 每2秒轮询一次 for (let i = 0; i < maxAttempts; i++) { setAttempts(i + 1); try { // 使用新的Checkout Session状态查询 const { getCheckoutSessionStatus } = await import('@/lib/stripe'); const User = JSON.parse(localStorage.getItem("currentUser") || "{}"); const result = await getCheckoutSessionStatus(sessionId, String(User.id)); if (result.successful && result.data) { setPaymentData(result.data); if (result.data.payment_status === 'success') { setStatus('success'); return; } else if (result.data.payment_status === 'fail') { setStatus('failed'); return; } } // 等待下次轮询 await new Promise(resolve => setTimeout(resolve, interval)); } catch (error) { console.error('轮询Checkout Session状态失败:', error); } } // 轮询超时 setStatus('timeout'); }; pollPaymentStatus(); }, [sessionId]); const renderContent = () => { switch (status) { case 'loading': return (
处理中... 正在确认您的支付,请稍候
尝试次数: {attempts}/30

请不要关闭此页面,我们正在处理您的订阅

); case 'success': return (
支付成功! 您的订阅已激活
{paymentData?.subscription && (

{paymentData.subscription.plan_display_name} 套餐

状态: {paymentData.subscription.status}

{paymentData.subscription.current_period_end && (

有效期至: {new Date(paymentData.subscription.current_period_end).toLocaleDateString()}

)}
)}

订单号: {paymentData?.biz_order_no}

{paymentData?.pay_time && (

支付时间: {new Date(paymentData.pay_time).toLocaleString()}

)}
); case 'failed': return (
支付失败 很抱歉,您的支付未能成功完成

请检查您的支付信息或稍后重试

); case 'timeout': return (
处理中 支付正在处理中,请稍后查看

您的支付可能仍在处理中,请稍后检查您的订阅状态

); default: return null; } }; return (
{renderContent()}
); }