PHP Soap Сбой клиента в PHP версии 7, но работает в PHP 5.3 - PullRequest
0 голосов
/ 22 января 2020

У меня есть SOAP Клиент, работающий в PHP 7.2, например:

$wsdl = "http://ws4.altotrack.com/WSPosiciones_WalmartMX/WSPosiciones_WalmartMX.svc?wsdl";
$this->client = new SoapClient($wsdl, [
            'soap_version' => SOAP_1_1, 
            'exceptions' => 1, 
            'trace' => 1,
            'encoding'=>'UTF-8',            
        ]); 

// This is generated dynamically but with the expected format and it's ok
$xml_string = '<registro><systemUser>AltoWS</systemUser><password>$Alt0WS</password><movil><proveedor><registro><systemUser>...</systemUser><password>...</password><movil><proveedor>...</proveedor><dominio>...</dominio><nroSerie>...</nroSerie><codigo>...</codigo><latitud>...</latitud><longitud>...</longitud><altitud>...</altitud><velocidad>...</velocidad><rumbo>...</rumbo> <fechaHoraEvento>...</fechaHoraEvento><fechaHoraRecepcion>...</fechaHoraRecepcion></movil></registro>';

$soapvar     = new SoapVar($xml_string, XSD_STRING);
$xml_payload =  ['xmlSerializado' => $soapvar];

try {

    $result = $this->client->ProcessXML($xml_payload);
    dump($this->client->__getLastRequest());
    dump($this->client->__getLastRequestHeaders());
    //dump($this->client->__getLastResponse());
    //dump($this->client->__getLastResponseHeaders());

} catch (SoapFault $fault) {

    dump($fault);
}

Это SOAP Запрос конверта генерируется:


    <?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/">
      <SOAP-ENV:Body>
        <ns1:ProcessXML>
          <ns1:xmlSerializado>
            <registro>
              <systemUser>...</systemUser>
              <password>...</password>
              <movil>
                <proveedor>...</proveedor>
                <dominio>...</dominio>
                <nroSerie>...</nroSerie>
                <codigo>...</codigo>
                <latitud>...</latitud>
                <longitud>...</longitud>
                <altitud>...</altitud>
                <velocidad>...</velocidad>
                <rumbo>...</rumbo>
                <fechaHoraEvento>...</fechaHoraEvento>
                <fechaHoraRecepcion>...</fechaHoraRecepcion>
              </movil>
            </registro>
          </ns1:xmlSerializado>
        </ns1:ProcessXML>
      </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

Это заголовок запроса:

POST /WSPosiciones_WalmartMX/WSPosiciones_WalmartMX.svc HTTP/1.1
Host: ws4.altotrack.com
Connection: Keep-Alive
User-Agent: PHP-SOAP/7.2.19-0ubuntu0.18.10.1
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://tempuri.org/IServicePositions/ProcessXML

Результатом всегда является ошибка, а не SOAP Fault Exception, сам ответ должен быть в порядке, но я получаю ошибку:

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <ProcessXMLResponse xmlns="http://tempuri.org/">
      <ProcessXMLResult>Error</ProcessXMLResult>
    </ProcessXMLResponse>
  </s:Body>
</s:Envelope>

Я не знать, почему точно такой же код работает нормально в PHP 5.3.3, без изменений в алгоритме SOAP Client или xml, вывод запроса одинаков:

POST /WSPosiciones_WalmartMX/WSPosiciones_WalmartMX.svc HTTP/1.1
Host: ws4.altotrack.com
Connection: Keep-Alive
User-Agent: PHP-SOAP/5.3.3
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://tempuri.org/IServicePositions/ProcessXML

тот же запрос использование PHP 5.3 дает мне такой ответ:

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <ProcessXMLResponse xmlns="http://tempuri.org/">
      <ProcessXMLResult>Ok</ProcessXMLResult>
    </ProcessXMLResponse>
  </s:Body>
</s:Envelope>

Я не знаю почему, и я не знаю, как отладить это поведение, есть ли у кого-нибудь еще эта проблема?

Я пытался изменить контекст, используя другие опции в клиенте, с библиотекой Nu soap, используя вместо этого карту классов, но всегда получал сообщение об ошибке.


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

$options = [
    'soap_version' => SOAP_1_1,
    'exceptions' => 1,
    'trace' => 1,
    'encoding' =>'UTF-8',        
    'style' => SOAP_DOCUMENT,
    'use' => SOAP_LITERAL,
    'stream_context' => $context
];

Я не уверен, связано ли это с PHP или здесь происходит что-то еще, но забавный факт, что он работал до последнего PHP обновлять как неделю go или около того.

Upgrade: 
....
php7.2-xmlrpc:amd64 (7.2.24-0ubuntu0.18.04.1, 7.2.24-0ubuntu0.18.04.2), 
php7.2-soap:amd64 (7.2.24-0ubuntu0.18.04.1, 7.2.24-0ubuntu0.18.04.2)
End-Date: 2020-01-16  00:27:23

Любая помощь будет оценена.

...