update pay promo
This commit is contained in:
@@ -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();
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user