update pay promo

This commit is contained in:
2026-02-02 13:59:58 +08:00
parent c56f5f2f7f
commit ade0301ce8

View File

@@ -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();
};