PHP soapclient使用带有身份验证的代理和自定义http头

PHP soapclient使用带有身份验证的代理和自定义http头,php,soap,proxy,wsdl,soap-client,Php,Soap,Proxy,Wsdl,Soap Client,我正在使用soap客户端连接到wsdl服务。soap客户机使用自定义身份验证模式,我通过以下代码将其添加到http $client=new SoapClient( $wsdl, array( 'trace' => 1, "stream_context" => stream_context_create( array( "http"=&

我正在使用soap客户端连接到wsdl服务。soap客户机使用自定义身份验证模式,我通过以下代码将其添加到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
到目前为止,一切都很好,然后出现了需要通过代理连接的新请求,因此我将代码更改为:

$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错误,无法连接到代理

 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"

我不知道如何解决这个问题。我尝试了我所知道的一切,请帮助

我通过以下代码解决了这个问题,感谢我们的一位同事,看起来问题是服务器上旧版本的php

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);
} 

if(PHP_VERSION)
$proxy
的值是什么?使用curl或类似工具时,您能获得wsdl吗?示例
curl-X POST--proxy'http://proxyuser:proxypass@proxyaddr:proxyport'-H'用户名:xmluaBank'-H'密码:123456''http://uat.myweb.com:8080/myweb/Proxy?wsdl“
不幸的是,银行正在使用windows服务器。您可以使用vbscript/power如本文所述,最好使用
if(version\u compare(PHP\u version,'5.4')<0{…}