update pay promo
This commit is contained in:
@@ -153,6 +153,7 @@ export default function SubscriptionContentNew() {
|
|||||||
const [promoCodeApplied, setPromoCodeApplied] = useState(false);
|
const [promoCodeApplied, setPromoCodeApplied] = useState(false);
|
||||||
const [promoCodeError, setPromoCodeError] = useState('');
|
const [promoCodeError, setPromoCodeError] = useState('');
|
||||||
const [validatingPromo, setValidatingPromo] = useState(false);
|
const [validatingPromo, setValidatingPromo] = useState(false);
|
||||||
|
const [promoCodeFromUrl, setPromoCodeFromUrl] = useState(false); // 标记优惠码是否来自URL
|
||||||
|
|
||||||
const [paymentOrder, setPaymentOrder] = useState(null);
|
const [paymentOrder, setPaymentOrder] = useState(null);
|
||||||
const [paymentCountdown, setPaymentCountdown] = useState(300);
|
const [paymentCountdown, setPaymentCountdown] = useState(300);
|
||||||
@@ -197,6 +198,18 @@ export default function SubscriptionContentNew() {
|
|||||||
fetchSubscriptionPlans();
|
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(() => {
|
useEffect(() => {
|
||||||
const checkAlipayReturn = async () => {
|
const checkAlipayReturn = async () => {
|
||||||
@@ -405,6 +418,7 @@ export default function SubscriptionContentNew() {
|
|||||||
setPromoCode('');
|
setPromoCode('');
|
||||||
setPromoCodeApplied(false);
|
setPromoCodeApplied(false);
|
||||||
setPromoCodeError('');
|
setPromoCodeError('');
|
||||||
|
setPromoCodeFromUrl(false); // 重置URL来源标记
|
||||||
if (selectedPlan) {
|
if (selectedPlan) {
|
||||||
await calculatePrice(selectedPlan, selectedCycle, null);
|
await calculatePrice(selectedPlan, selectedCycle, null);
|
||||||
}
|
}
|
||||||
@@ -433,7 +447,36 @@ export default function SubscriptionContentNew() {
|
|||||||
// 切换套餐时重置协议勾选状态
|
// 切换套餐时重置协议勾选状态
|
||||||
setAgreementChecked(false);
|
setAgreementChecked(false);
|
||||||
|
|
||||||
|
// 如果有来自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);
|
await calculatePrice(plan, selectedCycle, promoCodeApplied ? promoCode : null);
|
||||||
|
}
|
||||||
onOpen();
|
onOpen();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user