n
This commit is contained in:
@@ -5,7 +5,7 @@
|
|||||||

|

|
||||||
|
|
||||||
## 📖 项目简介
|
## 📖 项目简介
|
||||||
|
npm run dev:weapp
|
||||||
Quant Speed Market 是一个基于现代技术栈构建的综合性平台,旨在为用户提供从商品购买、技术交流到 AI 工具使用的全方位体验。项目采用前后端分离架构,包含 Django 后端 API、React Web 管理端以及 Taro 微信小程序客户端。
|
Quant Speed Market 是一个基于现代技术栈构建的综合性平台,旨在为用户提供从商品购买、技术交流到 AI 工具使用的全方位体验。项目采用前后端分离架构,包含 Django 后端 API、React Web 管理端以及 Taro 微信小程序客户端。
|
||||||
|
|
||||||
## ✨ 功能特性
|
## ✨ 功能特性
|
||||||
@@ -30,7 +30,6 @@ Quant Speed Market 是一个基于现代技术栈构建的综合性平台,旨
|
|||||||
- **Core**: React 19 + Vite 7
|
- **Core**: React 19 + Vite 7
|
||||||
- **UI Library**: Ant Design 6
|
- **UI Library**: Ant Design 6
|
||||||
- **3D Engine**: Three.js + @react-three/fiber
|
- **3D Engine**: Three.js + @react-three/fiber
|
||||||
- **State Management**: React Context
|
|
||||||
- **Routing**: React Router v7
|
- **Routing**: React Router v7
|
||||||
|
|
||||||
### Miniprogram (小程序)
|
### Miniprogram (小程序)
|
||||||
|
|||||||
Binary file not shown.
@@ -41,7 +41,7 @@ def patched_request(self, *args, **kwargs):
|
|||||||
return original_request(self, *args, **kwargs)
|
return original_request(self, *args, **kwargs)
|
||||||
Core.request = patched_request
|
Core.request = patched_request
|
||||||
|
|
||||||
def get_wechat_pay_client():
|
def get_wechat_pay_client(pay_type=WeChatPayType.NATIVE):
|
||||||
"""
|
"""
|
||||||
获取微信支付 V3 客户端实例的辅助函数
|
获取微信支付 V3 客户端实例的辅助函数
|
||||||
"""
|
"""
|
||||||
@@ -108,7 +108,7 @@ def get_wechat_pay_client():
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
wxpay = WeChatPay(
|
wxpay = WeChatPay(
|
||||||
wechatpay_type=WeChatPayType.NATIVE,
|
wechatpay_type=pay_type,
|
||||||
mchid=mch_id,
|
mchid=mch_id,
|
||||||
private_key=private_key,
|
private_key=private_key,
|
||||||
cert_serial_no=serial_no,
|
cert_serial_no=serial_no,
|
||||||
@@ -699,7 +699,7 @@ class OrderViewSet(viewsets.ModelViewSet):
|
|||||||
return Response({'error': '支付系统维护中'}, status=status.HTTP_503_SERVICE_UNAVAILABLE)
|
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:
|
if not wxpay:
|
||||||
return Response({'error': error_msg}, status=500)
|
return Response({'error': error_msg}, status=500)
|
||||||
|
|
||||||
@@ -717,6 +717,12 @@ class OrderViewSet(viewsets.ModelViewSet):
|
|||||||
else:
|
else:
|
||||||
description = f"支付订单 {order.id}"
|
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)
|
# 统一下单 (JSAPI)
|
||||||
code, message = wxpay.pay(
|
code, message = wxpay.pay(
|
||||||
description=description,
|
description=description,
|
||||||
@@ -726,6 +732,8 @@ class OrderViewSet(viewsets.ModelViewSet):
|
|||||||
notify_url=wechat_config.notify_url
|
notify_url=wechat_config.notify_url
|
||||||
)
|
)
|
||||||
|
|
||||||
|
print(f"微信支付响应: Code={code}, Message={message}")
|
||||||
|
|
||||||
result = json.loads(message)
|
result = json.loads(message)
|
||||||
if code in range(200, 300):
|
if code in range(200, 300):
|
||||||
prepay_id = result.get('prepay_id')
|
prepay_id = result.get('prepay_id')
|
||||||
|
|||||||
@@ -47,22 +47,23 @@ const ActivityDetail = () => {
|
|||||||
refetchOnMount: 'always', // Force refetch on mount
|
refetchOnMount: 'always', // Force refetch on mount
|
||||||
});
|
});
|
||||||
|
|
||||||
|
//// /
|
||||||
// Force a refresh if needed (as requested by user)
|
// Force a refresh if needed (as requested by user)
|
||||||
// useEffect(() => {
|
useEffect(() => {
|
||||||
// // 1. Force React Query refetch
|
// 1. Force React Query refetch
|
||||||
// refetch();
|
refetch();
|
||||||
|
|
||||||
// // 2. Hard refresh logic after 1 second delay
|
// 2. Hard refresh logic after 1 second delay
|
||||||
// const timer = setTimeout(() => {
|
const timer = setTimeout(() => {
|
||||||
// const hasRefreshedKey = `has_refreshed_activity_${id}`;
|
const hasRefreshedKey = `has_refreshed_activity_${id}`;
|
||||||
// if (!sessionStorage.getItem(hasRefreshedKey)) {
|
if (!sessionStorage.getItem(hasRefreshedKey)) {
|
||||||
// sessionStorage.setItem(hasRefreshedKey, 'true');
|
sessionStorage.setItem(hasRefreshedKey, 'true');
|
||||||
// window.location.reload();
|
window.location.reload();
|
||||||
// }
|
}
|
||||||
// }, 0);
|
}, 500);
|
||||||
|
|
||||||
// return () => clearTimeout(timer);
|
return () => clearTimeout(timer);
|
||||||
// }, [id, refetch]);
|
}, [id, refetch]);
|
||||||
|
|
||||||
const signUpMutation = useMutation({
|
const signUpMutation = useMutation({
|
||||||
mutationFn: (values) => signUpActivity(id, { signup_info: values || {} }),
|
mutationFn: (values) => signUpActivity(id, { signup_info: values || {} }),
|
||||||
|
|||||||
Reference in New Issue
Block a user