2011-11-23 122 views
1

我正在嘗試使用zend 1.11.7將一個web服務調用到一個asp.net soap web服務。如何通過php Zend_Soap_Client將參數傳遞給soap方法?

的文檔指出我需要做以下格式的呼叫:

RequestCustomReport(CustomReportDef, SecurityCredential)

結構如下:

<securityCredentials> 
    <Key>string</Key> 
    <UserName>string</UserN 
    <Password>string</Passw 
</securityCredentials> 

<reportDefinition> 
    <CustomTemplateId>int</CustomTemplateId> 
    <StartDate>dateTime</StartDate> 
    <EndDate>dateTime</EndDate> 
    <PeriodId>int</PeriodId> 
    <SiteId>int</SiteId> 
    <ReportGUID>string</ReportGUID> 
    <ReportData>base64Binary</ReportData> 
    <ReportDataType>xml or csv or tsv or txt</ReportDataType> 
    <CompressReportData>boolean</CompressReportData> 
    <ReportStatus>Pending or Ready or Error or Deleted</ReportStatus> 
    <ErrorMessage>string</ErrorMessage> 
    </reportDefinition> 

我的zend代碼:

$client = new Zend_Soap_Client($ws_url); 

$reqFilter = array(); 
$reqFilter['CustomTemplateId'] = 33117; //33117 = report id 
//$reqFilter['StartDate'] = 
//$reqFilter[''] =''; 
$reqFilter['PeriodId'] = 4; //4 = last 7 days 
$reqFilter['SiteId'] =3672; 
$reqFilter['ReportDataType'] ='xml'; 
$reqFilter['CompressReportData'] =0; 

$reptXml=new XMLWriter(); 
$reptXml->openMemory(); 
$reptXml->startDocument('1.0','UTF-8'); 
$reptXml->startElement("reportDefinition"); 
    $reptXml->startElement("CustomTemplateId"); 
    $reptXml->text($reqFilter['CustomTemplateId']); 
    $reptXml->endElement();//CustomTemplateId 

    $reptXml->startElement("PeriodId"); 
    $reptXml->text($reqFilter['PeriodId']); 
    $reptXml->endElement();//PeriodId 

    $reptXml->startElement("SiteId"); 
    $reptXml->text((int)$reqFilter['SiteId']); 
    $reptXml->endElement();//SiteId 

    $reptXml->startElement("ReportDataType"); 
    $reptXml->text($reqFilter['ReportDataType']); 
    $reptXml->endElement();//ReportDataType 

    $reptXml->startElement("CompressReportData"); 
    $reptXml->text(0); 
    $reptXml->endElement();// CompressReportData 
$reptXml->endElement();//reportDefinition 

/* 
* securityCredentials xml 
*/ 
$secXml=new XMLWriter(); 
$secXml->openMemory(); 
$secXml->startDocument('1.0','UTF-8'); 
$secXml->startElement("securityCredentials"); 
    $secXml->startElement("Key"); 
    $secXml->text('----'); 
    $secXml->endElement(); 
    $secXml->startElement("UserName"); 
    $secXml->text('--.--'); 
    $secXml->endElement(); 
    $secXml->startElement("Password"); 
    $secXml->text('----'); 
    $secXml->endElement();  
$secXml->endElement(); 

$result = $client->RequestCustomReport($reptXml,$secXml); 

但我得到一個錯誤:

致命錯誤:未捕獲SoapFault異常:[soap:Sender]報告定義是必需參數,但未在C:\ wamp \ www \ libs \ Zend-1.11.10 \ Zend \ Soap \ Client.php中提供:1121堆棧跟蹤:#0 C:\ wamp \ www \ libs \ Zend-1.11.10 \ Zend \ Soap \ Client.php(1121):SoapClient - > __ soapCall('RequestCustomRe ...',Array,NULL,NULL,Array )#1 [內部函數]:Zend_Soap_Client - > __ call('RequestCustomRe ...',Array)#2 C:\ wamp \ www \ ProFound_test \ wsdl.php(109):Zend_Soap_Client-> RequestCustomReport(Object(XMLWriter),對象(XMLWriter))#3 {main}拋出C:\ wamp \ www \ libs \ Zend-1.11.10 \ Zend \ Soap \ Client.php on line 1121

看起來它並沒有認出我有通過報告定義參數作爲正確的節點名稱。

任何人都可以幫忙嗎?

回答

6

我和SOAP有類似的問題。顯然Zend_Soap_Client函數調用不接受變量作爲函數參數,而是包含鍵和參數函數調用值的數組。

所以:

$result = $client->RequestCustomReport($reptXml,$secXml); 

實際上應該是:

$result = $client->RequestCustomReport(array('xml' => $reptXml, 'key2' => $secXml)); 

我也不能肯定,如果你需要創建一個XML文件。也許只是按照原樣通過$reqFilter。我相信Zend_Soap_Client會爲你做轉換。

$client->setSoapVersion(SOAP_1_1); 
$result = $client->RequestCustomReport(array('startDate' => $startDate, 'endDate' => $endDate)); 

(請注意這是在函數調用數組)

您還可以檢查出的例子SOAP使用我使用zend_Soap_client寫道。 https://github.com/aporat/ACH-Direct-Payments-Gateway-PHP

+0

似乎已經做到了!我曾嘗試添加爲一個數組之前,但沒有把它作爲一個關聯數組,因爲它是缺少的「關鍵」:)我只需要找出下一個錯誤...另一個q! – thiswayup