From 82c6e9989bc1d9661efe3e6f2d55133156344138 Mon Sep 17 00:00:00 2001 From: Therainclouds <245141853@qq.com> Date: Thu, 12 Feb 2026 23:26:40 +0800 Subject: [PATCH] n --- README.md | 3 +- .../shop/__pycache__/views.cpython-312.pyc | Bin 69638 -> 70169 bytes backend/shop/views.py | 14 +++++++-- frontend/src/pages/activity/Detail.jsx | 27 +++++++++--------- 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index a2c7262..1d86aba 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ![Project Logo](frontend/public/liangji_logo.svg) ## 📖 项目简介 - +npm run dev:weapp Quant Speed Market 是一个基于现代技术栈构建的综合性平台,旨在为用户提供从商品购买、技术交流到 AI 工具使用的全方位体验。项目采用前后端分离架构,包含 Django 后端 API、React Web 管理端以及 Taro 微信小程序客户端。 ## ✨ 功能特性 @@ -30,7 +30,6 @@ Quant Speed Market 是一个基于现代技术栈构建的综合性平台,旨 - **Core**: React 19 + Vite 7 - **UI Library**: Ant Design 6 - **3D Engine**: Three.js + @react-three/fiber -- **State Management**: React Context - **Routing**: React Router v7 ### Miniprogram (小程序) diff --git a/backend/shop/__pycache__/views.cpython-312.pyc b/backend/shop/__pycache__/views.cpython-312.pyc index 494b96ee9ac81f6fa5e90082945ed42aac93c858..25abb7c72a34ad250055e8dfe3f844ac4b0f494b 100644 GIT binary patch delta 3736 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 delta 3328 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 CJc1qo diff --git a/backend/shop/views.py b/backend/shop/views.py index 42f76d1..55e1891 100644 --- a/backend/shop/views.py +++ b/backend/shop/views.py @@ -41,7 +41,7 @@ def patched_request(self, *args, **kwargs): return original_request(self, *args, **kwargs) Core.request = patched_request -def get_wechat_pay_client(): +def get_wechat_pay_client(pay_type=WeChatPayType.NATIVE): """ 获取微信支付 V3 客户端实例的辅助函数 """ @@ -108,7 +108,7 @@ def get_wechat_pay_client(): try: wxpay = WeChatPay( - wechatpay_type=WeChatPayType.NATIVE, + wechatpay_type=pay_type, mchid=mch_id, private_key=private_key, cert_serial_no=serial_no, @@ -699,7 +699,7 @@ class OrderViewSet(viewsets.ModelViewSet): return Response({'error': '支付系统维护中'}, status=status.HTTP_503_SERVICE_UNAVAILABLE) # 初始化支付客户端 - wxpay, error_msg = get_wechat_pay_client() + wxpay, error_msg = get_wechat_pay_client(pay_type=WeChatPayType.JSAPI) if not wxpay: return Response({'error': error_msg}, status=500) @@ -717,6 +717,12 @@ class OrderViewSet(viewsets.ModelViewSet): else: description = f"支付订单 {order.id}" + print(f"准备发起微信支付(小程序):") + print(f" OutTradeNo: {out_trade_no}") + print(f" Amount: {amount_in_cents} 分") + print(f" OpenID: {user.openid}") + print(f" NotifyURL: {wechat_config.notify_url}") + # 统一下单 (JSAPI) code, message = wxpay.pay( description=description, @@ -726,6 +732,8 @@ class OrderViewSet(viewsets.ModelViewSet): notify_url=wechat_config.notify_url ) + print(f"微信支付响应: Code={code}, Message={message}") + result = json.loads(message) if code in range(200, 300): prepay_id = result.get('prepay_id') diff --git a/frontend/src/pages/activity/Detail.jsx b/frontend/src/pages/activity/Detail.jsx index e93ee1b..42a6cb7 100644 --- a/frontend/src/pages/activity/Detail.jsx +++ b/frontend/src/pages/activity/Detail.jsx @@ -47,22 +47,23 @@ const ActivityDetail = () => { refetchOnMount: 'always', // Force refetch on mount }); + //// / // Force a refresh if needed (as requested by user) - // useEffect(() => { - // // 1. Force React Query refetch - // refetch(); + useEffect(() => { + // 1. Force React Query refetch + refetch(); - // // 2. Hard refresh logic after 1 second delay - // const timer = setTimeout(() => { - // const hasRefreshedKey = `has_refreshed_activity_${id}`; - // if (!sessionStorage.getItem(hasRefreshedKey)) { - // sessionStorage.setItem(hasRefreshedKey, 'true'); - // window.location.reload(); - // } - // }, 0); + // 2. Hard refresh logic after 1 second delay + const timer = setTimeout(() => { + const hasRefreshedKey = `has_refreshed_activity_${id}`; + if (!sessionStorage.getItem(hasRefreshedKey)) { + sessionStorage.setItem(hasRefreshedKey, 'true'); + window.location.reload(); + } + }, 500); - // return () => clearTimeout(timer); - // }, [id, refetch]); + return () => clearTimeout(timer); + }, [id, refetch]); const signUpMutation = useMutation({ mutationFn: (values) => signUpActivity(id, { signup_info: values || {} }),