2013-01-24 110 views
6

我試圖將我們的軟件與SecureNet網關集成。他們有一個基於SOAP的API。與SecureNet支付網關集成

我遇到的問題是他們的WSDL文件確實不使用PHP工作。具體來說,他們的WSDL文件使用wsdl:import語句分割到多個文件中,導入位置爲http。在他們的測試服務器httphttps端口是開放的,所以PHP可以讀取WSDL文件。在他們的生產服務器上只有https已打開,但其位置塊仍然引用http,所以PHP超時!如果它是https它會正常工作。

他們的建議是拉從他們的測試服務器的WSDL文件,但覆蓋的位置。他們告訴我他們的測試服務器應該總是在運行,但我不願意依靠兩個系統來處理我們的事務。

另一種方法是用自己的XML API後...但是,隨着這個問題是你必須按照正確的順序來指定每個字段(需要與否)。最糟糕的部分是這個API的錯誤信息只是Unknown Error.,所以幾乎不可能找出我錯過的東西。

我需要一個第三個選項。如果我可以加載WSDL文件(可以在測試中,而不是在產品上),Soap運行良好。我認爲他們正在使用WCF,我相信這是一個.NET的東西。應該有一個「?simpleWSDL」和「?wsdl」選項,但在他們的WCF版本中沒有它。

這裏是他們的WSDL文件(測試服務器):https://certify.securenet.com/API/Gateway.svc?wsdl

編輯:

下面是可重複的代碼:

$client = new SoapClient("https://gateway.securenet.com/API/Gateway.svc?wsdl"); 
// Hangs and throws exception in construct 

回答

0

您可以從生產服務器拉WSDL和重寫編程方式使用SoapClient::__setLocation

+0

這設置終點。問題在於WSDL文件導入了其他幾個文件,導入URL以http://開頭。他們建議從他們的開發環境中提取WSDL並使用setLocation,但我不想依賴他們的開發環境。 – Luke

0

它聽起來更位置就像遠程WSDL文件中的錯誤,類似於通過SSL訪問包含非SSL資源的網站會導致警告。

幸運的是,看起來我們可以解決它。 The SoapClient Manual Page對用戶jjlopez發佈的端口號有類似的解決方法。

解決方法是將擴展基SoapClient的類來重寫這些URL,它將做出請求,像這樣:

class SecureSoapClient extends \SoapClient 
{ 
    protected $_scheme; 

    public function __construct($wsdl, $options) 
    { 
     $this->_scheme = parse_url($wsdl, PHP_URL_SCHEME); 
     return parent::__construct($wsdl, $options); 
    } 

    public function __doRequest($request, $location, $action, $version, $one_way = 0) { 
     $currentScheme = parse_url($location, PHP_URL_SCHEME); 
     $location = preg_replace('^' . $currentScheme, $this->_scheme, $location); 
     return parent::__doRequest($request, $location, $action, $version, $one_way); 
    } 
}