2013-06-24 23 views
2


我正在使用WSDL支持的SOAP Web服務。
WSDL文件位於:http://paygoo.com/soap/server.wsdlSOAP請求參數不到達PHP函數

我的Web服務中有3個函數。 GetUserInfo,TransferFromWallet和TransferToWallet。

函數GetUserInfo工作正常,所以我設計了這樣的另外兩個函數,但另外兩個函數TransferFromWallet和TransferToWallet不會從客戶端收回參數。

功能GetUserInfo看起來是這樣的:

function GetUserInfo($sessionID) 
{ 
if (mysql_num_rows($result)==1){ 
     if (mysql_num_rows($result)==1) 
     { 
      $element->balance = new SoapVar($balance, XSD_DECIMAL, '','',''); 
      $element->currencyCode = new SoapVar("EUR", XSD_STRING, '','',''); 
      $element->displayName = new SoapVar($row['username'], XSD_STRING, '','',''); 
      $element->languageCode = new SoapVar("DE", XSD_STRING, '','',''); 
      $element->UID = new SoapVar($row['ID'], XSD_STRING, '','',''); 
      $element->responseCode = new SoapVar("OK", XSD_STRING, '','',''); 
      return new SoapVar($element, SOAP_ENC_OBJECT,''); 
     }else 
     { 
      $element->responseCode = new SoapVar("UNEXPECTED_ERROR", XSD_STRING, '','',''); 
      return new SoapVar($element, SOAP_ENC_OBJECT,''); 
     } 
    }else 
    { 
     $element->responseCode = new SoapVar("INVALID_SESSION", XSD_STRING, '','',''); 
     return new SoapVar($element, SOAP_ENC_OBJECT,''); 
    } 
} 

功能TransferFromWallet和TransferToWallet看起來是這樣的:

function TransferFromWallet($sessionID, $UID, $amount) 
{ 
     if (mysql_num_rows($result)==1){ 
      if ($row2['ID'] == $UID) 
      { 
       if($amount > 0 and $amount <= $balance) 
       { 
        $element->responseCode = new SoapVar("OK", XSD_STRING, '','',''); 
        return new SoapVar($element, SOAP_ENC_OBJECT,''); 
       }else 
       { 
        $element->responseCode = new SoapVar("BALANCE_TOO_LOW", XSD_STRING, '','',''); 
        return new SoapVar($element, SOAP_ENC_OBJECT,''); 
       } 
      }else 
      { 
       $element->responseCode = new SoapVar("INVALID_UID", XSD_STRING, '','',''); 
       return new SoapVar($element, SOAP_ENC_OBJECT,''); 
      } 
     }else 
     { 
      $element->responseCode = new SoapVar("INVALID_SESSION", XSD_STRING, '','',''); 
      return new SoapVar($element, SOAP_ENC_OBJECT,''); 
     } 
} 

我定義的所有功能,像這樣的服務器:

$server = new SoapServer("./soap/server.wsdl", 
array('uri' => "http://paygoo.com/server.php")); 
//Funktionen zum SOAP Server hinzufügen 
$server->addFunction('GetUserInfo'); 
$server->addFunction('TransferFromWallet'); 
$server->addFunction('TransferToWallet'); 
//Hier wird die Abfrage abgearbeitet 
$server->handle(); 

我的測試客戶端看起來像這樣:

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', TRUE); 
ini_set("soap.wsdl_cache_enabled", 0); 
$requesttype = $_REQUEST['soapRequest']; //Art des Requests Variable wird gesetzt. 
$sessionID = $_REQUEST['sessionID']; //session_id Variable wird gesetzt. 
$UID = $_REQUEST['UID']; //UserID Variable wird gesetzt 
$amount = $_REQUEST['balance']; //Zu transferierendes Guthaben Varialbe wird gesetzt 
//$client = new SoapClient('http://paygoo.com/soap/server.wsdl'); //{url} wie immer ersetzen 

//$sessionID = 'ae3a12e662884604c069b4dfc5a13afd'; 
$wsdl = 'http://paygoo.com/soap/server.wsdl'; 
$client = new SoapClient($wsdl); 
if($requesttype=="GetUserInfo") 
{ 
    //$parms = array('sessionID' => $sessionID); 
    $result = $client->GetUserInfo($sessionID); 
} 
if($requesttype=="TransferFromWallet"){ 
//$parms = array('sessionID' => $sessionID, 'UID' => $UID, 'amount' => $amount); 
$result = $client->TransferFromWallet($sessionID, $UID, $amount); 
} 

