'use client'; import { useSearchParams } from 'next/navigation'; import { useEffect, useState, Suspense } from 'react'; function ResultContent() { const searchParams = useSearchParams(); // Support both ZPAY (out_trade_no) and Stripe (order_id) callback params const outTradeNo = searchParams.get('out_trade_no') || searchParams.get('order_id'); const tradeStatus = searchParams.get('trade_status') || searchParams.get('status'); const isPopup = searchParams.get('popup') === '1'; const theme = searchParams.get('theme') === 'dark' ? 'dark' : 'light'; const isDark = theme === 'dark'; const [status, setStatus] = useState(null); const [loading, setLoading] = useState(true); const [isInPopup, setIsInPopup] = useState(false); const [countdown, setCountdown] = useState(5); // Detect if opened as a popup window (from stripe-popup or via popup=1 param) useEffect(() => { if (isPopup || window.opener) { setIsInPopup(true); } }, [isPopup]); useEffect(() => { if (!outTradeNo) { setLoading(false); return; } const checkOrder = async () => { try { const res = await fetch(`/api/orders/${outTradeNo}`); if (res.ok) { const data = await res.json(); setStatus(data.status); } } catch { // ignore } finally { setLoading(false); } }; checkOrder(); // Poll a few times in case status hasn't updated yet const timer = setInterval(checkOrder, 3000); const timeout = setTimeout(() => clearInterval(timer), 30000); return () => { clearInterval(timer); clearTimeout(timeout); }; }, [outTradeNo]); const isSuccess = status === 'COMPLETED' || status === 'PAID' || status === 'RECHARGING'; const goBack = () => { if (isInPopup) { window.close(); } else if (window.history.length > 1) { window.history.back(); } else { window.close(); } }; // Countdown auto-return on success useEffect(() => { if (!isSuccess) return; setCountdown(5); const timer = setInterval(() => { setCountdown((prev) => { if (prev <= 1) { clearInterval(timer); goBack(); return 0; } return prev - 1; }); }, 1000); return () => clearInterval(timer); // eslint-disable-next-line react-hooks/exhaustive-deps }, [isSuccess, isInPopup]); if (loading) { return (
查询支付结果中...
); } const isPending = status === 'PENDING'; return (
{isSuccess ? ( <>

{status === 'COMPLETED' ? '充值成功' : '充值处理中'}

{status === 'COMPLETED' ? '余额已成功到账!' : '支付成功,余额正在充值中...'}

{countdown > 0 ? `${countdown} 秒后自动返回` : '正在返回...'}

) : isPending ? ( <>

等待支付

订单尚未完成支付

) : ( <>

{status === 'EXPIRED' ? '订单已超时' : status === 'CANCELLED' ? '订单已取消' : '支付异常'}

{status === 'EXPIRED' ? '订单已超时,请重新充值' : status === 'CANCELLED' ? '订单已被取消' : '请联系管理员处理'}

)}

订单号: {outTradeNo || '未知'}

); } export default function PayResultPage() { return (
加载中...
} >
); }