«Uncaught SoapFault исключение: [WSDL] SOAP-ERROR: синтаксический анализ WSDL: не удалось загрузить» с использованием клиента ZEND SOAP - PullRequest
0 голосов
/ 17 октября 2018

У меня проблемы с доступом к службе SOAP.

Я использую библиотеку Zend и выполнил следующую функцию:

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

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

   echo " 
testing
"; echo(""); print_r($client->getOptions()); echo "
client
"; print_r($client); echo "
functions
"; print_r($client->getFunctions()); echo("
");}

Запрос возвращает мне следующий результат

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 для проверки подлинности. Я выполнил проверку подлинности, и он возвращает мне токен.

Функция аутентификации:

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>

Я заблудился в том, как я должен это сделать. Может ли кто-нибудь решить это?

1 Ответ

0 голосов
/ 18 октября 2018

Вы получаете ошибку на первом шаге процесса, который загружает ресурс WSDL.Эту проблему трудно отладить, но наиболее вероятные причины:

  • URL-адрес WSDL фактически недоступен
  • сервер использует недоверенный сертификат HTTPS

Попробуйте получить WSDL с wget или curl на том же сервере, например:

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

Для меня это возвращает ошибку:

SSL certificate problem: self signed certificate in certificate chain

Вы можете добавить это самостоятельноподписанный сертификат в хранилище доверенных сертификатов в вашей системе или отключите проверку SSL, установив правильный потоковый контекст на клиенте SOAP с помощью метода setStreamContext (я не знаю, какую версию клиента Zend Soap вы используете, поэтомувозможно, в вашем клиенте такого метода нет):

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

Конечно, решение с отключением проверки SSL не рекомендуется в производственной системе.Служба, к которой вы подключаетесь, должна использовать действительный доверенный сертификат, в настоящее время он бесплатный и его легко получить, например, от Let's Encrypt .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...