Soap 客户端复杂类型 PHP 请求
Soap Client Complex Type PHP Request
我有一个网络服务 link
我正在尝试使用 SubmitRequestType
访问函数名称,但似乎该函数不存在 submitAnsiSingle
这是我到目前为止尝试的正确函数名称,
$wsdl = 'https://ww3.navicure.com:7000/webservices/NavicureSubmissionService?WSDL';
class SecurityHeaderType {
private $submitterIdentifier;
private $originatingIdentifier;
private $submitterPassword;
private $submissionId;
function SecurityHeaderType() {
$this->submitterIdentifier = '***';
$this->originatingIdentifier = '****';
$this->submitterPassword = '****';
$this->submissionId = '';
}
}
class SubmitRequestType {
private $submitterIdentifier;
private $originatingIdentifier;
private $submitterPassword;
private $submissionId;
private $timeout;
private $transactionType;
private $submittedAnsiVersion;
private $resultAnsiVersion;
private $submitterSubmissionId;
private $processingOption;
private $payload;
private $exceptions;
function SubmitRequestType() {
$this->submitterIdentifier = '***';
$this->originatingIdentifier = '***';
$this->submitterPassword = '**';
$this->submissionId = '**';
$this->timeout = 60 ;
$this->transactionType = "E";
$this->submittedAnsiVersion = '5010';
$this->resultAnsiVersion = '5010';
$this->submitterSubmissionId = '**';
$this->processingOption = 'R';
$this->payload = 'EDI-270-Request';
$this->exceptions = true;
}
}
$soapheader = new SecurityHeaderType();
$submitrequest = new SubmitRequestType();
$service = new \SoapClient($wsdl);
$result= $service->SubmitAnsiSingle($submitrequest);
echo "<pre/>";print_r($result);
$types = $service->__getTypes ();
$functions = $service->__getFunctions ();
//echo "<pre/>";print_r($types);
//echo "<pre/>";print_r($functions);
但我收到如下响应,似乎请求正在处理,但 SecurityHeaderType
没有解析它们的结尾。
stdClass Object
(
[transactionTyp] => E
[submitterSubmissionId] => ****
[submittedAnsiVersion] => 5010
[resultAnsiVersion] => 5010
[statusHeader] => stdClass Object
(
[statusCode] => 1150
[statusMessage] => com.navicure.webservices.core.WSCoreException: Account does not exist for ''
[requestProcessed] =>
)
)
任何提示将不胜感激
提前致谢。
您可能 运行 进入 PHP 的兼容 WSDL2 实现略有不足。您可以尝试以下方法并祈祷;
Headerbody 需要按照 xml 中定义的相同深度实现,因为我无法访问 navicure 的文档,这里是示例代码:
$headerbody = array('Token' => $someToken,
'Version' => $someVersion,
'UserCredentials'=>array('UserID'=>$UserID,
'Password'=>$Pwd));
//Create Soap Header.
$header = new SOAPHeader($namespace, 'RequestorCredentials', $headerbody);
// 如果需要多个 headers,创建 $headers[] = $header,并在 headers 之后追加。
$options = array(
'uri'=>'http://schemas.xmlsoap.org/soap/envelope/',
'style'=>SOAP_RPC,
'use'=>SOAP_ENCODED,
'soap_version'=>SOAP_1_1,
'cache_wsdl'=>WSDL_CACHE_NONE,
'connection_timeout'=>15,
'trace'=>true,
'encoding'=>'UTF-8',
'exceptions'=>true,
);
try {
$soap = new SoapClient($wsdl, $options);
$soap->__setSoapHeaders($header);
$data = $soap->SubmitAnsiSingle(array($submitrequest));
}
catch(Exception $e) {
die($e->getMessage());
}
希望这有用 - 如果实际使用了 WSDL2,您也许可以让它与可以在 sourceforge 上找到的 nusoap 一起工作。虽然好久没更新了..
我找到了解决办法!似乎 PHP -> .NET Web 服务可比性问题。所以从 PHP 复杂类型的 SOAP(这种格式)无法访问我发现了一些有用的 post here. So I switched SOAP to plain XML request with CURL and it seems working fine!. Also from WSDL link we can extract the request template using this online service 。
所以我的最终代码如下所示。
$xml_data = "<?xml version='1.0' encoding='UTF-8'?>
<s12:Envelope xmlns:s12='http://www.w3.org/2003/05/soap-envelope'>
<s12:Header>
<ns1:SecurityHeaderElement xmlns:ns1='http://www.navicure.com/2009/11/NavicureSubmissionService'>
<ns1:originatingIdentifier>****</ns1:originatingIdentifier>
<ns1:submitterIdentifier>****</ns1:submitterIdentifier>
<ns1:submitterPassword>***</ns1:submitterPassword>
<ns1:submissionId>?999?</ns1:submissionId>
</ns1:SecurityHeaderElement>
</s12:Header>
<s12:Body>
<ns1:SubmitAnsiSingleRequestElement xmlns:ns1='http://www.navicure.com/2009/11/NavicureSubmissionService'>
<ns1:timeout>60</ns1:timeout>
<ns1:transactionType>E</ns1:transactionType>
<ns1:submittedAnsiVersion>5010</ns1:submittedAnsiVersion>
<ns1:resultAnsiVersion>5010</ns1:resultAnsiVersion>
<ns1:submitterSubmissionId></ns1:submitterSubmissionId>
<ns1:processingOption>R</ns1:processingOption>
<ns1:payload>EDI270Payload</ns1:payload>
</ns1:SubmitAnsiSingleRequestElement>
</s12:Body>
</s12:Envelope>";
$URL = "https://ww3.navicure.com:7000/webservices/NavicureSubmissionService";
$ch = curl_init($URL);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "$xml_data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
print_r($output);
希望这对以后的其他人有所帮助。
我有一个网络服务 link
我正在尝试使用 SubmitRequestType
访问函数名称,但似乎该函数不存在 submitAnsiSingle
这是我到目前为止尝试的正确函数名称,
$wsdl = 'https://ww3.navicure.com:7000/webservices/NavicureSubmissionService?WSDL';
class SecurityHeaderType {
private $submitterIdentifier;
private $originatingIdentifier;
private $submitterPassword;
private $submissionId;
function SecurityHeaderType() {
$this->submitterIdentifier = '***';
$this->originatingIdentifier = '****';
$this->submitterPassword = '****';
$this->submissionId = '';
}
}
class SubmitRequestType {
private $submitterIdentifier;
private $originatingIdentifier;
private $submitterPassword;
private $submissionId;
private $timeout;
private $transactionType;
private $submittedAnsiVersion;
private $resultAnsiVersion;
private $submitterSubmissionId;
private $processingOption;
private $payload;
private $exceptions;
function SubmitRequestType() {
$this->submitterIdentifier = '***';
$this->originatingIdentifier = '***';
$this->submitterPassword = '**';
$this->submissionId = '**';
$this->timeout = 60 ;
$this->transactionType = "E";
$this->submittedAnsiVersion = '5010';
$this->resultAnsiVersion = '5010';
$this->submitterSubmissionId = '**';
$this->processingOption = 'R';
$this->payload = 'EDI-270-Request';
$this->exceptions = true;
}
}
$soapheader = new SecurityHeaderType();
$submitrequest = new SubmitRequestType();
$service = new \SoapClient($wsdl);
$result= $service->SubmitAnsiSingle($submitrequest);
echo "<pre/>";print_r($result);
$types = $service->__getTypes ();
$functions = $service->__getFunctions ();
//echo "<pre/>";print_r($types);
//echo "<pre/>";print_r($functions);
但我收到如下响应,似乎请求正在处理,但 SecurityHeaderType
没有解析它们的结尾。
stdClass Object
(
[transactionTyp] => E
[submitterSubmissionId] => ****
[submittedAnsiVersion] => 5010
[resultAnsiVersion] => 5010
[statusHeader] => stdClass Object
(
[statusCode] => 1150
[statusMessage] => com.navicure.webservices.core.WSCoreException: Account does not exist for ''
[requestProcessed] =>
)
)
任何提示将不胜感激
提前致谢。
您可能 运行 进入 PHP 的兼容 WSDL2 实现略有不足。您可以尝试以下方法并祈祷;
Headerbody 需要按照 xml 中定义的相同深度实现,因为我无法访问 navicure 的文档,这里是示例代码:
$headerbody = array('Token' => $someToken,
'Version' => $someVersion,
'UserCredentials'=>array('UserID'=>$UserID,
'Password'=>$Pwd));
//Create Soap Header.
$header = new SOAPHeader($namespace, 'RequestorCredentials', $headerbody);
// 如果需要多个 headers,创建 $headers[] = $header,并在 headers 之后追加。
$options = array(
'uri'=>'http://schemas.xmlsoap.org/soap/envelope/',
'style'=>SOAP_RPC,
'use'=>SOAP_ENCODED,
'soap_version'=>SOAP_1_1,
'cache_wsdl'=>WSDL_CACHE_NONE,
'connection_timeout'=>15,
'trace'=>true,
'encoding'=>'UTF-8',
'exceptions'=>true,
);
try {
$soap = new SoapClient($wsdl, $options);
$soap->__setSoapHeaders($header);
$data = $soap->SubmitAnsiSingle(array($submitrequest));
}
catch(Exception $e) {
die($e->getMessage());
}
希望这有用 - 如果实际使用了 WSDL2,您也许可以让它与可以在 sourceforge 上找到的 nusoap 一起工作。虽然好久没更新了..
我找到了解决办法!似乎 PHP -> .NET Web 服务可比性问题。所以从 PHP 复杂类型的 SOAP(这种格式)无法访问我发现了一些有用的 post here. So I switched SOAP to plain XML request with CURL and it seems working fine!. Also from WSDL link we can extract the request template using this online service 。 所以我的最终代码如下所示。
$xml_data = "<?xml version='1.0' encoding='UTF-8'?>
<s12:Envelope xmlns:s12='http://www.w3.org/2003/05/soap-envelope'>
<s12:Header>
<ns1:SecurityHeaderElement xmlns:ns1='http://www.navicure.com/2009/11/NavicureSubmissionService'>
<ns1:originatingIdentifier>****</ns1:originatingIdentifier>
<ns1:submitterIdentifier>****</ns1:submitterIdentifier>
<ns1:submitterPassword>***</ns1:submitterPassword>
<ns1:submissionId>?999?</ns1:submissionId>
</ns1:SecurityHeaderElement>
</s12:Header>
<s12:Body>
<ns1:SubmitAnsiSingleRequestElement xmlns:ns1='http://www.navicure.com/2009/11/NavicureSubmissionService'>
<ns1:timeout>60</ns1:timeout>
<ns1:transactionType>E</ns1:transactionType>
<ns1:submittedAnsiVersion>5010</ns1:submittedAnsiVersion>
<ns1:resultAnsiVersion>5010</ns1:resultAnsiVersion>
<ns1:submitterSubmissionId></ns1:submitterSubmissionId>
<ns1:processingOption>R</ns1:processingOption>
<ns1:payload>EDI270Payload</ns1:payload>
</ns1:SubmitAnsiSingleRequestElement>
</s12:Body>
</s12:Envelope>";
$URL = "https://ww3.navicure.com:7000/webservices/NavicureSubmissionService";
$ch = curl_init($URL);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "$xml_data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
print_r($output);
希望这对以后的其他人有所帮助。