2


私は WSDL をサポートする SOAP Web サービスに取り組んでいます。WSDL ファイルはhttp://paygoo.com/soap/server.wsdl
にあります。

Web サービスには 3 つの機能があります。GetUserInfo、TransferFromWallet、および TransferToWallet。

関数 GetUserInfo は正常に動作するので、他の 2 つの関数をこのように設計しましたが、他の 2 つの関数 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、および amount を受け取りません。

編集:タグ
でパラメーターを定義しました。<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ます。は 1 つのパラメーターのみを受け取りますが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 に答える