2


我正在开发一个支持 WSDL 的 SOAP Web 服务。
WSDL 文件位于:http: //paygoo.com/soap/server.wsdl

我的 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没有接收任何参数。
如果我在客户端上运行__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;
}"
}

谁能告诉我为什么我不接收函数中的参数?

4

2 回答 2

0

在 WSDL 中,将输入参数定义为 complexType:

<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只接受一个参数,你也应该给它与上面相同的处理,因为你实际上没有一个命名参数,它只是采用第一个参数。

于 2013-06-24T16:40:30.807 回答
0

我找到了解决问题的方法:
SOAP 服务将对象传输到我的服务器。
我不得不像这样阅读这个对象:

function TransferFromWallet($transferRequest)
{
        $sessionID= $transferRequest->sessionID;
        $UID = $transferRequest->UID;
        $amount = $transferRequest->amount;
                .
                .
                .
}
于 2013-07-09T11:24:00.553 回答