"Uncaught SoapFault exception: [WSDL] SOAP-ERROR: WSDL parsing: Could not load" using ZEND SOAP client

"Uncaught SoapFault exception: [WSDL] SOAP-ERROR: WSDL parsing: Could not load" using ZEND SOAP client

我无法访问 SOAP 服务。

我正在使用 Zend 库,并执行了以下功能:

public function boletoApiBB() {
    //$token = $this->boletoApiBBOauth();

    $client = new ZendSoapClient("https://cobranca.homologa.bb.com.br:7101/Processos/Ws/RegistroCobrancaService.serviceagent?wsdl");

   echo " <br> testing <BR>";
   echo("<PRE>");
   print_r($client->getOptions());
   echo " <br> client <BR>";
   print_r($client);
   echo " <br> functions <BR>";
   print_r($client->getFunctions());
   echo("</PRE>");

}

请求返回以下结果

testing 
Array
(
    [encoding] => UTF-8
    [soap_version] => 2
    [wsdl] => https://cobranca.homologa.bb.com.br:7101/Processos/Ws/RegistroCobrancaService.serviceagent?wsdl
)

 client! 
Zend\Soap\Client Object
(
    [classmap:protected] => 
    [encoding:protected] => UTF-8
    [faultExceptions:protected] => Array
        (
        )

    [lastMethod:protected] => 
    [permanentSoapInputHeaders:protected] => Array
        (
        )

    [soapClient:protected] => 
    [soapInputHeaders:protected] => Array
        (
        )

    [soapOutputHeaders:protected] => Array
        (
        )

    [soapVersion:protected] => 2
    [typemap:protected] => 
    [wsdl:protected] => https://cobranca.homologa.bb.com.br:7101/Processos/Ws/RegistroCobrancaService.serviceagent?wsdl
    [keepAlive:protected] => 
    [sslMethod:protected] => 
    [connectionTimeout:protected] => 
    [localCert:protected] => 
    [location:protected] => 
    [login:protected] => 
    [passphrase:protected] => 
    [password:protected] => 
    [proxyHost:protected] => 
    [proxyLogin:protected] => 
    [proxyPassword:protected] => 
    [proxyPort:protected] => 
    [streamContext:protected] => 
    [style:protected] => 
    [uri:protected] => 
    [use:protected] => 
    [userAgent:protected] => 
    [cacheWsdl:protected] => 
    [compression:protected] => 
    [features:protected] => 
)

 functions 


Fatal error:  Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://cobranca.homologa.bb.com.br:7101/Processos/Ws/RegistroCobrancaService.serviceagent?wsdl' : failed to load external entity "https://cobranca.homologa.bb.com.br:7101/Processos/Ws/RegistroCobrancaService.serviceagent?wsdl"
 in /var/www/html/vendor/zendframework/zend-soap/src/Client/Common.php:33
Stack trace:
#0 /var/www/html/vendor/zendframework/zend-soap/src/Client/Common.php(33): SoapClient->SoapClient('https://cobranc...', Array)
#1 /var/www/html/vendor/zendframework/zend-soap/src/Client.php(1070): Zend\Soap\Client\Common->__construct(Array, 'https://cobranc...', Array)
#2 /var/www/html/vendor/zendframework/zend-soap/src/Client.php(1245): Zend\Soap\Client->initSoapClientObject()
#3 /var/www/html/vendor/zendframework/zend-soap/src/Client.php(1202): Zend\Soap\Client->getSoapClient()
#4 /var/www/html/global/controllers/boletoControllerGlobal.php(1319): Zend\Soap\Client->getFunctions()
#5 /var/www/html/global/System.php(207 in /var/www/html/vendor/zendframework/zend-soap/src/Client/Common.php on line 33

通过阅读SOAP服务文档,有一个OAUTH2服务器用于认证。我进行了身份验证,它 returns 给我一个令牌。

认证函数:

