diff --git a/app/api/endpoints/merchant_order.py b/app/api/endpoints/merchant_order.py index 41fd645..dcffc1b 100644 --- a/app/api/endpoints/merchant_order.py +++ b/app/api/endpoints/merchant_order.py @@ -247,7 +247,8 @@ async def merchant_cancel_order( wechat = WeChatClient() await wechat.apply_refund( order_id=order.order_id, - total_amount=int(float(order.pay_amount) * 100) if not settings.DEBUG else 1, # 转换为分 + total_amount=int(float(order.pay_amount) * 100) if not settings.DEBUG else 1, # 转换为分,订单总金额 + refund_amount=int(float(order.pay_amount) * 100) if not settings.DEBUG else 1, # 转换为分,退款金额 reason="商家取消订单" ) return success_response(data=MerchantOrderInfo.model_validate(order)) @@ -278,7 +279,8 @@ async def user_cancel_order( wechat = WeChatClient() await wechat.apply_refund( order_id=order.order_id, - total_amount=int(float(order.pay_amount) * 100) if not settings.DEBUG else 1, # 转换为分 + total_amount=int(float(order.pay_amount) * 100) if not settings.DEBUG else 1, # 转换为分,订单总金额 + refund_amount=int(float(order.pay_amount) * 100) if not settings.DEBUG else 1, # 转换为分,退款金额 reason="用户取消订单" ) return success_response(data=MerchantOrderInfo.model_validate(order)) @@ -554,7 +556,8 @@ async def apply_refund( wechat = WeChatClient() await wechat.apply_refund( order_id=order.order_id, - total_amount=int(float(order.pay_amount) * 100) if not settings.DEBUG else 1, # 转换为分 + total_amount=int(float(order.pay_amount) * 100) if not settings.DEBUG else 1, # 转换为分,订单总金额 + refund_amount=int(float(order.pay_amount) * 100) if not settings.DEBUG else 1, # 转换为分,退款金额 reason="用户申请退款" ) diff --git a/app/api/endpoints/order.py b/app/api/endpoints/order.py index abe023f..fb1108c 100644 --- a/app/api/endpoints/order.py +++ b/app/api/endpoints/order.py @@ -912,7 +912,8 @@ async def cancel_order( wechat = WeChatClient() await wechat.apply_refund( order_id=order.orderid, - total_amount=int(float(order.final_amount) * 100) if not settings.DEBUG else 1, # 转换为分 + total_amount=int(float(order.final_amount) * 100) if not settings.DEBUG else 1, # 订单总金额(分) + refund_amount=int(float(order.final_amount) * 100) if not settings.DEBUG else 1, # 退款金额(分) reason="用户取消订单" ) @@ -1174,7 +1175,8 @@ async def deliveryman_cancel_order( wechat = WeChatClient() await wechat.apply_refund( order_id=order.orderid, - total_amount=int(float(order.final_amount) * 100) if not settings.DEBUG else 1, # 转换为分 + total_amount=int(float(order.final_amount) * 100) if not settings.DEBUG else 1, # 订单总金额(分) + refund_amount=int(float(order.final_amount) * 100) if not settings.DEBUG else 1, # 退款金额(分) reason="配送员取消订单" ) @@ -1616,8 +1618,9 @@ async def refund_order_amount( wechat = WeChatClient() await wechat.apply_refund( order_id=order.orderid, - total_amount=int(float(request.amount) * 100) if not settings.DEBUG else 1, # 转换为分 - reason="后台退款" + total_amount=int(float(order.final_amount + request.amount) * 100) if not settings.DEBUG else 1, # 原订单总金额(分) + refund_amount=int(float(request.amount) * 100) if not settings.DEBUG else 1, # 本次退款金额(分) + reason=request.reason or "后台退款" ) db.commit() diff --git a/app/core/wechat.py b/app/core/wechat.py index bae9a52..0de488e 100644 --- a/app/core/wechat.py +++ b/app/core/wechat.py @@ -370,6 +370,7 @@ class WeChatClient: self, order_id: str, total_amount: int, + refund_amount: int = None, reason: str = "用户申请退款" ) -> dict: """ @@ -377,14 +378,19 @@ class WeChatClient: Args: order_id: 订单号(同时作为退款单号) - total_amount: 退款金额(分) + total_amount: 订单总金额(分) + refund_amount: 退款金额(分),默认为None时等于total_amount(全额退款) reason: 退款原因 Returns: dict: 退款结果 """ try: - print(f"开始申请退款: order_id={order_id}, amount={total_amount}") + # 如果未指定退款金额,默认全额退款 + if refund_amount is None: + refund_amount = total_amount + + print(f"开始申请退款: order_id={order_id}, total_amount={total_amount}, refund_amount={refund_amount}") # 生成随机字符串 nonce_str = generate_random_string() timestamp = str(int(time.time())) @@ -396,17 +402,17 @@ class WeChatClient: # 构建请求体 body = { "out_trade_no": order_id, # 商户订单号,二选一 - "out_refund_no": f"refund_{order_id}", # 商户退款单号 + "out_refund_no": f"refund_{order_id}_{int(time.time())}", # 商户退款单号,加入时间戳避免重复 "reason": reason, "notify_url": f"{settings.API_BASE_URL}/api/wechat/refund/notify", "amount": { - "refund": total_amount, # 退款金额 + "refund": refund_amount, # 退款金额 "total": total_amount, # 原订单金额 "currency": "CNY" } } - # 生成签名 + # 生成签名 nonce_str, timestamp, signature = self.sign_message("POST", url_path, body) # 构建认证头 diff --git a/jobs.sqlite b/jobs.sqlite index 4aa7045..b100100 100644 Binary files a/jobs.sqlite and b/jobs.sqlite differ