'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 (
Processing... Confirming your payment, please wait
Attempts: {attempts}/30

Please do not close this page, we are processing your subscription

); case 'success': return (
Payment successful! Your subscription has been activated
{paymentData?.subscription && (

{paymentData.subscription.plan_display_name} Plan

Status: {paymentData.subscription.status}

{paymentData.subscription.current_period_end && (

Valid until: {new Date(paymentData.subscription.current_period_end).toLocaleDateString()}

)}
)}

Order number: {paymentData?.biz_order_no}

{paymentData?.pay_time && (

Payment time: {new Date(paymentData.pay_time).toLocaleString()}

)}
); case 'failed': return (
Payment failed Sorry, your payment was not successful

Please check your payment information or try again later

); case 'timeout': return (
Processing Payment is being processed, please check later

Your payment may still be processing, please check your subscription status later

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