2013-02-08 50 views
9

我正嘗試使用PHP的內置soap函數登錄到API。我得到了這樣的結果。soap:Envelope SOAP-ENV:Envelope PHP

[LoginResult]=> false, 
[ErrorMsg] => Login failed with the reason : The security object is invalid 

這是API提供者所要求的。

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<soap:Body> 
    <Login xmlns="http://tempuri.org/Example/Service1"> 
      <objSecurity> 
       <WebProviderLoginId>test</WebProviderLoginId> 
       <WebProviderPassword>test</WebProviderPassword> 
       <IsAgent>false</IsAgent> 
      </objSecurity> 
      <OutPut /> 
      <ErrorMsg /> 
    </Login> 
</soap:Body> 
</soap:Envelope> 

&,這裏是我能夠生產使用的功能。

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/Example/Service1"> 
<SOAP-ENV:Body> 
    <ns1:Login> 
     <objSecurity> 
      <WebProviderLoginId>test</WebProviderLoginId> 
      <WebProviderPassword>test</WebProviderPassword> 
      <IsAgent>false</IsAgent> 
     </objSecurity> 
     <OutPut/> 
     <ErrorMsg/> 
    </ns1:Login> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

這是我用來發送請求的代碼。

<?php 
class objSecurity { 
function objSecurity($s, $i, $f) { 
    $this->WebProviderLoginId = $s; 
    $this->WebProviderPassword = $i; 
    $this->IsAgent = $f; 
} 
} 

class nextObject { 
function nextObject($objSecurity) { 
    $this->objSecurity=$pobjSecurity; 
    $this->OutPut=NULL; 
    $this->ErrorMsg=NULL; 
} 
} 

$url = 'http://example.com/sampleapi/test.asmx?WSDL'; 
$client = new SoapClient($url, array("soap_version" => SOAP_1_1,"trace" => 1)); 
$struct = new objSecurity('test', 'test', false); 
$data = new nextObject($struct); 
$soapstruct2 = new SoapVar($data, SOAP_ENC_OBJECT); 
print_r(
    $client->__soapCall(
     "Login", 
     array(new SoapParam($soapstruct2, "inputStruct")) 
    ) 
); 

echo $client->__getLastRequest(); 

?> 

這些是我發現的差異。

在我的請求xmlns:xsi是缺失。

要求以<soap:Envelope開頭,但我的要求以<SOAP-ENV:Envelope開頭。

我的要求中還有一個額外的xmlns:ns1

&函數名稱標記以ns1:開頭。

請幫我按要求的格式提出我的要求。

我對SOAP的瞭解不多,我在CakePHP 2.3.0中使用PHP 5.3.13版本。對不起,我的英語不好。

+0

**我得到了我的答案**,但是,網站說,它可以在這裏張貼只有8小時後,等待... :( – KrIsHnA

+0

聽起來像你找到它了我不知道答案,但僅供參考,這兩個XML示例與體面的XML處理程序的觀點相當相似 – JLRishe

回答

11

這是解決方案。 :)

<?php 
$url = 'http://example.com/sampleapi/test.asmx?WSDL'; 
$client = new SoapClient($url, array("soap_version" => SOAP_1_1,"trace" => 1)); 

$user_param = array (
    'WebProviderLoginId' => "test", 
    'WebProviderPassword' => "test", 
    'IsAgent' => false 
); 

$service_param = array (
    'objSecurity' => $user_param, 
    "OutPut" => NULL, 
    "ErrorMsg" => NULL 
); 

print_r(
    $client->__soapCall(
     "Login", 
     array($service_param) 
    ) 
); 

echo $client->__getLastRequest(); 

?> 

&請求是:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/Example/Service1"> 
<SOAP-ENV:Body> 
    <ns1:Login> 
     <ns1:objSecurity> 
      <ns1:WebProviderLoginId>test</ns1:WebProviderLoginId> 
      <ns1:WebProviderPassword>test</ns1:WebProviderPassword> 
      <ns1:IsAgent>false</ns1:IsAgent> 
     </ns1:objSecurity> 
    </ns1:Login> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

多虧了這個鏈接。 PHP SOAP Request not right

+0

Great !!!您解決了您自己的問題,奉獻(y) – Krish