2011-02-12 76 views
3

我在發送安全wse頭文件以使用web服務時遇到了問題,並且已經嘗試了幾種從TargetProcess.com使用此webservice的方法,我不確定我在做什麼錯誤。在php5通過soap發送安全wse頭文件

(http://demo.tpondemand.com/Services/ProjectService.asmx?wsdl)

他們的示例使用一個非常老版本的NuSOAP的,但我試圖做到這一點使用PHP5內置SoapClient類外。

我被困在接收錯誤的請求錯誤或無法進行身份驗證。那麼我怎樣才能發送這些頭文件?

這是我迄今爲止,但不工作:

 $tp_header_part = ' 
     <wsa:Action> 
     http://targetprocess.com/RetrieveAll 
     </wsa:Action> 
     <wsa:MessageID> 
     urn:uuid:'.$this->getGuid().' 
     </wsa:MessageID> 
     <wsa:ReplyTo> 
     <wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address> 
     </wsa:ReplyTo> 
     <wsa:To>http://medios.tpondemand.com/Services/ProjectService.asmx</wsa:To> 
     <wsse:Security SOAP-ENV:mustUnderstand="1"> 
     <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
      wsu:Id="SecurityToken-'.$this->getGuid().'"> 
     <wsse:Username>MYUSERNAME</wsse:Username> 
     <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"> 
      MYPASSWORD 
     </wsse:Password> 
     </wsse:UsernameToken> 
     </wsse:Security>'; 


$soap_var_header = new SoapVar($tp_header_part, XSD_ANYXML, null, null, null); 

$soap_header = new SoapHeader('http://schemas.xmlsoap.org/ws/2003/06/secext', 'Security', $soap_var_header); 
$client->__setSoapHeaders($soap_header); 

P.S簡單地產生每它們的文檔該電源線一個GUID的getGuid功能。

任何想法?

+0

想知道你是否能夠得到這個工作?我正嘗試在PHP中連接.NET SOAP API,這是一場噩夢。 – 2012-08-13 13:48:02

回答

1

如果目標服務器是使用.NET/ASP編寫的,那麼獲取「完美」的XML請求可能非常繁瑣 - 例如,當使用名稱空間前綴時,必須在名稱空間中聲明名稱空間XML也是。

我可以在您的XML(wsa,wsse,SOAP-ENV)中看到幾個名稱空間示例,它們看起來並沒有被刪除 - 如果PHP SoapClient能夠自動填充它們,我會感到驚訝。通過啓動SoapHeader對象,您似乎完全聲明瞭唯一一個'wsse'='http://schemas.xmlsoap.org/ws/2003/06/secext'。

如果可能的話,在PHP和目標服務器之間放置一個數據包嗅探器(例如Fiddler2)以準確查看發送和接收的內容 - 這可以更容易地跟蹤錯誤並找出XML的原因被拒絕。

我建議2次修改您最初的代碼,這應該使 「有效的XML」:

  • WSA:行動 - 增加xmlns:wsa="<URL for definition of WSA>"
  • SOAPHEADER - 我不知道,但既然你已經把空間URI這裏可能需要包括對象的名稱命名空間前綴:

    $soap_header = new SoapHeader('http://schemas.xmlsoap.org/ws/2003/06/secext', 'wsse:Security', $soap_var_header); 
    

摩斯但重要的是要找到某種方式來獲得PHP客戶端和目標服務器之間的確切HTTP對話 - 並且如果您還可以通過一個工作示例來進行比較和對比,那通常會讓生活變得更容易!