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

PHP调用SoapServer时参数无法传入请求的解决方法求助

PHP SoapClient无法传递参数到SaiaSecure GetByProNumber接口的解决方案

我之前也碰到过类似的SOAP参数传递坑,尤其是对接.NET编写的SOAP服务(SaiaSecure这个接口大概率是这类),PHP的SoapClient在参数结构上经常需要调整才能匹配服务端的预期。咱们一步步来解决你的问题:

问题根源分析

你当前用__soapCall时用了parameters作为顶级键,但输出的XML里<ns1:GetByProNumber>是空的——这说明参数没有被正确映射到SOAP操作对应的命名空间节点下。.NET的SOAP服务通常要求参数包裹在与操作名称同名的节点里,而不是通用的parameters键。

解决步骤与代码调整

1. 调整参数传递结构(核心修复)

把parameters替换成操作名GetByProNumber作为顶级键,让SoapClient生成正确的XML节点:

$client->__soapCall(
    'GetByProNumber',
    [
        'GetByProNumber' => [
            'UserID' => 'username',
            'Password' => 'password',
            'TestMode' => 'Y',
            'ProNumber' => '123',
        ]
    ]
);

或者更简洁的直接调用方法(推荐):

$client->GetByProNumber([
    'UserID' => 'username',
    'Password' => 'password',
    'TestMode' => 'Y',
    'ProNumber' => '123',
]);

2. 明确指定命名空间与SoapAction

为了避免命名空间匹配问题,你可以在__soapCall里加上命名空间和SoapAction参数:

$client->__soapCall(
    'GetByProNumber',
    [
        'GetByProNumber' => [
            'UserID' => 'username',
            'Password' => 'password',
            'TestMode' => 'Y',
            'ProNumber' => '123',
        ]
    ],
    [
        'uri' => 'http://www.SaiaSecure.com/WebService/Shipment',
        'soapaction' => 'http://www.SaiaSecure.com/WebService/Shipment/GetByProNumber'
    ]
);

3. 禁用WSDL缓存(避免旧缓存干扰)

你用的PHP 7.0.30版本,SoapClient的WSDL缓存可能会导致旧的结构影响请求,建议禁用缓存:

$client = new MockSoapClient(
    'http://www.saiasecure.com/webservice/shipment/soap.asmx?wsdl',
    [
        'trace' => 1,
        'soap_version' => SOAP_1_1,
        'cache_wsdl' => WSDL_CACHE_NONE
    ]
);

完整修改后的代码

<?php
class MockSoapClient extends \SoapClient {
    public function __doRequest($request, $location, $action, $version, $one_way = 0) {
        echo $request.PHP_EOL;
        return '';
    }
}

$client = new MockSoapClient(
    'http://www.saiasecure.com/webservice/shipment/soap.asmx?wsdl',
    [
        'trace' => 1,
        'soap_version' => SOAP_1_1,
        'cache_wsdl' => WSDL_CACHE_NONE
    ]
);

// 调整后的参数调用
$client->__soapCall(
    'GetByProNumber',
    [
        'GetByProNumber' => [
            'UserID' => 'username',
            'Password' => 'password',
            'TestMode' => 'Y',
            'ProNumber' => '123',
        ]
    ],
    [
        'uri' => 'http://www.SaiaSecure.com/WebService/Shipment',
        'soapaction' => 'http://www.SaiaSecure.com/WebService/Shipment/GetByProNumber'
    ]
);

验证效果

修改后执行php test.php | xmllint -format -,你应该能看到<ns1:GetByProNumber>标签内包含所有预期的参数节点了。

内容的提问来源于stack exchange,提问作者rrehbein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:59:15