private function boletoApiBBOauth() {
        $client_id = "eyJpZCI6Ijg...";
        $secret_key = "eyJpZCI6IjBj...";
        $authorization = "Basic ".base64_encode($client_id.":".$secret_key);

        $client = new GuzzleHttp\Client();
        $response = $client->request('POST', 'https://oauth.hm.bb.com.br/oauth/token', 
            [
                'headers' => [
                    'authorization' => $authorization
                ],
                'form_params' => [
                    'grant_type' => "client_credentials",
                    'scope' => "cobranca.registro-boletos",
                ]
            ]
        );
        $body = $response->getBody();
        $resposta = json_decode($body, true);
        $token = $resposta["access_token"];
        return $token;
    }

我将身份验证请求发送到 URL

https://oauth.hm.bb.com.br/oauth/token。 使用令牌,我必须将必要的信息发送到 url

https://cobranca.homologa.bb.com.br:7101/registrarBoleto

遵循此模式:

Header

SOAPACTION: registrarBoleto

Authorization:Bearer 
aO2TXKd5Mhsg4zpAs3H7ze0YEgk5TdAMeGgIazrsq5TI8EDdAiSryGz/fcGfhMeGgINeLotO+ndhgHVYOsJx87
g==.9iFwrWb9cxwz8i5Jj+YgB+asAn7jJMeGgIHEFtWj4ES503/BUR2fRHNKREAUT22ysR9sMyEoC2FGx/s7B+
wG/P+L6rHxQiMiXAVzUcOj2h0P30QRCWhZwRhp5EulgfnE3Sm5JYal7cXAG3zIP6NehU5Cx5baeiGEbyO2yR
gzyeAiHQ81TTUqOrCxCcRi6XbafVQJdKkwwbecwV5Wggg1cNHz7dZgPXLZdUPm5FDWRIX2+PrRVPrDdC2fgf
oZl2MHunUL6lkaQ9Cg+oPA0Nj9XSKhMeGgIVG3bR8TXgQNkzn02Rl2wJMybEYZXe9yeIjt3PtB9wR/eLNlxZW
OYu8bbDOEvXJ2hz218co3q1KXA7uLhazDgvI8HR9eVpfu7jM39mGLmmwLb15YXpeSg5TVnyE6sdlt5iHdQhI
snucU7qs9ZzsTBcnZk/GZoGqcSdyFoFRIts4+XdgrpRfs9rycZxNG2oNKSdTG0ZDfwo6puBqZeLMZ15MHzx/Zb
x4urjJnVbcsbHoi2iEjch/nHHdpRSDLJmnQni3Ya24rt3HFqnTFQY5TsEL95w0jxLImRxHjb/PK1b5o9+ST/Dfj8k
MsWzaVZGbVqNkpJ7TVkGtbwQgf/kVS4OLrFM6XDJZLNViGtTzKYBIyuUoJahwBcncwRXkwngdcu23qSjbLM
AXcQxYMloZ/jgA3jLGU7Yn

 Content-Type: text/xml; charset=uft-8


Payload
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:sch="http://www.tibco.com/schemas/bws_registro_cbr/Recursos/XSD/Schema.xsd">
 <soapenv:Header/>
 <soapenv:Body>
<sch:requisicao>
 <sch:numeroConvenio>1014051</sch:numeroConvenio>
 <sch:numeroCarteira>17</sch:numeroCarteira>
 <sch:numeroVariacaoCarteira>19</sch:numeroVariacaoCarteira>
 <sch:codigoModalidadeTitulo>1</sch:codigoModalidadeTitulo>
 <sch:dataEmissaoTitulo>01.03.2017</sch:dataEmissaoTitulo>
 <sch:dataVencimentoTitulo>21.11.2017</sch:dataVencimentoTitulo>
 <sch:valorOriginalTitulo>30000</sch:valorOriginalTitulo>
 <sch:codigoTipoDesconto>1</sch:codigoTipoDesconto>
 <sch:dataDescontoTitulo>21.11.2016</sch:dataDescontoTitulo>
 <sch:percentualDescontoTitulo/>
