You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP动态生成多<GOODS>节点SOAP XML问题:CURL多数据提交失败

解决XML多节点生成与CURL提交问题

一、生成多节点的实现

修改现有PHP代码,通过循环遍历产品数据,逐个生成对应节点并嵌入到SOAP XML结构中:

$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 03:52:07