我想使用zend_soap_客户端调用webservice。这是相关代码:
$params = new stdClass();
$params->transactionId = $transactionId;
$params->transactionState = $transactionState;
$params->details = $transactionDetails;
var_dump($params->details);
try {
$this->_soapClient->updateTransaction($params);
}
问题在于
details
参数,它是wsdl中的复杂类型。$transactionDetails
包含具有复杂类型(非空)元素的数组,这在var_dump()
中可见。以前,我尝试使用一个php类,将元素作为属性。在这两种情况下,soap客户端实际发送的是:<SOAP-ENV:Body>
<ns1:UpdateTransactionRequest>
<transactionId>45</transactionId>
<transactionState>SUCCESS</transactionState>
<details/>
</ns1:UpdateTransactionRequest>
</SOAP-ENV:Body>
我做错什么了?
update:我认为问题的原因是为参数声明的complexType是一个基类型,wsdl中有几个扩展类型,我想使用其中一个扩展类型。我猜zend_soap_client不识别基类型中不存在的任何元素,这就是所有元素。有办法解决这个问题吗?
最佳答案
解决方案在于标准的php soap客户端,zend_soap_客户端对其进行了扩展。SoapVar
类允许包装参数并指定要使用的实际类型。我要做的是返回到使用一个php类来$transactionDetails
和以下代码:
$params->details = new SoapVar($transactionDetails,
SOAP_ENC_OBJECT, get_class($transactionDetails), $namespace);