<sch:valorDescontoTitulo>10</sch:valorDescontoTitulo>
 <sch:valorAbatimentoTitulo/>
 <sch:quantidadeDiaProtesto>0</sch:quantidadeDiaProtesto>
 <sch:codigoTipoJuroMora>0</sch:codigoTipoJuroMora>
 <sch:percentualJuroMoraTitulo></sch:percentualJuroMoraTitulo>
 <sch:valorJuroMoraTitulo></sch:valorJuroMoraTitulo>
 <sch:codigoTipoMulta>2</sch:codigoTipoMulta>
 <sch:dataMultaTitulo>22.11.2017</sch:dataMultaTitulo>
 <sch:percentualMultaTitulo>10</sch:percentualMultaTitulo>
 <sch:valorMultaTitulo></sch:valorMultaTitulo>
 <sch:codigoAceiteTitulo>N</sch:codigoAceiteTitulo>
 <sch:codigoTipoTitulo>2</sch:codigoTipoTitulo>
 <sch:textoDescricaoTipoTitulo>DUPLICATA</sch:textoDescricaoTipoTitulo>
 <sch:indicadorPermissaoRecebimentoParcial>N</sch:indicadorPermissaoRecebimentoParcial>
 <sch:textoNumeroTituloBeneficiario>987654321987654</sch:textoNumeroTituloBeneficiario>
 <sch:textoCampoUtilizacaoBeneficiario/>
 <sch:codigoTipoContaCaucao>1</sch:codigoTipoContaCaucao>
 <sch:textoNumeroTituloCliente>00010140510000000000</sch:textoNumeroTituloCliente>
 <sch:textoMensagemBloquetoOcorrencia>Pagamento disponível até a data de vencimento 
</sch:textoMensagemBloquetoOcorrencia>
 <sch:codigoTipoInscricaoPagador>2</sch:codigoTipoInscricaoPagador>
 <sch:numeroInscricaoPagador>73400584000166</sch:numeroInscricaoPagador>
 <sch:nomePagador>MERCADO ANDREAZA DE MACEDO</sch:nomePagador>
 <sch:textoEnderecoPagador>RUA SEM NOME</sch:textoEnderecoPagador>
 <sch:numeroCepPagador>12345678</sch:numeroCepPagador>
 <sch:nomeMunicipioPagador>BRASILIA</sch:nomeMunicipioPagador>
 <sch:nomeBairroPagador>SIA</sch:nomeBairroPagador>
 <sch:siglaUfPagador>DF</sch:siglaUfPagador>
 <sch:textoNumeroTelefonePagador>45619988</sch:textoNumeroTelefonePagador>
 <sch:codigoTipoInscricaoAvalista/>
 <sch:numeroInscricaoAvalista/>
 <sch:nomeAvalistaTitulo/>
 <sch:codigoChaveUsuario>1</sch:codigoChaveUsuario>
 <sch:codigoTipoCanalSolicitacao>5</sch:codigoTipoCanalSolicitacao>
 </sch:requisicao>
 </soapenv:Body>
</soapenv:Envelope>

我不知道该怎么做。 有人能解决吗?

您在该过程的第一步中遇到错误,即获取 WSDL 资源。很难调试此问题,但最可能的原因是:

  • WSDL url 实际上无法访问
  • 服务器使用不受信任的 HTTPS 证书

尝试在同一台服务器上使用 wgetcurl 获取 WSDL,例如:

curl -vvv "https://cobranca.homologa.bb.com.br:7101/Processos/Ws/RegistroCobrancaService.serviceagent?wsdl"

对我来说 returns 错误:

SSL certificate problem: self signed certificate in certificate chain

您可以将此自签名证书添加到您系统上的受信任证书存储中,或者通过使用 setStreamContext 方法在 SOAP 客户端上设置正确的流上下文来禁用 SSL 验证(我不知道是什么版本您正在使用的 Zend Soap 客户端,所以您的客户端中可能没有这样的方法):

$client->setStreamContext(
    stream_context_create(
        [
            'ssl' => [
                'verify_peer'       => false,
                'verify_peer_name'  => false,
                'allow_self_signed' => true,
            ],
        ]
    )
);

当然不建议在生产系统上使用禁用 SSL 验证的解决方案。您要连接的服务应该使用有效的可信证书,现在可以免费轻松地从 Let's Encrypt.

获得一个证书