Explorar el Código

fix(payment): 优化支付流程及状态管理

- 三方支付页面卸载时重置用户和购物车状态
- 电影订单提交支付流程中增加异常捕获及finally块处理
- 根据支付类型区分快速出票和普通出票价格赋值逻辑
- 微信小程序和H5端分别处理支付结果及异步查询支付成功状态
- 订单列表组件支付功能中根据支付类型区分调用相应支付接口
- 支付失败时打印错误日志并提示用户支付状态更新
zhangtao hace 3 días
padre
commit
899337f53b

+ 4 - 1
src/subPack-common/threePay/index.vue

@@ -133,9 +133,12 @@ onHide(() => {
 })
 
 // 页面卸载时清理,下次进入重新开始
-onUnload(() => {
+onUnload(async () => {
   stopCountdown()
   endTimestamp = null
+  await useUserStore().$reset()
+  useSmqjhCartStore().$reset()
+  useAddressStore().$reset()
 })
 </script>
 

+ 46 - 24
src/subPack-film/submit-order/index.vue

@@ -89,38 +89,60 @@ function next() {
 
 async function pay() {
   loading.value = true
-  console.log(info.value.chooseSeatList)
-  query.value.fastTicket = isWithin45Minutes(new Date(), info.value.showTime)
-  query.value.movieOrderItems = info.value.chooseSeatList.map((item: any) => {
-    if (isWithin45Minutes(new Date(), info.value.showTime)) { // 如果在45分钟内,快速出票
-      return {
-        name: item.seatName,
-        price: item.fastPrice,
+  try {
+    query.value.fastTicket = isWithin45Minutes(new Date(), info.value.showTime)
+    query.value.movieOrderItems = info.value.chooseSeatList.map((item: any) => {
+      if (isWithin45Minutes(new Date(), info.value.showTime)) { // 如果在45分钟内,快速出票
+        return {
+          name: item.seatName,
+          price: item.fastPrice,
+        }
+      }
+      else {
+        return {
+          name: item.seatName,
+          price: item.ticketPrice,
+        }
+      }
+    })
+    const { data: orderNumber } = await Apis.film.addFilmOrder({ data: query.value })
+    const payMent = await useUserStore().getPayMent(orderNumber)
+    if (payMent.payType !== 'point') {
+      try {
+        // #ifdef MP-WEIXIN
+        const res = await useUserStore().handleCommonPayMent(orderNumber)
+        await useUserStore().getWxCommonPayment(res)
+        await useUserStore().paySuccess('film-order', 'subPack-film/index/index')
+        // #endif
+        // #ifdef H5
+        useUserStore().handleCommonWechatPay(orderNumber)
+        await handleH5PayResult(orderNumber)
+        // #endif
+      }
+      catch {
+        await useUserStore().payError('film-order', 'subPack-film/index/index')
       }
     }
     else {
-      return {
-        name: item.seatName,
-        price: item.ticketPrice,
-      }
+      await useUserStore().handleCommonPayMent(orderNumber)
+      await useUserStore().paySuccess('film-order', 'subPack-film/index/index')
     }
-  })
-  const { data: orderNumber } = await Apis.film.addFilmOrder({ data: query.value })
-  const res = await useUserStore().handleCommonPayMent(orderNumber)
-  loading.value = false
-  if (res.payType !== 1) {
-    // await getWxCommonPayment(res)
-    uni.showToast({
-      title: '当前只支持积分支付',
-      icon: 'none',
-      duration: 2000,
-    })
   }
-  else {
+  catch (error) {
+    console.error('支付失败:', error)
+  }
+  finally {
+    loading.value = false
+  }
+}
+async function handleH5PayResult(orderNumber: string) {
+  const isPaySuccess = await useUserStore().pollOrderPaySuccess(orderNumber)
+  if (isPaySuccess) {
     await useUserStore().paySuccess('film-order', 'subPack-film/index/index')
+    return
   }
+  useGlobalToast().show({ msg: '暂未查询到支付成功,请稍后在订单列表查看' })
 }
-
 function call() {
   uni.makePhoneCall({
     phoneNumber: info.value.phone,

+ 11 - 4
src/subPack-smqjh/components/film-orderList/film-orderList.vue

@@ -10,12 +10,19 @@ const _emit = defineEmits<{
 }>()
 
 async function handlePay(orderNumber: string) {
-  const res = await useUserStore().handleCommonPayMent(orderNumber)
-  if (res.payType !== 1) {
-    // await useUserStore().getWxCommonPayment(res, 1)
-    useGlobalToast().show('当前只支持积分支付')
+  const payMent = await useUserStore().getPayMent(orderNumber)
+  if (payMent?.payType !== 'point' && payMent) {
+    // #ifdef MP-WEIXIN
+    const res = await useUserStore().handleCommonPayMent(orderNumber)
+    await useUserStore().getWxCommonPayment(res)
+    _emit('refresh')
+    // #endif
+    // #ifdef H5
+    useUserStore().handleCommonWechatPay(orderNumber)
+    // #endif
   }
   else {
+    await useUserStore().handleCommonPayMent(orderNumber)
     _emit('refresh')
   }
 }

+ 1 - 2
src/subPack-smqjh/components/xsb-orderList/xsb-orderList.vue

@@ -23,9 +23,8 @@ async function handleCancel(order: Api.xsbOrderList) {
 async function handlePay(orderNumber: string) {
   const payMent = await useUserStore().getPayMent(orderNumber)
   if (payMent?.payType !== 'point' && payMent) {
-    // #ifdef MP-WEIXIN
     const res = await useUserStore().handleCommonPayMent(orderNumber)
-
+    // #ifdef MP-WEIXIN
     await useUserStore().getWxCommonPayment(res)
     _emit('refresh')
     // #endif