diff --git a/dingdan/views.py b/dingdan/views.py index 8defda0..7118b5e 100644 --- a/dingdan/views.py +++ b/dingdan/views.py @@ -329,11 +329,19 @@ class CreateOrderView(APIView): # 解析返回的XML root = ET.fromstring(response.content) - return_code = root.find('return_code').text - result_code = root.find('result_code').text + def _xml_text(tag, default=''): + node = root.find(tag) + return node.text if node is not None and node.text is not None else default + + return_code = _xml_text('return_code') + result_code = _xml_text('result_code') if return_code == 'SUCCESS' and result_code == 'SUCCESS': - prepay_id = root.find('prepay_id').text + prepay_id = _xml_text('prepay_id') + if not prepay_id: + raise Exception( + f"微信支付下单失败: 缺少 prepay_id, raw={response.content.decode('utf-8', errors='ignore')}" + ) # 生成前端支付参数 timestamp = str(int(time.time())) @@ -365,19 +373,18 @@ class CreateOrderView(APIView): return result else: - # 获取详细的错误信息 - err_code = root.find('err_code') - err_code_des = root.find('err_code_des') - return_msg = root.find('return_msg') - - error_details = f"return_code: {return_code}, " - if err_code is not None: - error_details += f"err_code: {err_code.text}, " - if err_code_des is not None: - error_details += f"err_code_des: {err_code_des.text}, " - if return_msg is not None: - error_details += f"return_msg: {return_msg.text}" + # 获取详细的错误信息(return_code 失败时往往没有 result_code) + err_code = _xml_text('err_code') + err_code_des = _xml_text('err_code_des') + return_msg = _xml_text('return_msg') + raw = response.content.decode('utf-8', errors='ignore') + error_details = ( + f"return_code={return_code}, result_code={result_code}, " + f"err_code={err_code}, err_code_des={err_code_des}, " + f"return_msg={return_msg}, mch_id={MCHID}, raw={raw}" + ) + logger.error("微信支付统一下单失败: %s", error_details) raise Exception(f"微信支付下单失败: {error_details}") except Exception as e: