diff --git a/src/components/Subscription/SubscriptionContentNew.tsx b/src/components/Subscription/SubscriptionContentNew.tsx index e0594093..26accbf9 100644 --- a/src/components/Subscription/SubscriptionContentNew.tsx +++ b/src/components/Subscription/SubscriptionContentNew.tsx @@ -153,6 +153,7 @@ export default function SubscriptionContentNew() { const [promoCodeApplied, setPromoCodeApplied] = useState(false); const [promoCodeError, setPromoCodeError] = useState(''); const [validatingPromo, setValidatingPromo] = useState(false); + const [promoCodeFromUrl, setPromoCodeFromUrl] = useState(false); // 标记优惠码是否来自URL const [paymentOrder, setPaymentOrder] = useState(null); const [paymentCountdown, setPaymentCountdown] = useState(300); @@ -197,6 +198,18 @@ export default function SubscriptionContentNew() { fetchSubscriptionPlans(); }, []); + // 组件加载时解析URL中的优惠码参数 + useEffect(() => { + const urlParams = new URLSearchParams(window.location.search); + const promoFromUrl = urlParams.get('promo') || urlParams.get('code') || urlParams.get('coupon'); + if (promoFromUrl) { + const trimmedCode = promoFromUrl.trim().toUpperCase(); + setPromoCode(trimmedCode); + setPromoCodeFromUrl(true); + logger.debug('SubscriptionContentNew', '从URL获取优惠码', { promoCode: trimmedCode }); + } + }, []); + // 检查是否从支付宝支付返回(手机端支付完成后会跳转回来) useEffect(() => { const checkAlipayReturn = async () => { @@ -405,6 +418,7 @@ export default function SubscriptionContentNew() { setPromoCode(''); setPromoCodeApplied(false); setPromoCodeError(''); + setPromoCodeFromUrl(false); // 重置URL来源标记 if (selectedPlan) { await calculatePrice(selectedPlan, selectedCycle, null); } @@ -433,7 +447,36 @@ export default function SubscriptionContentNew() { // 切换套餐时重置协议勾选状态 setAgreementChecked(false); - await calculatePrice(plan, selectedCycle, promoCodeApplied ? promoCode : null); + // 如果有来自URL的优惠码且尚未应用,自动验证和应用 + if (promoCodeFromUrl && promoCode && !promoCodeApplied) { + setValidatingPromo(true); + try { + const result = await calculatePrice(plan, selectedCycle, promoCode); + if (result && !result.promo_error) { + setPromoCodeApplied(true); + toast({ + title: '优惠码已自动应用', + description: `节省 ¥${result.discount_amount.toFixed(2)}`, + status: 'success', + duration: 3000, + isClosable: true, + }); + } else { + // 优惠码无效,清除并显示错误 + setPromoCodeError(result?.promo_error || '优惠码无效'); + setPromoCodeFromUrl(false); + await calculatePrice(plan, selectedCycle, null); + } + } catch (error) { + setPromoCodeError('优惠码验证失败'); + setPromoCodeFromUrl(false); + await calculatePrice(plan, selectedCycle, null); + } finally { + setValidatingPromo(false); + } + } else { + await calculatePrice(plan, selectedCycle, promoCodeApplied ? promoCode : null); + } onOpen(); };