diff --git a/src/pages/UserCenter/index.tsx b/src/pages/UserCenter/index.tsx
index 13de6ad..4e2b5dc 100644
--- a/src/pages/UserCenter/index.tsx
+++ b/src/pages/UserCenter/index.tsx
@@ -99,6 +99,7 @@
   const [editCoverImageUrl, setEditCoverImageUrl] = useState<string>('');
   const [currentPayment, setCurrentPayment] = useState<PaymentRecord | null>(null);
   const [isEditingPromotion, setIsEditingPromotion] = useState(false);
+  const [currentPublishingPostId, setCurrentPublishingPostId] = useState<number | null>(null); // 跟踪当前正在发布的帖子ID
 
   useEffect(() => {
     if (activeTab === 'myPosts') {
@@ -171,25 +172,64 @@
 
   const handlePublishPost = async (values: PostFormData) => {
     try {
-      if (values.promotionPlan && selectedPromotion) {
-        // 如果选择了推广，创建支付记录
-        const paymentResponse = await createPayment({
-          postId: 0, // 新帖子，暂时设为0，后端会处理
-          planId: selectedPromotion.id,
-          amount: selectedPromotion.price
-        });
-        
-        if (paymentResponse.code === 200) {
-          setCurrentPayment(paymentResponse.data);
-        setPaymentModalVisible(true);
-        return;
+      // 如果选择了推广计划
+      if (values.promotionPlan) {
+        const selectedPlan = promotionPlans.find(p => p.id === values.promotionPlan);
+        if (selectedPlan) {
+          setSelectedPromotion(selectedPlan);
+          
+          let postId = currentPublishingPostId;
+          
+          // 如果还没有创建帖子，先创建帖子
+          if (!postId) {
+            const postData = {
+              title: values.title,
+              content: values.content,
+              summary: values.summary,
+              tags: Array.isArray(values.tags) ? values.tags.join(',') : values.tags,
+              coverImage: coverImageUrl || undefined
+              // 注意：这里不包含promotionPlan，等支付成功后再更新
+            };
+            
+            const publishResponse = await publishPost(postData);
+            if (publishResponse.code === 200) {
+              postId = publishResponse.data?.postId;
+              if (postId) {
+                setCurrentPublishingPostId(postId); // 保存已创建的帖子ID
+              } else {
+                message.error('帖子发布成功但无法获取帖子ID');
+                return;
+              }
+            } else {
+              message.error(publishResponse.msg || '帖子发布失败');
+              return;
+            }
+          }
+          
+          // 使用帖子ID创建支付记录
+          if (postId) {
+            const paymentResponse = await createPayment({
+              postId: postId,
+              planId: selectedPlan.id,
+              amount: selectedPlan.price
+            });
+            
+            if (paymentResponse.code === 200) {
+              setCurrentPayment(paymentResponse.data);
+              setPaymentModalVisible(true);
+              return;
+            } else {
+              message.error(paymentResponse.msg || '创建支付记录失败');
+              return;
+            }
+          }
         } else {
-          message.error(paymentResponse.msg || '创建支付记录失败');
+          message.error('无效的推广计划');
           return;
         }
       }
       
-      // 直接发布帖子
+      // 直接发布帖子（没有选择推广）
       await submitPost(values);
     } catch (error) {
       message.error('发布帖子失败');
@@ -201,12 +241,15 @@
       // 处理标签格式
       const tagsString = Array.isArray(values.tags) ? values.tags.join(',') : values.tags;
       
+      // 如果有选择的推广计划，使用推广计划ID，否则使用表单中的值
+      const promotionPlanId = selectedPromotion?.id || values.promotionPlan;
+      
       const postData = {
         title: values.title,
         content: values.content,
         summary: values.summary,
         tags: tagsString,
-        promotionPlan: values.promotionPlan,
+        promotionPlan: promotionPlanId,
         coverImage: coverImageUrl || undefined
       };
       
@@ -353,7 +396,7 @@
       const response = await confirmPayment(currentPayment.paymentId);
       if (response.code === 200) {
         message.success('支付成功，推广已生效');
-    setPaymentModalVisible(false);
+        setPaymentModalVisible(false);
         setCurrentPayment(null);
         
         // 如果是编辑模式，完成帖子更新
@@ -361,14 +404,16 @@
           const values = editForm.getFieldsValue();
           const tagsString = Array.isArray(values.tags) ? values.tags.join(',') : values.tags;
           await updatePostDirectly(values, tagsString);
-        } else {
-          // 如果是发布模式
-    setPublishModalVisible(false);
-    form.resetFields();
-    setSelectedPromotion(null);
+        } else if (publishModalVisible) {
+          // 如果是发布模式，支付成功后关闭所有弹窗，刷新帖子列表，清空状态
+          setPublishModalVisible(false);
+          form.resetFields();
           setCoverImageUrl('');
-    fetchMyPosts();
+          setCurrentPublishingPostId(null); // 清空已创建的帖子ID
+          fetchMyPosts();
         }
+        
+        setSelectedPromotion(null);
       } else {
         message.error(response.msg || '支付确认失败');
       }
@@ -386,6 +431,17 @@
       setPaymentModalVisible(false);
       setCurrentPayment(null);
       setSelectedPromotion(null);
+      
+      // 如果是发布模式，支付取消后返回发布页面（不关闭发布弹窗）
+      // 保持currentPublishingPostId，用户可以重新支付
+      // 如果是编辑模式，关闭编辑弹窗
+      if (editModalVisible) {
+        setEditModalVisible(false);
+        editForm.resetFields();
+        setCurrentEditPost(null);
+        setEditCoverImageUrl('');
+        setIsEditingPromotion(false);
+      }
     } catch (error) {
       console.error('取消支付失败:', error);
       setPaymentModalVisible(false);
@@ -432,6 +488,17 @@
   };
 
   const handleCancelPublish = async () => {
+    // 如果有已创建的帖子但还没有支付成功，需要删除这个帖子
+    if (currentPublishingPostId) {
+      try {
+        await deletePost(currentPublishingPostId);
+        message.info('已取消发布并删除草稿帖子');
+      } catch (error) {
+        console.error('删除草稿帖子失败:', error);
+        message.warning('取消发布成功，但删除草稿帖子失败');
+      }
+    }
+    
     // 如果有上传的图片但没有发布帖子，删除图片
     if (coverImageUrl) {
       try {
@@ -448,6 +515,7 @@
     form.resetFields();
     setSelectedPromotion(null);
     setCoverImageUrl('');
+    setCurrentPublishingPostId(null); // 清空已创建的帖子ID
   };
 
   const uploadButton = (
