2014-09-25 88 views
0

我正在使用soap客户端连接到wsdl服务。肥皂客户端使用自定义身份验证模式,我将它们添加到http通过以下代码PHP soapclient使用代理与身份验证和自定义http标头

$client=new SoapClient(
     $wsdl, 
     array(
      'trace' => 1, 
      "stream_context" => stream_context_create(
       array(
        "http"=>array(
            "header"=> "username: xmluatbank\r\n". 
               "password: 123456\r\n" 
           ) 
        ) 
      ) 
); 

并且标头如下所示。

POST /myweb/Proxy HTTP/1.1 
Host: uat.myweb.com:8080 
Connection: Keep-Alive 
User-Agent: PHP-SOAP/5.4.19 
Content-Type: text/xml; charset=utf-8 
SOAPAction: "" 
Content-Length: 1086 
username: xmluatbank 
password: 123456 

到目前为止,直到这里一切都很好,然后来到新的请求需要通过代理服务器连接,所以我改变了代码follwing:

$client=new SoapClient(
     $wsdl, 
     array(
      'trace' => 1, 
      "stream_context" => stream_context_create(
       array(
        "http"=>array(
            "header"=> "username: xmluatbank\r\n". 
               "password: 123456\r\n" 
           ) 
        ), 
      'proxy_host' => $proxy, 
      'proxy_port' => $proxyport, 
      'proxy_login' => $proxyusrname, 
      'proxy_password' => $proxypwd, 
      ) 
); 

和标题变成这个样子:

POST http://uat.myweb.com:8080/ctos/Proxy HTTP/1.1 
Host: uat.myweb.com:8080 
Connection: Keep-Alive 
User-Agent: PHP-SOAP/5.3.9-ZS5.6.0 
Content-Type: text/xml; charset=utf-8 
SOAPAction: "" 
Content-Length: 1086 
Proxy-Authorization: Basic YWdyb2JhbmtcanVyaXMudnRjbDpBYmNkMTIx== 

因为您可以看到我现在拥有的流上下文已经消失,所以现在我得到了wsdl服务器的认证错误。看起来像代理覆盖HTTP标头。所以我试图代理添加到HTTP头,而不是使用SOAP代理

$sLogin = base64_encode("$proxyusername:$proxypwd"); 
$aHTTP['http']['proxy']   = "$proxy:$proxyprot"; 
$aHTTP['http']['method']   = 'POST'; 
$aHTTP['http']['header']   = "User-Agent: My PHP Script\r\n"; 
$aHTTP['http']['header']   .= "Proxy-Authorization: Basic $sLogin"; 
$aHTTP['http']['header']   .= "username: xmluatbank\r\n"."password: 1234567\r\n"; 
$context = stream_context_create($aHTTP); 

并称为SOAP客户端这样的:

$client=new SoapClient(
     $wsdl, 
     array(
      'trace' => 1, 
      "stream_context" => $context 
      ) 
); 

但这样一来我得到肥皂错误,无法连接到代理。

SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://uat.myweb.com:8080/ctos/Proxy?wsdl' : failed to load external entity "http://uat.myweb.com:8080/myweb/Proxy?wsdl" 

我不知道如何解决这个问题。我尝试了所有我知道,请大家帮忙

+0

什么是对旧版本的PHP '$ proxy'的价值?使用卷曲或类似方法时,你能获得wsdl吗?示例'curl -X POST --proxy'http:// proxyuser:proxypass @ proxyaddr:proxyport'-H'用户名:xmluatbank'-H'密码:123456''http://uat.myweb.com:8080/myweb/Proxy?wsdl'' – piotrekkr 2014-09-25 10:43:34

+0

不幸的是,银行正在使用Windows服务器 – 2014-09-25 12:21:19

+0

您可以像这里描述的那样使用vbscript/powershell http://stackoverflow.com/questions/2710748/run-curl-commands-from-windows-console – piotrekkr 2014-09-25 12:57:31

回答

1

我用下面的代码解决了这个问题,感谢我们的同事之一,看起来像问题是与服务器

if (PHP_VERSION <5.4) { 
    echo "old_version"; 
    $str_auth_header = "username: xmluatbank\r\n". 
          "password: 123456"; 
    ini_set('user_agent', 'PHP-SOAP/' . PHP_VERSION . "\r\n" . $str_auth_header); 
} 
+2

最好是使用'if(version_compare(PHP_VERSION,'5.4')<0){...}' – piotrekkr 2014-09-25 12:54:38