diff --git a/app/api/endpoints/order.py b/app/api/endpoints/order.py index 9f4e525..8aaf152 100644 --- a/app/api/endpoints/order.py +++ b/app/api/endpoints/order.py @@ -16,6 +16,7 @@ from app.models.order import ( OrderPriceResult, RefundOrderAmountRequest ) +from app.models.wechat_payment import WechatPaymentRecordDB from app.models.order_additional_fee import OrderAdditionalFeeDB, OrderAdditionalFeeInfo, AdditionalFeeResult from app.models.database import get_db from app.api.deps import get_current_user, get_deliveryman_user, get_admin_user @@ -482,6 +483,23 @@ async def get_order_detail( if not order: return error_response(code=404, message="订单不存在") + + # 检查订单是否已经支付 + if order.status == OrderStatus.UNPAID: + payment = db.query(WechatPaymentRecordDB).filter( + WechatPaymentRecordDB.out_trade_no == orderid + ).first() + # 如果订单已支付,则更新订单状态 + if payment and payment.trade_state == "SUCCESS": + if order.deliveryman_user_id: + order.status = OrderStatus.COMPLETED + else: + order.status = OrderStatus.CREATED + order.pay_status = True + order.transaction_id = payment.transaction_id + order.pay_time = payment.success_time + db.commit() + db.refresh(order) # 如果有配送员 id,则获取配送员信息 if order.deliveryman_user_id: diff --git a/app/api/endpoints/wechat.py b/app/api/endpoints/wechat.py index 0b8f12c..c9f3f09 100644 --- a/app/api/endpoints/wechat.py +++ b/app/api/endpoints/wechat.py @@ -215,15 +215,17 @@ async def payment_notify( # 获取订单信息 out_trade_no = data.get("out_trade_no") transaction_id = data.get("transaction_id") + trade_state = data.get("trade_state") trade_state_desc = data.get("trade_state_desc") success_time = data.get("success_time") logger.info(f"out_trade_no: {out_trade_no}") logger.info(f"transaction_id: {transaction_id}") logger.info(f"trade_state_desc: {trade_state_desc}") + logger.info(f"trade_state: {trade_state}") logger.info(f"success_time: {success_time}") - if not all([out_trade_no, transaction_id, trade_state_desc]) or trade_state_desc != "支付成功": + if not all([out_trade_no, transaction_id, trade_state])or trade_state != "SUCCESS": return error_response(code=400, message="缺少必要的订单信息或支付未成功") # 判断订单类型并处理 @@ -236,12 +238,18 @@ async def payment_notify( if not order: return error_response(code=404, message="订单不存在") - if trade_state_desc == "支付成功": + if trade_state == "SUCCESS": # 更新订单状态 - if order.deliveryman_user_id: + if order.deliveryman_user_id: order.status = OrderStatus.COMPLETED # 支付成功后状态为已完成 else: order.status = OrderStatus.CREATED # 支付成功后状态为已创建 + order.pay_status = True + order.completed_time = datetime.now() + order.transaction_id = transaction_id + order.pay_time = datetime.fromisoformat(success_time.replace('Z', '+00:00')) + db.commit() + db.refresh(order) # 发送企业微信消息 if order.status == OrderStatus.CREATED: @@ -253,11 +261,6 @@ async def payment_notify( OrderStatus.CREATED ) - order.pay_status = True - order.completed_time = datetime.now() - order.transaction_id = transaction_id - order.pay_time = datetime.fromisoformat(success_time.replace('Z', '+00:00')) - elif out_trade_no.startswith("A"): # 加价订单 additon_fee_order = db.query(OrderAdditionalFeeDB).filter( OrderAdditionalFeeDB.fee_order_id == out_trade_no @@ -283,7 +286,8 @@ async def payment_notify( # 重新计算配送员配送费用 order.delivery_share = calculate_delivery_share(order, db) - + db.commit() + db.refresh(order) elif out_trade_no.startswith("M"): # 商家商品订单 # 查询商户订单 @@ -313,6 +317,8 @@ async def payment_notify( order.pay_status = True order.transaction_id = transaction_id order.pay_time = datetime.fromisoformat(success_time.replace('Z', '+00:00')) + db.commit() + db.refresh(order) elif out_trade_no.startswith("P"): # 商家在线买单 order = db.query(MerchantPayOrderDB,MerchantDB).filter( @@ -339,6 +345,8 @@ async def payment_notify( order.MerchantPayOrderDB.status = MerchantPayOrderStatus.PAID order.MerchantPayOrderDB.transaction_id = transaction_id order.MerchantPayOrderDB.pay_time = datetime.fromisoformat(success_time.replace('Z', '+00:00')) + db.commit() + db.refresh(order) # 对商家进行分账计算 account_manager = AccountManager(db) @@ -360,7 +368,7 @@ async def payment_notify( payment_record = WechatPaymentRecordDB( out_trade_no=out_trade_no, transaction_id=transaction_id, - trade_state=data.get("trade_state"), + trade_state=trade_state, trade_state_desc=trade_state_desc, success_time=datetime.fromisoformat(success_time) if success_time else None, total_amount=float(data.get("amount", {}).get("total", 0)) / 100,