if($requesttype=="TransferToWallet"){ 
    //$parms = array('sessionID' => $sessionID, 'UID' => $UID, 'amount' => $amount); 
    $result = $client->TransferToWallet($sessionID, $UID, $amount); 
} 
?> 
<h1>Result</h1> 
<pre> <?php var_dump($result) ?> </pre> 

SOAP服務器不接收參數sessionID,UID和金額。

編輯:
我現在定義了<types>標籤中的參數。像這樣:

<wsdl:types> 
    <xsd:schema elementFormDefault='qualified' targetNamespace='http://paygoo.com/soap/server.wsdl'> 
     <xsd:element name='transferRequest'> 
      <xsd:complexType> 
       <xsd:sequence> 
        <xsd:element minOccurs='0' maxOccurs='1' name='sessionID' type='xsd:string'/> 
        <xsd:element minOccurs='0' maxOccurs='1' name='UID' type='xsd:string'/> 
        <xsd:element minOccurs='0' maxOccurs='1' name='amount' type='xsd:decimal'/> 
       </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
     <xsd:element name='transferResponse'> 
      <xsd:complexType> 
       <xsd:sequence> 
        <xsd:element minOccurs='0' maxOccurs='1' name='ResponseCode' type='xsd:string'/> 
       </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
    </xsd:schema> 
</wsdl:types> 

,如果我發這個請求:

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:xmethodsWallet"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <urn:TransferFromWallet soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
     <transferRequest> 
     <sessionID>c230f895fb98ab9159f51fd0297e236d</sessionID> 
     <UID>975</UID> 
     <amount>1</amount> 
     </transferRequest> 
     </urn:TransferFromWallet> 
    </soapenv:Body> 
</soapenv:Envelope> 

我的功能TransferFromWallet didnt recive任何參數。
如果我運行在客戶端__getFunctions__getTypes我得到如下回應:

Funktionen 

array(3) { 
    [0]=> 
    string(43) "string GetUserInfo(string $userinfoRequest)" 
    [1]=> 
    string(69) "transferResponse TransferFromWallet(transferRequest $transferRequest)" 
    [2]=> 
    string(67) "transferResponse TransferToWallet(transferRequest $transferRequest)" 
} 

Typen 

array(2) { 
    [0]=> 
    string(75) "struct transferRequest { 
string sessionID; 
string UID; 
decimal amount; 
}" 
    [1]=> 
    string(49) "struct transferResponse { 
string ResponseCode; 
}" 
} 

誰能告訴我爲什麼我不recive在函數的參數?

+0

不同於論壇的網站,我們不使用「謝謝」,或者「任何幫助表示讚賞」,或簽名上(因此)。請參閱「[應該'嗨','感謝',標語和祝福從帖子中刪除?](http://meta.stackexchange。COM /問題/ 2950 /應喜感謝,標語和 - 稱呼被移除從 - 個)。 –

+0

@John Saunders ...你在評論中提到的鏈接上給出的主要原因是沒有必要額外混亂,這樣人們就可以更容易地看到答案了嗎?也許羣衆應該考慮到,雖然他們可能是有效的陳述,但他們對於適當的問題,恰當的安全程序,不推薦的功能等等意見似乎總是有問題,儘管它們可能是有效的陳述,但它們大多數始終與這個問題無關。一致性人...一致性。 – Mattt

回答

0

我找到了我的問題的解決方案:
SOAP服務將對象傳輸到我的服務器。
我不得不讀這個對象是這樣的:

function TransferFromWallet($transferRequest) 
{ 
     $sessionID= $transferRequest->sessionID; 
     $UID = $transferRequest->UID; 
     $amount = $transferRequest->amount; 
       . 
       . 
       . 
} 
0

在WSDL,定義輸入參數的複雜類型:

<message name='TransferFromWalletRequest'> 
    <part name="parameters"> 
     <complexType> 
      <sequence> 
       <element name='sessionID' type='xsd:string'/> 
       <element name='UID' type='xsd:string'/> 
       <element name='amount' type='xsd:decimal'/> 
      </sequence> 
     </complexType> 
    </part> 
</message> 

執行相同的TransferToWallet。即使GetUserInfo只接受一個參數,但您應該給它與上述相同的處理方式,因爲您實際上沒有爲此指定參數,它只取第一個參數。

+0

更新: 昨天全部與合作。今天我試了一下,但是在SOAP響應中出現瞭如下錯誤: 「SOAP-ERROR:Parsing WSDL:意外的WSDL元素< complexType>」 爲什麼會出現該錯誤? –

+0

您的WSDL中有錯誤。似乎你有'&lt'而不是'<'。改變這一點。 – MrCode

+0

你可能會看看我的wsdl文件嗎?我們不知道這個錯誤可能是什麼......'<'不是我寫的全新的錯誤。 –