Making SOAP-call in PHP and setting SSL version

后端 未结 6 2054
慢半拍i
慢半拍i 2021-02-07 16:31

I\'ve made several scripts working with external WSDL. I have encountered one I have to integrate into our system that I can\'t get to work. I\'be been trying for a week without

相关标签:
6条回答
  • 2021-02-07 16:41

    As of PHP 5.5.0, I believe you can do

    $client = new SoapClient("https://webtjener09.kred.no/TestWebservice/OppdragServiceSoapHttpPort?WSDL", array(
        'ssl_method' => SOAP_SSL_METHOD_SSLv3
    ));
    
    0 讨论(0)
  • 2021-02-07 16:41

    Instead of creating a wrapper, can you try to add the following code fragments?

    $stream_opts = array(
    //      'ssl'=>array('ciphers'=>"3DES" // also working
    //      further ciphers on http://www.openssl.org/docs/apps/ciphers.html
            'ssl'=>array('ciphers'=>"SHA1"
          )
    );
    
    $myStreamContext = stream_context_create($stream_opts);
    $soapOptions['stream_context'] = $myStreamContext;
    $soapClient = new SoapAuthClient("https://...", $soapOptions);
    

    Good luck!

    0 讨论(0)
  • 2021-02-07 16:47

    Be careful if you use utf-8 charset.
    This solution works well, but you must declare the charset in header Curl.

    curl_setopt($handle, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml; charset = utf-8", 'SOAPAction: "' . $action . '"')
    
    0 讨论(0)
  • 2021-02-07 16:52

    I had the same problem, the following wrapper solved it (i had to force SSL2)

    class StupidWrapperForOracleServer extends SoapClient {
      protected function callCurl($url, $data, $action) {
         $handle   = curl_init();
         curl_setopt($handle, CURLOPT_URL, $url);
         curl_setopt($handle, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml", 'SOAPAction: "' . $action . '"'));
         curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
         curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
         curl_setopt($handle, CURLOPT_SSLVERSION, 2);
         $response = curl_exec($handle);
         if (empty($response)) {
           throw new SoapFault('CURL error: '.curl_error($handle),curl_errno($handle));
         }
         curl_close($handle);
         return $response;
       }
    
       public function __doRequest($request,$location,$action,$version,$one_way = 0) {
           return $this->callCurl($location, $request, $action);
       }
     }
    

    Btw. if it fails at the downloading the WSDL file part, then download the WSDL manually (with curl for example), and use that file locally. IMHO __doRequest is not called while in the WSDL downloading stage.

    file_put_contents(dirname(__FILE__) .'/Server.wsdl',get_wsdl()); //get_wsdl uses the same wrapper as above
    $oWS = new StupidWrapperForOracleServer(dirname(__FILE__) .'/Server.wsdl',array('trace'=>1,'cache_wsdl'=>0));
    
    0 讨论(0)
  • 2021-02-07 16:52

    Try 'sslv3://webtjener09....' or use a wrapper class where you can set the required cURL option.

    0 讨论(0)
  • 2021-02-07 16:57

    If you are using Oracle Weblogic 11g to host your web services under SSL, make sure you are using the JSSE-Based SSL Implementation.

    Log into the Weblogic Console, and go to Server->(your server)->Configuration->SSL->Advanced and check the Use JSSE SSL check box.

    More information can be found in the Weblogic Manuals

    0 讨论(0)
提交回复
热议问题