PHP动态生成多<GOODS>节点SOAP XML问题:CURL多数据提交失败
解决XML多节点生成与CURL提交问题
一、生成多节点的实现
修改现有PHP代码,通过循环遍历产品数据,逐个生成对应
$number_array = $_POST['numbers']; $name_array = $_POST['name']; $quantity_array = $_POST['quantity']; $price_array = $_POST['totprice']; // 初始化存储所有GOODS节点的变量 $goods_xml = ''; // 循环处理每个产品,生成对应的GOODS节点 for ($i = 0; $i < count($name_array); $i++) { $name = htmlspecialchars($name_array[$i]); $number = htmlspecialchars($number_array[$i]); $quantity = htmlspecialchars($quantity_array[$i]); $price = htmlspecialchars($price_array[$i]); // 计算金额(若AMOUNT规则不同,可自行调整) $amount = $quantity * $price; // 拼接当前产品的GOODS节点 $goods_xml .= <<<XML <GOODS> <ID>0</ID> <W_NAME>{$name}</W_NAME> <UNIT_ID>1</UNIT_ID> <UNIT_TXT></UNIT_TXT> <QUANTITY>{$quantity}</QUANTITY> <PRICE>{$price}</PRICE> <STATUS>1</STATUS> <AMOUNT>{$amount}</AMOUNT> <BAR_CODE>{$number}</BAR_CODE> <A_ID>0</A_ID> <VAT_TYPE>0</VAT_TYPE> </GOODS> XML; } // 拼接完整的SOAP XML结构 $xml = <<<XML <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <save_waybill xmlns="http://tempuri.org/"> <su>username</su> <sp>password</sp> <waybill> <WAYBILL> <SUB_WAYBILLS></SUB_WAYBILLS> <GOODS_LIST> {$goods_xml} </GOODS_LIST> </WAYBILL> </waybill> </save_waybill> </soap:Body> </soap:Envelope> XML;
关键说明:
- 用
htmlspecialchars()转义产品字段,避免特殊字符(如<、>、&)破坏XML格式 - 使用HEREDOC语法拼接XML,提升代码可读性和维护性
- 循环生成的所有
节点会被统一嵌入到 <GOODS_LIST>标签内
二、CURL提交多数据的实现
完成XML构建后,通过CURL发送SOAP请求,需配置正确的请求参数:
// 替换为实际的SOAP接口地址 $url = 'https://your-soap-api-url.com'; $ch = curl_init($url); // 设置CURL核心选项 curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); // 设置SOAP请求必备头信息 curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: text/xml; charset=utf-8', 'SOAPAction: "http://tempuri.org/save_waybill"' ]); // 要求返回响应内容而非直接输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 测试环境可临时关闭SSL验证(生产环境禁止) // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 执行请求并处理结果 $response = curl_exec($ch); if (curl_errno($ch)) { die('CURL请求失败: ' . curl_error($ch)); } // 输出或解析响应内容 echo $response; curl_close($ch);
关键说明:
- 必须指定
Content-Type: text/xml,确保服务器识别为SOAP请求 SOAPAction值需与接口定义一致,通常为命名空间+接口方法名- 生产环境需保留SSL证书验证,避免安全风险
内容的提问来源于stack exchange,提问作者Levan
相关产品推荐
相关产品推荐

