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
相关产品推荐
相关产品推荐

