'use client' import React, { useEffect, useState } from 'react' import { Result, Button, Spin, Card } from 'antd' import { CheckCircleOutlined, CloseCircleOutlined, LoadingOutlined } from '@ant-design/icons' import { useRouter, useSearchParams } from 'next/navigation' import { getCheckoutSessionStatus, PaymentStatusResponse } from '@/lib/stripe' /** * 支付状态枚举 */ enum PaymentStatus { LOADING = 'loading', SUCCESS = 'success', FAILED = 'failed' } /** * 支付回调页面组件 * 处理Stripe Checkout支付完成后的状态展示和用户操作 */ export default function PayCallbackPage() { const router = useRouter() const searchParams = useSearchParams() const [paymentStatus, setPaymentStatus] = useState(PaymentStatus.LOADING) const [paymentInfo, setPaymentInfo] = useState(null) const callBackUrl = localStorage.getItem('callBackUrl') || '/' /** * 获取Stripe Checkout Session支付状态 */ const fetchPaymentStatus = async () => { try { // 从URL参数获取session_id和user_id const sessionId = searchParams.get('session_id') const userId = searchParams.get('user_id') if (!sessionId || !userId) { throw new Error('缺少必要的参数: session_id 或 user_id') } // 调用真实的Stripe API获取支付状态 const response = await getCheckoutSessionStatus(sessionId, userId) if (response.successful && response.data) { const { payment_status, biz_order_no, pay_time, subscription } = response.data if (payment_status === 'success') { setPaymentStatus(PaymentStatus.SUCCESS) setPaymentInfo({ orderId: biz_order_no, sessionId, paymentTime: pay_time, subscription: subscription ? { planName: subscription.plan_name, planDisplayName: subscription.plan_display_name, status: subscription.status, currentPeriodEnd: subscription.current_period_end } : null }) } else if (payment_status === 'fail') { setPaymentStatus(PaymentStatus.FAILED) setPaymentInfo({ orderId: biz_order_no, sessionId, errorMessage: '支付处理失败,请重试' }) } else { // pending状态,继续等待 setTimeout(fetchPaymentStatus, 2000) } } else { throw new Error(response.message || '获取支付状态失败') } } catch (error) { console.error('获取支付状态失败:', error) setPaymentStatus(PaymentStatus.FAILED) setPaymentInfo({ errorMessage: error instanceof Error ? error.message : '网络错误,无法获取支付状态' }) } } /** * 返回上一页的函数 */ const handleGoBack = () => { router.push(callBackUrl) } /** * 重新支付的函数 */ const handleRetryPayment = () => { router.push('/pricing') } useEffect(() => { fetchPaymentStatus() }, []) // 加载状态 if (paymentStatus === PaymentStatus.LOADING) { return (
} size="large" />
正在获取支付状态...
请稍候,我们正在处理您的支付信息
) } // 支付成功状态 if (paymentStatus === PaymentStatus.SUCCESS) { return (

支付成功!

{`订单号: ${paymentInfo?.orderId || 'N/A'}`}

{paymentInfo?.subscription && ( <>

订阅计划: {paymentInfo.subscription.planDisplayName}

订阅状态: {paymentInfo.subscription.status}

{paymentInfo.subscription.currentPeriodEnd && (

到期时间: {new Date(paymentInfo.subscription.currentPeriodEnd).toLocaleString()}

)} )} {paymentInfo?.paymentTime && (

支付时间: {new Date(paymentInfo.paymentTime).toLocaleString()}

)}

感谢您的购买!

) } // 支付失败状态 return (

支付失败

{paymentInfo?.errorMessage || '支付处理过程中发生错误'}

订单号: {paymentInfo?.orderId || 'N/A'}

如果问题持续存在,请联系客服

) }